|
| 1 | +UNAME:=$(shell uname -s) |
1 | 2 |
|
2 |
| -SRC_DIR:=src |
| 3 | +BIN:=bin/$(UNAME) |
| 4 | +TEST_BIN:=$(BIN)/test |
3 | 5 |
|
4 |
| -UNAME:=$(shell uname -s) |
| 6 | +TARGET:=$(BIN)/target |
5 | 7 |
|
6 |
| -P_TARGET:=bin/$(UNAME)/release/target |
7 |
| -DEBUG_MAIN:=dmain.c |
8 |
| -GEN_MAKEFILE:=build/$(UNAME)/generated.Makefile |
| 8 | +BUILD:=build/$(UNAME) |
| 9 | +TEST_BUILD:=$(BIN)/test/ |
9 | 10 |
|
| 11 | +LIB:=lib/$(UNAME) |
| 12 | +INCLUDE:=include |
10 | 13 |
|
11 |
| -all: $(GEN_MAKEFILE) $(P_TARGET) Makefile |
| 14 | +SRC:=src |
| 15 | +TEST:=test |
| 16 | +TEST_COMMON:=$(TEST)/common |
12 | 17 |
|
13 |
| -build/$(UNAME)/: |
14 |
| - @mkdir -p $@ |
15 |
| - @echo $@ |
| 18 | +MAIN:=main.c |
16 | 19 |
|
17 |
| -$(GEN_MAKEFILE): build/$(UNAME)/ |
18 |
| - @bash build.sh "$(DEBUG_MAIN)" "$(SRC_DIR)" "$(GEN_MAKEFILE)" "buildconfig" |
19 |
| - @echo " $@" |
| 20 | +SOURCE_C:=$(wildcard $(SRC)/*.c $(SRC)/*/*.c) |
| 21 | +SOURCE_H:=$(wildcard $(SRC)/*.h $(SRC)/*/*.h) |
20 | 22 |
|
21 |
| -include $(GEN_MAKEFILE) |
| 23 | +TEST_C:=$(wildcard $(TEST_COMMON)/*.c $(TEST_COMMON)/*/*.c) |
| 24 | +TEST_H:=$(wildcard $(TEST_COMMON)/*.h $(TEST_COMMON)/*/*.h) |
| 25 | +TEST_TESTS:=$(wildcard $(TEST)/*.c) |
22 | 26 |
|
23 |
| -clean: |
24 |
| - $(RM) -rf build |
25 |
| - $(RM) -rf bin |
26 | 27 |
|
| 28 | +SOURCE_OBJ:=$(patsubst $(SRC)/%.c, $(BUILD)/%.o, $(SOURCE_C)) |
| 29 | +TEST_OBJ:=$(patsubst $(TEST_COMMON)/%.c, $(TEST_BUILD)/%.o, $(TEST_C)) |
| 30 | + |
| 31 | +TESTS:=$(patsubst $(TEST)/%.c, $(TEST_BIN)/%, $(TEST_TESTS)) |
| 32 | + |
| 33 | +SOURCE_OBJ_MSG_PRINTED:=1 |
| 34 | +TEST_OBJ_MSG_PRINTED:=1 |
| 35 | +TEST_MSG_PRINTED:=1 |
| 36 | +MAIN_MSG_PRINTED:=1 |
| 37 | + |
| 38 | +LIBS:=$(patsubst $(LIB)/%, -L%, $(wildcard $(LIB)/*)) |
| 39 | + |
| 40 | +CFLAGS:=-std=c2x -pedantic -Wall -Werror -Wno-newline-eof -Wno-gnu-binary-literal -Wno-unused-function $(LIBS) -g -I$(INCLUDE) -I$(SRC) |
| 41 | +SRC_CFLAGS:=-flto -O3 |
| 42 | +TEST_CFLAGS:=-flto -O3 -I$(TEST_COMMON) |
| 43 | + |
| 44 | +ifeq ($(UNAME), Linux) |
| 45 | + CC:=gcc |
| 46 | + DEBUG:=gdb -tui |
| 47 | + CHECK:=valgrind --leak-check=full --show-reachable=yes -s |
| 48 | +else |
| 49 | + CC:=clang |
| 50 | + DEBUG:=lldb |
| 51 | +endif |
| 52 | + |
| 53 | +all: $(TARGET) Makefile |
| 54 | + |
| 55 | +.PHONY: clean |
| 56 | + |
| 57 | +$(BUILD)/%.o: $(SRC)/%.c $(SOURCE_H) |
| 58 | + @mkdir -p $(dir $@) |
| 59 | + |
| 60 | + $(if $(filter 0,$(MAKELEVEL)), $(if $(filter 0,$(SOURCE_OBJ_MSG_PRINTED)),, \ |
| 61 | + $(eval SOURCE_OBJ_MSG_PRINTED:=0) \ |
| 62 | + @echo "\nCompiling object files")) |
| 63 | + |
| 64 | + @$(CC) $(CFLAGS) $(SRC_CFLAGS) -c $< -o $@ |
| 65 | + @printf " - %-50s <- %s\n" "$@" " $<" |
27 | 66 |
|
| 67 | +$(TARGET): $(MAIN) $(SOURCE_OBJ) |
| 68 | + @mkdir -p $(dir $@) |
28 | 69 |
|
| 70 | + $(if $(filter 0,$(MAKELEVEL)), $(if $(filter 0,$(MAIN_MSG_PRINTED)),, \ |
| 71 | + $(eval MAIN_MSG_PRINTED:=0) \ |
| 72 | + @echo "\nCompiling target")) |
| 73 | + |
| 74 | + @$(CC) $(CFLAGS) $(SRC_CFLAGS) -o $@ $^ |
| 75 | + @printf " - %-50s <- %s\n" "$@" " $^" |
| 76 | + |
| 77 | +$(TEST_BUILD)/%.o: $(TEST_COMMON)/%.c $(SOURCE_H) $(TEST_H) |
| 78 | + @mkdir -p $(dir $@) |
| 79 | + |
| 80 | + $(if $(filter 0,$(MAKELEVEL)), $(if $(filter 0,$(TEST_OBJ_MSG_PRINTED)),, \ |
| 81 | + $(eval TEST_OBJ_MSG_PRINTED:=0) \ |
| 82 | + @echo "\nCompiling test common files")) |
| 83 | + |
| 84 | + @$(CC) $(CFLAGS) $(TEST_CFLAGS) -c $< -o $@ |
| 85 | + @printf " - %-50s <- %s\n" "$@" " $<" |
| 86 | + |
| 87 | +$(TEST_BIN)/%: $(TEST)/%.c $(SOURCE_OBJ) $(TEST_OBJ) |
| 88 | + @mkdir -p $(dir $@) |
| 89 | + |
| 90 | + $(if $(filter 0,$(MAKELEVEL)), $(if $(filter 0,$(TEST_MSG_PRINTED)),, \ |
| 91 | + $(eval TEST_MSG_PRINTED:=0) \ |
| 92 | + @echo "\nCompiling tests")) |
| 93 | + |
| 94 | + @$(CC) $(CFLAGS) $(TEST_CFLAGS) -o $@ $^ |
| 95 | + @printf " - %-50s <- %s\n" "$@" " $^" |
| 96 | + |
| 97 | +run-tests: $(TESTS) |
| 98 | + @mkdir -p files |
| 99 | + @echo "\nRunning tests\n" |
| 100 | + @pass=0; fail=0; \ |
| 101 | + green='\033[32m'; red='\033[31m'; reset='\033[0m'; \ |
| 102 | + for test in $(TESTS); do \ |
| 103 | + if $$test; then \ |
| 104 | + printf "%-50s %bPASSED%b\n" "Test $$(basename $$test):" "$${green}" "$${reset}"; \ |
| 105 | + pass=$$((pass+1)); \ |
| 106 | + else \ |
| 107 | + printf "%-50s %bFAILED%b\n" "Test $$(basename $$test):" "$${red}" "$${reset}"; \ |
| 108 | + fail=$$((fail+1)); \ |
| 109 | + fi; \ |
| 110 | + done; \ |
| 111 | + echo "\nSummary: $${green}$$pass passed$${reset}, $${red}$$fail failed$${reset}"; |
| 112 | + |
| 113 | +run: $(TARGET) |
| 114 | + ./$< |
| 115 | + |
| 116 | +print_vars: |
| 117 | + @printf "%-50s %s\n" "UNAME" "$(UNAME)" |
| 118 | + @printf "%-50s %s\n" "BIN" "$(BIN)" |
| 119 | + @printf "%-50s %s\n" "TEST_BIN" "$(TEST_BIN)" |
| 120 | + @printf "%-50s %s\n" "TARGET" "$(TARGET)" |
| 121 | + @printf "%-50s %s\n" "BUILD" "$(BUILD)" |
| 122 | + @printf "%-50s %s\n" "TEST_BUILD" "$(TEST_BUILD)" |
| 123 | + @printf "%-50s %s\n" "LIB" "$(LIB)" |
| 124 | + @printf "%-50s %s\n" "INCLUDE" "$(INCLUDE)" |
| 125 | + @printf "%-50s %s\n" "SRC" "$(SRC)" |
| 126 | + @printf "%-50s %s\n" "TEST" "$(TEST)" |
| 127 | + @printf "%-50s %s\n" "TEST_COMMON" "$(TEST_COMMON)" |
| 128 | + @printf "%-50s %s\n" "MAIN" "$(MAIN)" |
| 129 | + @printf "%-50s %s\n" "SOURCE_C" "$(SOURCE_C)" |
| 130 | + @printf "%-50s %s\n" "SOURCE_H" "$(SOURCE_H)" |
| 131 | + @printf "%-50s %s\n" "TEST_C" "$(TEST_C)" |
| 132 | + @printf "%-50s %s\n" "TEST_H" "$(TEST_H)" |
| 133 | + @printf "%-50s %s\n" "TEST_TESTS" "$(TEST_TESTS)" |
| 134 | + @printf "%-50s %s\n" "SOURCE_OBJ" "$(SOURCE_OBJ)" |
| 135 | + @printf "%-50s %s\n" "TEST_OBJ" "$(TEST_OBJ)" |
| 136 | + @printf "%-50s %s\n" "TESTS" "$(TESTS)" |
| 137 | + @printf "%-50s %s\n" "CFLAGS" "$(CFLAGS)" |
| 138 | + @printf "%-50s %s\n" "SRC_CFLAGS" "$(SRC_CFLAGS)" |
| 139 | + @printf "%-50s %s\n" "TEST_CFLAGS" "$(TEST_CFLAGS)" |
| 140 | + @printf "%-50s %s\n" "CC" "$(CC)" |
| 141 | + @printf "%-50s %s\n" "DEBUG" "$(DEBUG)" |
| 142 | + @printf "%-50s %s\n" "CHECK" "$(CHECK)" |
| 143 | + |
| 144 | +clean: |
| 145 | + rm -rf $(BIN) |
| 146 | + rm -rf $(BUILD) |
0 commit comments