File size: 1,200 Bytes
2166d7e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
# C stack: layered, deterministic core. Targets: all, test, san, demo, clean.
CC      ?= gcc
CFLAGS  ?= -std=c11 -O2 -g
WARN    := -Wall -Wextra -Wpedantic -Wshadow -Wconversion -Werror
INC     := -Iinclude
DEFS    := -D_GNU_SOURCE

SRC     := $(wildcard src/*.c)
OBJ     := $(patsubst src/%.c,build/%.o,$(SRC))
TESTS   := $(patsubst tests/%.c,build/%,$(wildcard tests/test_*.c))

all: build/libcstack.a build/cstack_demo $(TESTS)

build/%.o: src/%.c $(wildcard include/*.h)
	@mkdir -p build
	$(CC) $(CFLAGS) $(WARN) $(DEFS) $(INC) -c $< -o $@

build/libcstack.a: $(OBJ)
	ar rcs $@ $^

build/test_%: tests/test_%.c build/libcstack.a tests/cs_test.h
	$(CC) $(CFLAGS) $(WARN) $(DEFS) $(INC) $< build/libcstack.a -o $@

build/cstack_demo: demo/cstack_demo.c build/libcstack.a
	$(CC) $(CFLAGS) $(WARN) $(DEFS) $(INC) $< build/libcstack.a -o $@

test: all
	@set -e; for t in $(TESTS); do ./$$t; done

# same tests under AddressSanitizer + UndefinedBehaviorSanitizer
san:
	$(MAKE) clean
	$(MAKE) test CFLAGS="-std=c11 -O1 -g -fsanitize=address,undefined -fno-sanitize-recover=all -fno-omit-frame-pointer"

demo: build/cstack_demo
	./build/cstack_demo

clean:
	rm -rf build

.PHONY: all test san demo clean