45 lines
1.3 KiB
Makefile
45 lines
1.3 KiB
Makefile
# Record Manager — build, test, and verification targets.
|
|
#
|
|
# Best-practice references:
|
|
# - GNU Make automatic prerequisites: https://www.gnu.org/software/make/manual/html_node/Automatic-Prerequisites.html
|
|
# - GCC instrumentation (sanitizers): https://gcc.gnu.org/onlinedocs/gcc/Instrumentation-Options.html
|
|
|
|
CC ?= cc
|
|
CFLAGS ?= -std=c17 -Wall -Wextra -Wpedantic -Werror -g
|
|
CPPFLAGS += -Iinclude -MMD -MP
|
|
LDLIBS ?=
|
|
|
|
SRC := $(wildcard src/*.c)
|
|
OBJ := $(SRC:src/%.c=build/%.o)
|
|
DEP := $(OBJ:.o=.d)
|
|
BIN := build/recman
|
|
|
|
all: $(BIN)
|
|
|
|
$(BIN): $(OBJ)
|
|
$(CC) $(CFLAGS) $^ -o $@ $(LDLIBS)
|
|
|
|
build/%.o: src/%.c | build
|
|
$(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o $@
|
|
|
|
build:
|
|
mkdir -p build
|
|
|
|
test: $(BIN)
|
|
sh tests/smoke.sh $(BIN)
|
|
|
|
# ASan + UBSan — zero tolerance for memory and undefined-behavior errors.
|
|
sanitize:
|
|
$(CC) $(CFLAGS) -fsanitize=address,undefined $(CPPFLAGS) $(SRC) -o build/recman_asan $(LDLIBS)
|
|
sh tests/smoke.sh build/recman_asan
|
|
|
|
valgrind: $(BIN)
|
|
@command -v valgrind >/dev/null 2>&1 || { echo "error: valgrind not installed (see toolchain setup)"; exit 1; }
|
|
printf 'add Ada ada@x.io 555-0100\nlist\nquit\n' | valgrind --leak-check=full --show-leak-kinds=all --error-exitcode=1 $(BIN) >/dev/null
|
|
|
|
clean:
|
|
rm -rf build
|
|
|
|
-include $(DEP)
|
|
|
|
.PHONY: all test sanitize valgrind clean
|