# pke-at PROJ=pke-at -include config.mk FLAGS_DEBUG = -O0 -g -DDEBUG FLAGS_RELEASE_DEBUG = -O2 -g -DDEBUG FLAGS_RELEASE = -O2 -s -DNDEBUG BUILD_MODE_FLAGS = $(FLAGS_DEBUG) define cc-command $(CC) -std=c2x -c -o $@ $(BUILD_MODE_FLAGS) $(CFLAGS) $(INCS) $< endef define cxx-command $(CXX) -std=c++23 -c -o $@ $(BUILD_MODE_FLAGS) $(CXXFLAGS) $(INCS) $< endef define cc-encode-binary-command $(1): $(2) xxd -i $$< | sed -e 's/^unsigned /const unsigned /' > $$@ endef define cc-pre-compile-header-command $(1): $(2) $(CC) -std=c2x -O3 -c $$< -o $$@ endef FILES_BIN = \ src/sql/schema-000-000.sql \ src/sql/section_delete.sql \ src/sql/section_get.sql \ src/sql/section_upsert.sql \ src/sql/setlist_delete.sql \ src/sql/setlist_get.sql \ src/sql/setlist_upsert.sql \ src/sql/setlist_song_delete.sql \ src/sql/setlist_song_get.sql \ src/sql/setlist_song_upsert.sql \ src/sql/song_delete.sql \ src/sql/song_get.sql \ src/sql/song_upsert.sql \ FILES_BIN_SAFE = $(subst -,_,$(subst .,_,$(FILES_BIN))) FILES_BIN_H = $(FILES_BIN_SAFE:%=%.h) FILES_BIN_GCH = $(FILES_BIN_SAFE:%=%.gch) # I don't like foreach but this works $(foreach f,$(FILES_BIN), \ $(eval \ $(call cc-encode-binary-command,$(subst -,_,$(subst .,_,$f)).h,$(f)) \ ) \ ) $(foreach f,$(FILES_BIN_SAFE), \ $(eval \ $(call cc-pre-compile-header-command,$(f).gch,$(f).h) \ ) \ ) .PHONY: default default: options .WAIT bin/pke-at .PHONY: prepare prepare: ## Set up the current directory to build mkdir -p bin mkdir -p obj .PHONY: options options: prepare .WAIT @echo "$(PROJ)" build options: @echo "CFLAGS = $(CFLAGS)" @echo "CXXFLAGS = $(CXXFLAGS)" @echo "BUILD_MODE_FLAGS = $(BUILD_MODE_FLAGS)" @echo "LDFLAGS = $(LDFLAGS)" @echo "CC = $(CC)" @echo "CXX = $(CXX)" obj/embedded-sql.o : $(FILES_BIN_GCH) obj/%.o : src/%.c | prepare $(cc-command) obj/%.o : src/%.cpp | prepare $(cxx-command) bin/pke-at: ## Builds the pke-at executable bin/pke-at: obj/embedded-sql.o bin/pke-at: obj/level-main.o bin/pke-at: obj/level-init.o bin/pke-at: obj/main.o bin/pke-at: obj/pke-at-common.o bin/pke-at: obj/pke-at-settings.o bin/pke-at: obj/pke-at-storage-sql.o bin/pke-at: obj/pke-at.o $(CXX) -v -std=c++23 $(BUILD_MODE_FLAGS) $(INCS) -Wl,--whole-archive $^ $(LDFLAGS) -Wl,--no-whole-archive $(CXXFLAGS) -o $@ .PHONY: clean clean: rm -rf bin rm -rf obj rm -rf *.plist rm -f $(FILES_BIN_H) .PHONY: help help: ## Prints help for targets with comments @cat $(MAKEFILE_LIST) | grep -E '^[a-zA-Z_-]+:.*?## .*$$' | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'