wip
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