# pke-at PROJ=pke-at -include config.mk .PHONY: default default: options .WAIT bin/pke-at bin/pke-at-test 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 's/};/ ,0x00\n};/' | 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/ext_mapping_delete.sql \ src/sql/ext_mapping_get.sql \ src/sql/ext_mapping_upsert.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 \ data/service-types.json \ data/upcoming-plans.json \ data/plan-items.json \ 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: 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/pke-at-storage-sql.o : $(FILES_BIN_GCH) obj/pke-at-data-stub.o : $(FILES_BIN_GCH) obj/%.o : src/%.c | prepare $(cc-command) obj/%.o : src/%.cpp | prepare $(cxx-command) obj/%.o : tests/%.c | prepare $(cc-command) obj/%.o : tests/%.cpp | prepare $(cxx-command) bin/pke-at: ## Builds the pke-at executable bin/pke-at: obj/level-import.o bin/pke-at: obj/level-init.o bin/pke-at: obj/level-main.o bin/pke-at: obj/main.o bin/pke-at: obj/pke-at-common.o bin/pke-at: obj/pke-at-data-stub.o bin/pke-at: obj/pke-at-data-parser.o bin/pke-at: obj/pke-at-settings.o bin/pke-at: obj/pke-at-setlist-types.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 $@ bin/pke-at-test: ## Builds the pke-at-test executable bin/pke-at-test: obj/pke-at-common.o bin/pke-at-test: obj/pke-at-data-parser.o bin/pke-at-test: obj/pke-at-settings.o bin/pke-at-test: obj/pke-at-test-data-parser.o bin/pke-at-test: obj/pke-at-test-dummy.o bin/pke-at-test: obj/pke-at-test-main.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}'