summaryrefslogtreecommitdiffstats
path: root/Makefile
blob: 3ebbfec44ef6ce002eedce4a5cca994ef41e0cf4 (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
ifeq ($(LLVM),1)
	LLVM = 1
	CC = clang
	LD = ld.lld
else
	LLVM = 0
	CC = gcc
	LD = ld
endif

CFLAGS = \
	-O2 \
	-std=c2x \
	-Wall    \
	-Wextra  \
	-Werror

LDFLAGS = -pthread -lrt

ifeq ($(DEBUG),1)
	DEBUG = 1
	CFLAGS += -g -fsanitize=address,leak,undefined
else
	DEBUG = 0
	CFLAGS  += -flto
	LDFLAGS += -flto
endif

ifeq ($(SECURITY),1)
	SECURITY = 1
	CFLAGS += \
		-fwrapv \
		-fno-strict-aliasing \
		-fno-delete-null-pointer-checks \
		-D_FORTIFY_SOURCE=2 \
		-fstack-protector-strong \
		-fPIE -fPIC -fpic \
		-fno-builtin-fprintf -fno-builtin-fwprintf \
		-fno-builtin-printf -fno-builtin-snprintf \
		-fno-builtin-sprintf -fno-builtin-swprintf \
		-fno-builtin-wprintf \
		-fno-builtin-memcpy -fno-builtin-memmove \
		-fno-builtin-memset -fno-builtin-strcat \
		-fno-builtin-strcpy -fno-builtin-strncat \
		-fno-builtin-strncpy -fno-builtin-wcscat \
		-fno-builtin-scwcpy -fno-builtin-wcsncat \
		-fno-builtin-wcsncpy -fno-builtin-wmemcpy \
		-fno-builtin-wmemmove -fno-builtin-wmemset \
		-Warray-bounds \
		-Wdiv-by-zero \
		-Wshift-count-negative -Wshift-count-overflow \
		-fstack-protector
	ifeq ($(LLVM),0)
		CFLAGS += -fwrapv-pointer \
			-Wclobbered
	endif
else
	SECURITY = 0
endif

ARGS = $(LLVM) $(DEBUG) $(SECURITY)

.PHONY: all clean controller worker test analyze phony

all: build/controller build/worker

clean:
	@rm -rf build

controller: build/controller

worker: build/worker

build/%.o: %.c build/ARGS 
	@mkdir -p $(@D)
	@$(CC) $(CFLAGS) -c $(patsubst build/ARGS,,$^) -o $@

build/%: %.c build/lib.o build/ARGS 
	@mkdir -p $(@D)
	@$(CC) $(CFLAGS) $(LDFLAGS) $(patsubst build/ARGS,,$^) -o $@ -lm

build/lib.o: $(patsubst %.c,build/%.o,$(shell find lib -type f -name '*.c' -print))
	@mkdir -p $(@D)
	@$(LD) -r $^ -o $@

ARGS_state = $(shell cat build/ARGS) 
build/ARGS: phony
	@mkdir -p $(@D)
	@if [ '$(ARGS_state)' == '$(ARGS) ' ]; then \
		echo "not changed"; \
	else \
		echo -n "$(ARGS)" >build/ARGS; \
		echo changed, recompile; \
	fi