/
Makefile
80 lines (66 loc) · 2.06 KB
/
Makefile
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
SHELL := /bin/sh
CLANG := clang-18
CFLAGS ?= -std=c23 -Wall -Wpedantic -Werror
LDFLAGS ?= -lm -fuse-ld=lld -lc
INCLUDES ?= ./include
ifeq ($(shell uname), Darwin)
SDK_PATH := $(shell xcrun --show-sdk-path)
LLVM_DIR := $(shell brew --prefix llvm)
CLANG := $(LLVM_DIR)/bin/$(CLANG)
LDFLAGS += -Wl,-syslibroot,$(SDK_PATH)
INCLUDES += -isysroot $(SDK_PATH)
endif
INCLUDE_DIR := $(abspath ./include)
SOURCE_DIR := $(abspath ./src)
OUTPUT_DIR := $(abspath ./build)
DEBUG=0
ifeq ($(DEBUG), 1)
BUILD_DIR := $(OUTPUT_DIR)/debug
CFLAGS += -O1 -g -fsanitize=address,undefined
else
BUILD_DIR := $(OUTPUT_DIR)/release
CFLAGS += -O3 -march=native
endif
HEADERS := $(wildcard $(INCLUDE_DIR)/*.h)
TOOLS_SRC := $(wildcard $(SOURCE_DIR)/tools/*.c)
TESTS_SRC := $(wildcard $(SOURCE_DIR)/tests/*.c)
TOOLS_FILES := $(notdir $(basename $(TOOLS_SRC)))
TESTS_FILES := $(notdir $(basename $(TESTS_SRC)))
TOOLS_DIR := $(BUILD_DIR)/tools
TESTS_DIR := $(BUILD_DIR)/tests
TOOLS := $(addprefix $(TOOLS_DIR)/,$(TOOLS_FILES))
TESTS := $(addprefix $(TESTS_DIR)/,$(TESTS_FILES))
.PHONY: all
all: $(TOOLS) $(TESTS)
.PHONY: clean
clean:
$(RM) -r $(OUTPUT_DIR)
.PHONY: fmt
fmt: $(HEADERS) $(TOOLS_SRC) $(TESTS_SRC)
@clang-format --verbose -i $^
$(BUILD_DIR) $(TOOLS_DIR) $(TESTS_DIR):
mkdir -p $@
$(TOOLS) $(TESTS): $(BUILD_DIR)/%: src/%.c $(HEADERS) | $(TOOLS_DIR) $(TESTS_DIR)
$(CLANG) $(CFLAGS) -I $(INCLUDES) -o $@ $< $(LDFLAGS)
TEST_ARGS :=
ifeq (${STUFFLIB_TEST_VERBOSE}, 1)
TEST_ARGS += -v
endif
RUN_TESTS := $(addprefix run_,$(TESTS_FILES))
.PHONY: test
test: $(RUN_TESTS)
.PHONY: $(RUN_TESTS)
$(RUN_TESTS): run_%: $(TESTS_DIR)/%
$< $(TEST_ARGS)
TIMEOUT_CMD := $(shell which timeout)
ifeq ($(TIMEOUT_CMD),)
TIMEOUT_CMD :=
else
TIMEOUT_CMD += --kill-after=4m 2m
endif
RUN_INTEGRATION_TESTS := $(addprefix integration_test_,$(TOOLS_FILES))
.PHONY: integration_test
integration_test: $(RUN_INTEGRATION_TESTS)
.PHONY: $(RUN_INTEGRATION_TESTS)
$(RUN_INTEGRATION_TESTS): integration_test_%: ./tests/test_%_tool.bash $(BUILD_DIR)/tools/%
$(TIMEOUT_CMD) $^ $(TEST_ARGS)