Skip to content

Commit 916088e

Browse files
committed
make: simplify, make one works well
cpp: inline variables
1 parent 6893a04 commit 916088e

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+336
-476
lines changed

Makefile_many

Lines changed: 9 additions & 172 deletions
Original file line numberDiff line numberDiff line change
@@ -1,181 +1,18 @@
1-
# `make help` for documentation.
2-
1+
-include $(shell git rev-parse --show-toplevel)/Makefile_params
32
-include Makefile_params
43

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))
545

556
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)
657

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)
6810

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)
7113

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)
14216

17+
-include $(shell git rev-parse --show-toplevel)/Makefile_targets
14318
-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> ...`'

Makefile_one

Lines changed: 23 additions & 124 deletions
Original file line numberDiff line numberDiff line change
@@ -1,133 +1,32 @@
1-
# `make help` for documentation.
2-
1+
-include $(shell git rev-parse --show-toplevel)/Makefile_params
32
-include Makefile_params
43

5-
DEBUG_DEFINE ?=
6-
DEBUG_FLAGS ?=
7-
# For -DDEBUG and -DPROFILE, used dedicated DEFINES, as these must be modified
8-
# separatedly for certain targets.
9-
DEFINES ?= #-DPOSIX
10-
# Extension of the input to be compiled.
11-
IN_EXT ?= .cpp
12-
# Directory where compilation input files (e.g. `.c` or `.cpp`) are found.
13-
IN_DIR ?= ./
14-
# Fortran compiler.
15-
FF ?= gfortran
16-
INCLUDE_DIRS ?= #-L/usr/include/GL
17-
LIBS ?= #-lglut -lGLU -lGL
18-
MYCC ?= gcc
19-
STD ?= c11
20-
MYCFLAGS ?= -std=$(STD) -Wall -pedantic-errors -march=native $(CFLAGS_EXTRA)
21-
MYCXX ?= g++
22-
MYCXXFLAGS ?= -std=c++11 -Wall -pedantic-errors -march=native $(CXXFLAGS_EXTRA)
23-
# Should be turned on for production.
24-
# For development leave off to compile faster and produce more predictable assembly code.
25-
OBJ_EXT ?= .o
26-
OPTIMIZE_FLAGS ?= #-O3
27-
# Directory where compiled outputs will be put.
28-
OUT_DIR ?= ./
29-
OUT_BASENAME_NOEXT ?= main
30-
OUT_EXT ?= .out
31-
RUN ?= $(OUT_BASENAME_NOEXT)
32-
# If this file or directory exists, it will be symlinked into the same directory
33-
# from which the executable will be run. This way, the executable can suppose this is in the current directory.
34-
RUN_INPUT ?= input
35-
PROFILE_DEFINE ?=
36-
PROFILE_FLAGS ?=
37-
PREDEF ?= #-DDEBUG -DPROFILE -DWINDOWS
38-
# Passed as command line args to bin on run.
39-
RUN_ARGS ?= #0 1
40-
TMP_DIR ?= _build/
41-
TMP_EXT ?= .tmp
42-
43-
INS := $(wildcard $(IN_DIR)*$(IN_EXT))
44-
INS_NODIR := $(notdir $(INS))
45-
TMPS_NODIR := $(INS_NODIR:$(IN_EXT)=$(TMP_EXT))
46-
TMPS := $(addprefix $(TMP_DIR),$(TMPS_NODIR))
47-
OUT_BASENAME := $(OUT_BASENAME_NOEXT)$(OUT_EXT)
48-
OUT := $(OUT_DIR)$(OUT_BASENAME)
49-
50-
.PHONY: all assembler clean debug set_debug_flags help mkdir profile set_profile_flags test
51-
52-
all: mkdir $(OUT)
53-
@#TODO ignore errors if not present
54-
@if [ -e "$(RUN_INPUT)" ] && [ ! -e "$(OUT_DIR)$(RUN_INPUT)" ]; then ln -s ../$(RUN_INPUT) "$(OUT_DIR)$(RUN_INPUT)"; fi
55-
56-
$(OUT): $(TMPS)
57-
$(MYCXX) $(PROFILE_FLAGS) $^ -o "$@" $(LIBS)
58-
59-
$(TMP_DIR)%$(TMP_EXT): $(IN_DIR)%.c
60-
$(MYCC) $(DEFINES) $(DEBUG_DEFINE) $(DEBUG_FLAGS) $(PROFILE_DEFINE) $(PROFILE_FLAGS) $(OPTIMIZE_FLAGS) $(PREDEF) $(INCLUDE_DIRS) $(MYCFLAGS) -c "$<" -o "$@"
61-
62-
$(TMP_DIR)%$(TMP_EXT): $(IN_DIR)%.cpp
63-
$(MYCXX) $(DEFINES) $(DEBUG_DEFINE) $(DEBUG_FLAGS) $(PROFILE_DEFINE) $(PROFILE_FLAGS) $(OPTIMIZE_FLAGS) $(PREDEF) $(INCLUDE_DIRS) $(MYCXXFLAGS) -c "$<" -o "$@"
4+
OUTS = $(OUT_DIR)/main$(OUT_EXT)
5+
ifneq ($(strip $(CXX_INS)),)
6+
LD = $(CXX)
7+
LDFLAGS = $(CXXFLAGS)
8+
LDLIBS = $(LIBS)
9+
else
10+
ifneq ($(strip $(CC_INS)),)
11+
LD = $(CC)
12+
LDFLAGS = $(CFLAGS)
13+
LDLIBS = $(LIBS)
14+
endif
15+
endif
6416

65-
$(TMP_DIR)%$(TMP_EXT): $(IN_DIR)%.f
66-
$(FF) $(DEFINES) $(DEBUG_DEFINE) $(DEBUG_FLAGS) $(PROFILE_DEFINE) $(PROFILE_FLAGS) $(OPTIMIZE_FLAGS) $(PREDEF) $(INCLUDE_DIRS) $(CFLAGS) -c "$<" -o "$@"
17+
all: mkdir $(OUTS)
6718

68-
asm: mkdir
69-
$(eval OPTIMIZE_FLAGS := -O0)
70-
$(MYCC) $(PROFILE_DEFINE) $(PROFILE_FLAGS) $(DEBUG_DEFINE) $(DEBUG_FLAGS) $(OPTIMIZE_FLAGS) $(CFLAGS) -fverbose-asm -Wa,-adhln "$(IN_DIR)$(RUN)$(IN_EXT)" $(LIBS) -o $(TMP_DIR)asm$(TMP_EXT)
19+
$(OUTS): $(OBJS)
20+
$(LD) $(LDFLAGS) -o '$@' $^ $(LDLIBS)
7121

72-
clean:
73-
if [ ! '$(OUT_DIR)' = './' ]; then \
74-
rm -rf '$(OUT_DIR)' ;\
75-
else \
76-
rm -f *'$(OBJ_EXT)' *'$(OUT_EXT)' *'$(TMP_EXT)' ;\
77-
fi
22+
$(OUT_DIR)%$(OBJ_EXT): $(IN_DIR)%$(CC_EXT) $(ALL_DEPEND)
23+
$(CC) -c $(CFLAGS) -o '$@' '$<' $(LIBS)
7824

79-
debug: clean set_debug_flags all
80-
gdb $(OUT)
25+
$(OUT_DIR)%$(OBJ_EXT): $(IN_DIR)%$(CXX_EXT) $(ALL_DEPEND)
26+
$(CXX) -c $(CXXFLAGS) -o '$@' '$<' $(LIBS)
8127

82-
mkdir:
83-
mkdir -p "$(TMP_DIR)" "$(OUT_DIR)"
84-
85-
profile: clean set_profile_flags all run
86-
mv -f gmon.out "$(OUT_DIR)"
87-
gprof -b $(OUT) "$(OUT_DIR)"gmon.out | tee "$(OUT).profile_out" | less
88-
89-
set_debug_flags:
90-
$(eval DEBUG_FLAGS := -ggdb3)
91-
$(eval DEBUG_DEFINE := -DDEBUG)
92-
$(eval OPTIMIZE_FLAGS := -O0)
93-
94-
set_profile_flags:
95-
$(eval PROFILE_FLAGS := -p -pg)
96-
$(eval PROFILE_DEFINE := -DPROFILE)
97-
#$(eval OPTIMIZE_FLAGS := )
98-
99-
run: all
100-
@echo
101-
cd $(OUT_DIR) && ./$(OUT_BASENAME) $(RUN_ARGS)
102-
103-
test: all
104-
@echo
105-
if [ -x test ]; then ./test $(OUT_DIR) $(OUT_BASENAME); else $(MAKE) run && echo 'All tests passed.'; fi
28+
$(OUT_DIR)%$(OBJ_EXT): $(IN_DIR)%$(FF_EXT) $(ALL_DEPEND)
29+
$(FF) -c $(FFLAGS) -o '$@' '$<' $(FFLIBS)
10630

31+
-include $(shell git rev-parse --show-toplevel)/Makefile_targets
10732
-include Makefile_targets
108-
109-
help:
110-
@echo 'Compile all files with extension IN_EXT in directory IN_DIR into or into a single output file.'
111-
@echo ''
112-
@echo 'IN_EXT can be either of: `.cpp`, `.c` or `.f`. The compiler is chosen accordingly.'
113-
@echo ''
114-
@echo '# Most useful invocations'
115-
@echo ''
116-
@echo 'Build:'
117-
@echo ''
118-
@echo ' make'
119-
@echo ''
120-
@echo 'Build and run output:'
121-
@echo ''
122-
@echo ' make run'
123-
@echo ''
124-
@echo '# Targets'
125-
@echo ''
126-
@echo 'all ................. Build all.'
127-
@echo 'asm [RUN=name] ...... BROKEN Print generated assembly code for the file with given basename without extension.'
128-
@echo 'clean ............... Clean built files.'
129-
@echo 'debug ............... Run with `gdb`.'
130-
@echo 'help ................ Print help to stdout.'
131-
@echo 'profile ............. Run with `gprof`.'
132-
@echo 'run ................. Run a file with the given basename or the default not given.'
133-
@echo 'test ................ If `test` exists, run `./test <output-directory> <output-basename>`. Else check exit status == 0.'

Makefile_params

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
# Input variables.
2+
ALL_DEPEND =
3+
CC = gcc
4+
CC_EXT = .c
5+
CC_STD = c11
6+
CFLAGS = $(COMMON_FLAGS) -pthread -std=$(CC_STD) $(PEDANTIC) $(CFLAGS_EXTRA)
7+
COMMON_FLAGS = -g$(G) $(I) -O$(O) -Wall -Wextra
8+
CXX = g++
9+
CXXFLAGS = $(COMMON_FLAGS) -pthread -std=$(CXX_STD) $(PEDANTIC) $(CXXFLAGS_EXTRA)
10+
CXX_EXT = .cpp
11+
CXX_STD = c++17
12+
FF = gfortran
13+
FF_EXT = .f
14+
FFLAGS = $(COMMON_FLAGS) $(I) -std=$(FORTRAN_STD) $(PEDANTIC) $(FFLAGS_EXTRA)
15+
FFLIBS =
16+
G = gdb3
17+
I =
18+
IN_DIR = ./
19+
LIBS = -lm -lrt $(LIBS_EXTRA)
20+
O = 0
21+
OBJ_EXT = .o
22+
OUT_DIR = ./
23+
OUT_EXT = .out
24+
PEDANTIC = -pedantic-errors
25+
FORTRAN_STD = f2003
26+
TEST ?= test
27+
TMP_EXT = .tmp
28+
TMP_PREF = tmp.
29+
30+
# Calculated variables.
31+
CC_INS = $(wildcard $(IN_DIR)*$(CC_EXT))
32+
CXX_INS = $(wildcard $(IN_DIR)*$(CXX_EXT))
33+
FF_INS = $(wildcard $(IN_DIR)*$(FF_EXT))
34+
INS = $(CC_INS) $(CXX_INS) $(FF_INS)
35+
INS_NODIR = $(notdir $(INS))
36+
OBJS_NOEXT = $(addprefix $(OUT_DIR), $(basename $(INS_NODIR)))
37+
OBJS = $(addsuffix $(OBJ_EXT), $(OBJS_NOEXT))
38+
39+
.PHONY: all clean mkdir test $(PHONY)

0 commit comments

Comments
 (0)