|
1 | | -# `make help` for documentation. |
2 | | - |
| 1 | +-include $(shell git rev-parse --show-toplevel)/Makefile_params |
3 | 2 | -include Makefile_params |
4 | 3 |
|
5 | | -# C/CPP |
6 | | -# Don't use the standard names like `CC` and `CXX` to avoid `?=` getting overridden. |
7 | | -# by the Makefile default values. |
8 | | -ALL_DEPEND ?= |
9 | | -MYCC ?= gcc |
10 | | -MYCXX ?= g++ |
11 | | -G ?= gdb3 |
12 | | -I ?= #-I/usr/include |
13 | | -O ?= 0 |
14 | | -STD ?= c11 |
15 | | -PEDANTIC ?= -pedantic-errors |
16 | | -CFLAGS ?= -g$(G) -march=native -O$(O) -pthread -std=$(STD) -Wall -Wextra $(PEDANTIC) $(CFLAGS_EXTRA) #-pg |
17 | | -MYCXXFLAGS ?= -g$(G) -march=native -O$(O) -pthread -std=c++17 -Wall -Wextra $(PEDANTIC) $(CXXFLAGS_EXTRA) #-pg |
18 | | - |
19 | | -LIBS ?= -lm -lrt $(LIBS_EXTRA) #-lGL -lGLU -lglut |
20 | | - |
21 | | -# Fortran |
22 | | -FF ?= gfortran |
23 | | -FFLIBS ?= #-l:lapack/liblapack.so |
24 | | -FFLAGS ?= -O$(O) -std=f2003 -Wextra $(PEDANTIC) $(FFLAGS_EXTRA) |
25 | | - |
26 | | -# Paths |
27 | | -IN_DIR ?= ./ |
28 | | -IN_EXTS ?= .c .cpp .f |
29 | | -# Unlike in Makefile_one, there is no TMP_DIR because there are no .o files generated. |
30 | | -OUT_DIR ?= ./ |
31 | | -OUT_EXT ?= .out |
32 | | -OBJECT_EXT ?= .o |
33 | | -TMP_EXT ?= .tmp |
34 | | -TMP_PREF ?= tmp. |
35 | | - |
36 | | -# Basename without extension of file to run on run target. |
37 | | -RUN ?= main |
38 | | -# If exists, will be symlinked into the same directory from which the executable will be run. |
39 | | -# This way, the executable can suppose that this file or directory is in the current directory. |
40 | | -RUN_INPUT ?= input |
41 | | -TEST ?= test |
42 | | - |
43 | | -ASSEMBLER_NOEXT ?= $(IN_DIR)$(RUN) |
44 | | - |
45 | | -RUN_BNAME := $(RUN)$(OUT_EXT) |
46 | | - |
47 | | -INS := $(foreach IN_EXT, $(IN_EXTS), $(wildcard $(IN_DIR)*$(IN_EXT))) |
48 | | -INS_NODIR := $(notdir $(INS)) |
49 | | -OUTS_NODIR_NOEXT := $(basename $(INS_NODIR)) |
50 | | -OUTS_NOEXT := $(addprefix $(OUT_DIR), $(OUTS_NODIR_NOEXT)) |
51 | | -OUTS := $(addsuffix $(OUT_EXT), $(OUTS_NOEXT)) |
52 | | - |
53 | | -.PHONY: all asm clean debug help mkdir objdump set_objdump_flags profile set_profile_flags test $(PHONY) |
| 4 | +OUTS = $(addsuffix $(OUT_EXT), $(OBJS_NOEXT)) |
54 | 5 |
|
55 | 6 | all: mkdir $(OUTS) |
56 | | - @#TODO ignore errors if not present |
57 | | - @if [ -e "$(RUN_INPUT)" ] && [ ! -e "$(OUT_DIR)$(RUN_INPUT)" ]; then ln -s ../$(RUN_INPUT) "$(OUT_DIR)$(RUN_INPUT)"; fi |
58 | | -ifneq ($(strip $(run)),) |
59 | | - @echo |
60 | | - cd $(OUT_DIR) && ./"$(run)" |
61 | | -endif |
62 | | - |
63 | | -$(OUT_DIR)%$(OUT_EXT): $(IN_DIR)%.c $(ALL_DEPEND) |
64 | | - $(MYCC) $(CFLAGS) $(PROFILE_DEFINE) $(PROFILE_FLAGS) $(I) -o "$@" "$<" $(LIBS) |
65 | 7 |
|
66 | | -$(OUT_DIR)%$(OUT_EXT): $(IN_DIR)%.cpp $(ALL_DEPEND) |
67 | | - $(MYCXX) $(MYCXXFLAGS) $(PROFILE_DEFINE) $(PROFILE_FLAGS) $(I) -o "$@" "$<" $(LIBS) |
| 8 | +$(OUT_DIR)%$(OUT_EXT): $(IN_DIR)%$(CC_EXT) $(ALL_DEPEND) |
| 9 | + $(CC) $(CFLAGS) -o '$@' '$<' $(LIBS) |
68 | 10 |
|
69 | | -$(OUT_DIR)%$(OUT_EXT): $(IN_DIR)%.f $(ALL_DEPEND) |
70 | | - $(FF) $(FFLAGS) $(PROFILE_DEFINE) $(PROFILE_FLAGS) -o "$@" "$<" $(FFLIBS) |
| 11 | +$(OUT_DIR)%$(OUT_EXT): $(IN_DIR)%$(CXX_EXT) $(ALL_DEPEND) |
| 12 | + $(CXX) $(CXXFLAGS) -o '$@' '$<' $(LIBS) |
71 | 13 |
|
72 | | -# Make assembly intermingled with original C code to stdout> |
73 | | -# TODO0: how not to rewrite the make rules? |
74 | | -# For bare asm: $(MYCC) $(PROFILE_DEFINE) $(PROFILE_FLAGS) $(CFLAGS) -fverbose-asm -S "$(ASSEMBLER_NOEXT)$$EXT" |
75 | | -asm: mkdir set_asm_flags |
76 | | - for EXT in $(IN_EXTS); do \ |
77 | | - if [ -f "$(ASSEMBLER_NOEXT)$$EXT" ]; then \ |
78 | | - case "$$EXT" in \ |
79 | | - .c)\ |
80 | | - $(MYCC) $(PROFILE_DEFINE) $(PROFILE_FLAGS) $(CFLAGS) -c -fverbose-asm -Wa,-adhln "$(ASSEMBLER_NOEXT)$$EXT" $(LIBS) -o $(OUT_DIR)asm.o\ |
81 | | - ;;\ |
82 | | - .cpp)\ |
83 | | - $(MYCXX) $(MYCXXFLAGS) $(PROFILE_DEFINE) $(PROFILE_FLAGS) -c -fverbose-asm -Wa,-adhln "$(ASSEMBLER_NOEXT)$$EXT" $(LIBS)\ |
84 | | - ;;\ |
85 | | - .f)\ |
86 | | - ;;\ |
87 | | - esac;\ |
88 | | - break;\ |
89 | | - fi;\ |
90 | | - done |
91 | | - |
92 | | -clean: |
93 | | - if [ ! '$(OUT_DIR)' = './' ]; then \ |
94 | | - rm -rf '$(OUT_DIR)' ;\ |
95 | | - else \ |
96 | | - rm -rf *'$(OBJECT_EXT)' *'$(OUT_EXT)' *'$(TMP_EXT)' '$(TMP_PREF)'* callgrind.out.* ;\ |
97 | | - fi |
98 | | - if [ -x 'clean' ]; then ./clean; fi |
99 | | - |
100 | | -debug: clean set_debug_flags all |
101 | | - cd $(OUT_DIR) && gdb "$(RUN_BNAME)" |
102 | | - |
103 | | -mkdir: |
104 | | - @mkdir -p "$(OUT_DIR)" |
105 | | - |
106 | | -objdump: mkdir set_objdump_flags all |
107 | | - cd '$(OUT_DIR)' && objdump -CSr '$(RUN_BNAME)' |
108 | | - |
109 | | -profile: clean set_profile_flags all run |
110 | | - cd '$(OUT_DIR)' && gprof -b '$(RUN_BNAME)' gmon.out | tee "$(RUN_BNAME).profile_out" | less |
111 | | - |
112 | | -run: all |
113 | | - cd $(OUT_DIR) && ./$(RUN_BNAME) |
114 | | - |
115 | | -time: all |
116 | | - cd $(OUT_DIR) && time -p ./$(RUN_BNAME) |
117 | | - |
118 | | -set_profile_flags: |
119 | | - $(eval PROFILE_FLAGS := -p -pg) |
120 | | - $(eval PROFILE_DEFINE := -DPROFILE) |
121 | | - |
122 | | -test: all |
123 | | - @\ |
124 | | - if [ -x $(TEST) ]; then \ |
125 | | - ./$(TEST) '$(OUT_EXT)' ;\ |
126 | | - else\ |
127 | | - fail=false ;\ |
128 | | - for t in *"$(OUT_EXT)"; do\ |
129 | | - if ! ./"$$t"; then \ |
130 | | - fail=true ;\ |
131 | | - break ;\ |
132 | | - fi ;\ |
133 | | - done ;\ |
134 | | - if $$fail; then \ |
135 | | - echo "TEST FAILED: $$t" ;\ |
136 | | - exit 1 ;\ |
137 | | - else \ |
138 | | - echo 'ALL TESTS PASSED' ;\ |
139 | | - exit 0 ;\ |
140 | | - fi ;\ |
141 | | - fi ;\ |
| 14 | +$(OUT_DIR)%$(OUT_EXT): $(IN_DIR)%$(FF_EXT) $(ALL_DEPEND) |
| 15 | + $(FF) $(FFLAGS) -o '$@' '$<' $(FFLIBS) |
142 | 16 |
|
| 17 | +-include $(shell git rev-parse --show-toplevel)/Makefile_targets |
143 | 18 | -include Makefile_targets |
144 | | - |
145 | | -help: |
146 | | - @echo 'Compiles C files with GCC, and C++ files with g++, Fortran files with gfortran one by one separatelly.' |
147 | | - @echo '' |
148 | | - @echo 'Executables have the same name without extension as the file that originated it:' |
149 | | - @echo '' |
150 | | - @echo ' c.c -> c' |
151 | | - @echo ' cpp.c -> cpp' |
152 | | - @echo ' fortran.f -> fortran' |
153 | | - @echo '' |
154 | | - @echo 'Therefore dont use files with the same basename without extension: e.g. `main.c` and `main.cpp`.' |
155 | | - @echo '' |
156 | | - @echo '# Most useful invocations' |
157 | | - @echo '' |
158 | | - @echo 'Build all:' |
159 | | - @echo '' |
160 | | - @echo ' make' |
161 | | - @echo '' |
162 | | - @echo 'Build and run output with the default basename:' |
163 | | - @echo '' |
164 | | - @echo ' make run' |
165 | | - @echo '' |
166 | | - @echo 'Build and run output with given basename:' |
167 | | - @echo '' |
168 | | - @echo ' make run=c' |
169 | | - @echo '' |
170 | | - @echo 'The `=` sign is *not* optional.' |
171 | | - @echo '' |
172 | | - @echo '# Targets' |
173 | | - @echo '' |
174 | | - @echo 'all ................. Build all.' |
175 | | - @echo 'asm [RUN=name] ...... Print generated assembly code for the file with given basename without extension.' |
176 | | - @echo 'clean ............... Clean built files.' |
177 | | - @echo 'debug ............... Run with `gdb`.' |
178 | | - @echo 'help ................ Print help to stdout.' |
179 | | - @echo 'profile ............. Run with `gprof`.' |
180 | | - @echo 'run[=name] .......... Run a file with the given basename withotu extension or the default not given.' |
181 | | - @echo 'test ................ Run `./test <output-directory> <output-basename> ...`' |
0 commit comments