summaryrefslogtreecommitdiff
path: root/Makefile
blob: c34ba623d8fec0d82a20445252bfea04970746c7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
CC := gcc
GLSLC := glslc

ifeq ($(PROD),1)
CFLAGS := -std=c99 -O2 # production flags
else
CFLAGS := -std=c99 -Wall -Wextra -Wpedantic -g -DDEBUG # debug flags
endif

DEP_CGLM ?= /usr/local/lib/libcglm.a
LDFLAGS += -lm -lvulkan `sdl2-config --cflags --libs` $(DEP_CGLM)

SRCD := src
OBJD := obj
BIND := bin
FILD := files
SHDR := shaders

SFILE = $(shell find $(SRCD)/ -type f 2> /dev/null)
CSRCS = $(filter %.c, $(SFILE))
COBJS = $(CSRCS:$(SRCD)/%.c=$(OBJD)/%.o)

FILES = $(shell find $(FILD) -type f 2> /dev/null)
SHDRS = $(filter %.vert %.frag, $(FILES))
SHOBJ = $(SHDRS:$(FILD)/$(SHDR)/%=$(BIND)/$(SHDR)/%.spv)

CDEPS = $(COBJS:%.o=%.d)
-include $(CDEPS)

NAME := test

all: $(NAME) $(SHOBJ)
$(NAME): $(DEP_CGLM) $(BIND)/$(NAME)

clean:
	rm -rf $(BIND)
	rm -rf $(OBJD)

$(OBJD)/%.o: $(SRCD)/%.c
	@mkdir -p $(dir $@)
	$(CC) $(CFLAGS) -MMD -MF $(@:%.o=%.d) -c $< -o $@

$(BIND)/$(SHDR)/%.spv: $(FILD)/$(SHDR)/%
	@mkdir -p $(dir $@)
	$(GLSLC) $< -o $@

$(BIND)/$(NAME): $(COBJS)
	@mkdir -p $(dir $@)
	$(CC) $(CFLAGS) $(LDFLAGS) $^ -o $@

# Dependency Tools

DEP_CGLM_DIR ?= /usr/local/src

$(DEP_CGLM):
	@echo "-- DEPENDENCY NOT INSTALLED --"
	@echo "DEP_CGLM=$(DEP_CGLM) does not exist"
	@echo "use '[sudo] make cglm_install' to install it quickly"
	@echo "DEP_CGLM_DIR is the dir where the source code will be cloned"
	@echo "    (default is $(DEP_CGLM_DIR))"
	@exit 1

cglm_install:
	@echo "cloning cglm at $(DEP_CGLM_DIR)"
	cd $(DEP_CGLM_DIR); \
	git clone "https://github.com/recp/cglm"; \
	cd cglm && mkdir build && cd build;  \
	cmake .. -DCGLM_STATIC=ON; \
	make; \
	mkdir -p $(dir $(DEP_CGLM)); \
	mv libcglm.a $(DEP_CGLM); \

# Debug Tools

RUN_CMD := cd $(BIND) && ./$(NAME)
UNITY := unity

$(BIND)/$(UNITY): $(CSRCS)
	@mkdir -p $(dir $@)

	for src in $^; do \
		cat $${src} >> $(SRCD)/$(UNITY).c; \
	done

	$(CC) $(CFLAGS) $(SRCD)/$(UNITY).c -o $@
	@rm $(SRCD)/$(UNITY).c

analyze: clean
	scan-build \
		-enable-checker alpha \
		-enable-checker core \
		-enable-checker deadcode \
		-enable-checker security \
		-enable-checker unix \
		make $(BIND)/$(UNITY)

sanitize: clean
	$(MAKE) CC="clang -fsanitize=address" run

run: all
	$(RUN_CMD)

valgrind: all
	cd $(BIND) && \
	valgrind -s --leak-check=full --show-leak-kinds=all ./$(NAME)

.PHONY: all $(NAME) clean cglm_install analyze sanitize run valgrind