at dev 2.3 kB view raw
1 2_default: dirs 3 @echo "\"make test\" for debug builds, \"make release\" to build a release" 4 5OBJECT_DIR = .temp/object 6PROJECT_NAME = crone 7 8.NOTINTERMEDIATE: # all 9 10LINKS = -lX11 -lvulkan 11HEADERS = -I $(PROJECT_NAME)/interface 12ERRORS = -Wfatal-errors -Wall -Wextra -Werror=use-after-free -Wno-unused-variable -Wpedantic -fno-common -Wshadow -Wconversion -Wdouble-promotion -Wvla 13SANITY = -fwrapv -fno-strict-aliasing -fno-delete-null-pointer-checks 14%_dev: VERSION_FLAGS = -Og -DDO_VALIDATION -fsanitize=undefined,address -g -fno-omit-frame-pointer -fstack-protector-strong 15%_release: VERSION_FLAGS = -O3 16FLAGS = -std=c23 $(ERRORS) $(SANITY) $(VERSION_FLAGS) $(HEADERS) -DUSE_X11 17 18GCC = gcc $(FLAGS) -o 19NVCC = nvcc -Xcompiler $(FLAGS) -o 20 21define MAKE_OBJECT 22 @echo "[makefile] making $@" 23 @$(GCC) $@ $^ -c 24endef 25 26.temp/make: $(shell find $(PROJECT_NAME) -type f -name '*.c') 27 @find $(PROJECT_NAME) -type f -name '*.c' > .temp/cfiles 28 @sed 's/$(PROJECT_NAME)\/\(.*\)\.c/\1/g;s/\//_/' .temp/cfiles > .temp/object_names 29 @paste -d " " .temp/cfiles .temp/object_names > .temp/build_plan 30 @sed 's/\(.*\) \(.*\)/$$(OBJECT_DIR)\/\2_%: \1\n\t$$(MAKE_OBJECT)/g' .temp/build_plan > $@ 31 @echo -n ".temp/lib_%: " >> $@ 32 @sed 's/.* \(.*\)/$$(OBJECT_DIR)\/\1_%/g' .temp/build_plan | tr "\n" " " >> $@ 33 @echo -n -e "\n\t@echo \"[.temp/make] linking \$$@\"" >> $@ 34 @echo -n -e "\n\t@ld -r -o \$$@ $$^" >> $@ 35 36ifneq ("$(wildcard .temp)","") 37include .temp/make 38else 39.temp/lib_%: dirs 40 make $@ 41endif 42 43%_dev: SUFFIX = _dev 44%_release: SUFFIX = _release 45%_dev: % 46%_release: % 47program/$(PROJECT_NAME)_%: program.c .temp/lib_% 48 @echo "[makefile] making $@" 49 @$(GCC) $@ $^ $(LINKS) 50 51.PHONY: _default dirs test clean release self objects immaculate 52 53dirs: 54 @mkdir -p program $(OBJECT_DIR) 55 56test: objects program/$(PROJECT_NAME)_dev 57 @echo -e "\n[makefile] launching..." 58 @LSAN_OPTIONS=suppressions=san.supp program/$(PROJECT_NAME)_dev 59 60DATE := $(shell date '+%d.%m.%Y') 61release: objects program/$(PROJECT_NAME)_release 62 @cp program/$(PROJECT_NAME)_release program/$(PROJECT_NAME)_release_$(DATE) 63 @echo -e "\n[makefile] built program/$(PROJECT_NAME)_release_$(DATE)" 64 65clean: dirs 66 @rm -rf ./.temp/* 67 @rm -f ./program/* 68 @mkdir -p program $(OBJECT_DIR) 69 70immaculate: 71 @rm -rf .temp 72 @rm -rf program 73 74objects: dirs .temp/make 75