|
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