1+ .SUFFIXES :
2+
3+ # Sources and defines
4+ TARGET := $(notdir $(CURDIR ) )
5+ BUILD := build
6+ INCLUDES := include
7+ SOURCES := source
8+ DEFINES :=
9+
10+
11+ # Compiler settings
12+ ARCH :=
13+ CFLAGS := $(ARCH ) -std=c17 -O2 -g -fstrict-aliasing -ffunction-sections \
14+ -fdata-sections -Wall -Wextra -Wstrict-aliasing=2
15+ CXXFLAGS := $(ARCH ) -std=c++20 -O2 -g -fstrict-aliasing -ffunction-sections \
16+ -fdata-sections -Wall -Wextra -Wstrict-aliasing=2
17+ ASFLAGS := $(ARCH ) -O2 -g -x assembler-with-cpp
18+ ARFLAGS := -rcs
19+ LDFLAGS := $(ARCH ) -O2 -g -Wl,--gc-sections
20+
21+ PREFIX :=
22+ CC := $(PREFIX ) gcc
23+ CXX := $(PREFIX ) g++
24+ AS := $(PREFIX ) gcc
25+ AR := $(PREFIX ) gcc-ar
26+
27+
28+ # Do not change anything after this
29+ ifneq ($(BUILD ) ,$(notdir $(CURDIR ) ) )
30+
31+ export OUTPUT := $(CURDIR ) /$(TARGET )
32+ export VPATH := $(foreach dir,$(DATA ) ,$(CURDIR ) /$(dir ) ) \
33+ $(foreach dir,$(SOURCES ) ,$(CURDIR ) /$(dir ) )
34+
35+ CPPFILES := $(foreach dir,$(SOURCES ) ,$(notdir $(wildcard $(dir ) /* .cpp) ) )
36+ CFILES := $(foreach dir,$(SOURCES ) ,$(notdir $(wildcard $(dir ) /* .c) ) )
37+ SFILES := $(foreach dir,$(SOURCES ) ,$(notdir $(wildcard $(dir ) /* .s) ) )
38+
39+ ifeq ($(strip $(CPPFILES ) ) ,)
40+ export LD := $(CC)
41+ else
42+ export LD := $(CXX)
43+ endif
44+
45+ export OFILES := $(CPPFILES:.cpp=.o ) $(CFILES:.c=.o ) $(SFILES:.s=.o )
46+
47+ export INCLUDE := $(foreach dir,$(INCLUDES ) ,-I$(CURDIR ) /$(dir ) ) -I$(CURDIR ) /$(BUILD )
48+
49+
50+ .PHONY : $(BUILD ) clean release
51+
52+ $(BUILD ) :
53+ @[ -d $@ ] || mkdir -p $@
54+ @$(MAKE ) --no-print-directory -C $(BUILD ) -f $(CURDIR ) /Makefile
55+
56+ clean :
57+ @echo clean ...
58+ @rm -rf $(BUILD ) $(TARGET )
59+
60+ release :
61+ @[ -d $( BUILD) ] || mkdir -p $(BUILD )
62+ @$(MAKE ) --no-print-directory -C $(BUILD ) -f $(CURDIR ) /Makefile NO_DEBUG=1
63+
64+ else
65+
66+ ifneq ($(strip $(NO_DEBUG ) ) ,)
67+ DEFINES += -DNDEBUG
68+ endif
69+
70+ # VERS_STRING := $(shell git describe --tags --match v[0-9]* --abbrev=8 | sed 's/-[0-9]*-g/-/i')
71+ # VERS_MAJOR := $(shell echo "$(VERS_STRING)" | sed 's/v\([0-9]*\)\..*/\1/i')
72+ # VERS_MINOR := $(shell echo "$(VERS_STRING)" | sed 's/.*\.\([0-9]*\).*/\1/')
73+
74+ # DEFINES += -DVERS_STRING=\"$(VERS_STRING)\"
75+ # DEFINES += -DVERS_MAJOR=$(shell echo "$(VERS_STRING)" | sed 's/v\([0-9]*\)\..*/\1/i')
76+ # DEFINES += -DVERS_MINOR=$(shell echo "$(VERS_STRING)" | sed 's/.*\.\([0-9]*\).*/\1/')
77+
78+
79+ # Main target
80+ $(OUTPUT ) : $(OFILES )
81+ $(LD ) $(LDFLAGS ) $(OFILES ) $(LIBPATHS ) $(LIBS ) -o $@
82+ @echo built ... $(notdir $@ )
83+
84+
85+ % .o : % .cpp
86+ @echo $(notdir $< )
87+ $(CXX ) $(CXXFLAGS ) $(DEFINES ) $(INCLUDE ) -c $< -o $@
88+
89+ % .o : % .c
90+ @echo $(notdir $< )
91+ $(CC ) $(CFLAGS ) $(DEFINES ) $(INCLUDE ) -c $< -o $@
92+
93+ % .o : % .s
94+ @echo $(notdir $< )
95+ $(AS ) $(ASFLAGS ) $(DEFINES ) $(INCLUDE ) -c $< -o $@
96+
97+ % .a :
98+ @echo $(notdir $@ )
99+ $(AR ) $(ARFLAGS ) $@ $^
100+
101+ endif
0 commit comments