summaryrefslogtreecommitdiffstats
path: root/Makefile
diff options
context:
space:
mode:
authorEthan Werner <mail@ethanwerner.com>2026-08-09 15:02:21 +0400
committerEthan Werner <mail@ethanwerner.com>2026-08-09 15:02:21 +0400
commit3d92926a902017e7cf1f5738e99ff62da596ce12 (patch)
tree2b55422c26a48759d56fa91f06df24449e9dfa88 /Makefile
parent07e18043145f3d91c8ea7ec3ad41b3c905585277 (diff)
Diffstat (limited to 'Makefile')
-rw-r--r--Makefile37
1 files changed, 20 insertions, 17 deletions
diff --git a/Makefile b/Makefile
index 572e23b..7a8753c 100644
--- a/Makefile
+++ b/Makefile
@@ -8,7 +8,7 @@ ifeq ($(PYTHON3),)
endif
# Base flags
-CFLAGS_BASE = -std=c11 -Wall -Wextra -Wshadow -Wdouble-promotion -Wnull-dereference -Wimplicit-fallthrough -Wmisleading-indentation -pedantic -O2 -I. -Ilib -MMD -MP
+CFLAGS_BASE = -std=c11 -Wall -Wextra -Wshadow -Wdouble-promotion -Wnull-dereference -Wimplicit-fallthrough -Wmisleading-indentation -Wstrict-aliasing=2 -pedantic -O2 -I. -Ilib -MMD -MP
# Platform-specific
UNAME_S := $(shell uname -s)
@@ -18,13 +18,14 @@ else ifeq ($(UNAME_S),Darwin)
CFLAGS_BASE += -D_DARWIN_C_SOURCE
else
# BSD and others
- CFLAGS_BASE += -D_BSD_SOURCE
+ CFLAGS_BASE += -D_DEFAULT_SOURCE
endif
# Security hardening (optimized builds only)
CFLAGS_HARDENING = -D_FORTIFY_SOURCE=2 -fstack-protector-strong -Wformat-security -fno-common
CFLAGS := $(CFLAGS_BASE) $(CFLAGS_HARDENING)
+LDFLAGS ?=
LDLIBS = -lm
SRCDIR = lib
@@ -72,7 +73,7 @@ else
endif
$(SHLIB): $(SHARED_OBJS) $(SHARED_TS_OBJ) $(FLAT_OBJ) $(REG_OBJ) | $(BUILDDIR)
- $(CC) -shared $(SHLIB_SONAME) -Wl,-rpath,'$$ORIGIN' -o $@ $^ $(LDLIBS)
+ $(CC) $(LDFLAGS) -shared $(SHLIB_SONAME) -Wl,-rpath,'$$ORIGIN' -o $@ $^ $(LDLIBS)
$(BUILDDIR):
@mkdir -p $@
@@ -90,25 +91,25 @@ $(BUILDDIR)/ts.so.o: ts.c | $(BUILDDIR)
$(CC) $(CFLAGS) -fPIC -c ts.c -o $@
ts_generated.h: $(SCRIPTDIR)/gen_all.py $(filter-out $(SRCDIR)/ts_flat_generated.c $(SRCDIR)/ts_registry_generated.c,$(wildcard $(SRCDIR)/*.c))
- python3 $< || (echo "ERROR: gen_all.py failed" && exit 1)
+ $(PYTHON3) $< || (echo "ERROR: gen_all.py failed" && exit 1)
test/main_generated.c: ts_generated.h
- @touch $@
+ $(PYTHON3) $(SCRIPTDIR)/gen_all.py || (echo "ERROR: gen_all.py failed" && exit 1)
$(SRCDIR)/ts_flat_generated.c: $(SCRIPTDIR)/gen_flat.py $(filter-out $(SRCDIR)/ts_flat_generated.c $(SRCDIR)/ts_registry_generated.c,$(wildcard $(SRCDIR)/*.c))
- python3 $< || (echo "ERROR: gen_flat.py failed" && exit 1)
+ $(PYTHON3) $< || (echo "ERROR: gen_flat.py failed" && exit 1)
$(FLAT_OBJ): $(SRCDIR)/ts_flat_generated.c ts.h | $(BUILDDIR)
$(CC) $(CFLAGS) -fPIC -c $< -o $@
$(SRCDIR)/ts_registry_generated.c: $(SCRIPTDIR)/gen_registry.py $(filter-out $(SRCDIR)/ts_registry_generated.c $(SRCDIR)/ts_flat_generated.c,$(wildcard $(SRCDIR)/*.c))
- python3 $< || (echo "ERROR: gen_registry.py failed" && exit 1)
+ $(PYTHON3) $< || (echo "ERROR: gen_registry.py failed" && exit 1)
$(REG_OBJ): $(SRCDIR)/ts_registry_generated.c ts.h | $(BUILDDIR)
$(CC) $(CFLAGS) -fPIC -c $< -o $@
$(TESTDIR)/fuzz_table_generated.c: $(SCRIPTDIR)/gen_fuzz.py $(filter-out $(SRCDIR)/ts_flat_generated.c $(SRCDIR)/ts_registry_generated.c,$(wildcard $(SRCDIR)/*.c))
- python3 $< || (echo "ERROR: gen_fuzz.py failed" && exit 1)
+ $(PYTHON3) $< || (echo "ERROR: gen_fuzz.py failed" && exit 1)
$(BUILDDIR)/test/fuzz.o: $(TESTDIR)/fuzz.c $(TESTDIR)/fuzz_table_generated.c ts.h | $(TEST_BUILDDIR)
$(CC) $(CFLAGS) -DTS_IMPLEMENTATION -c $< -o $@
@@ -117,34 +118,34 @@ $(TEST_BUILDDIR):
@mkdir -p $@
$(BUILDDIR)/test/%.o: $(TESTDIR)/%.c ts.h | $(TEST_BUILDDIR)
- $(CC) $(CFLAGS) -DTS_IMPLEMENTATION -c $< -o $@
+ $(CC) $(CFLAGS) -DTS_IMPLEMENTATION -Wno-strict-aliasing -c $< -o $@
$(MAIN): $(OBJS) $(TS_OBJ) main.c | $(BUILDDIR)
- $(CC) $(CFLAGS) main.c $(OBJS) $(TS_OBJ) -o $@ $(LDLIBS)
+ $(CC) $(CFLAGS) main.c $(OBJS) $(TS_OBJ) $(LDFLAGS) -o $@ $(LDLIBS)
$(TEST_BIN): $(OBJS) $(TEST_OBJS) $(TS_OBJ) | $(BUILDDIR)
- $(CC) $(CFLAGS) $(TEST_OBJS) $(OBJS) $(TS_OBJ) -o $@ $(LDLIBS)
+ $(CC) $(CFLAGS) $(TEST_OBJS) $(OBJS) $(TS_OBJ) $(LDFLAGS) -o $@ $(LDLIBS)
test: $(TEST_BIN)
./$(TEST_BIN)
$(BENCH_BIN): $(OBJS) $(TS_OBJ) test/bench.c | $(BUILDDIR)
- $(CC) $(CFLAGS) test/bench.c $(OBJS) $(TS_OBJ) -o $@ $(LDLIBS)
+ $(CC) $(CFLAGS) test/bench.c $(OBJS) $(TS_OBJ) $(LDFLAGS) -o $@ $(LDLIBS)
bench: $(BENCH_BIN)
./$(BENCH_BIN)
python/ts/__init__.py: $(SCRIPTDIR)/gen_bindings.py $(SCRIPTDIR)/ts_parser.py $(filter-out $(SRCDIR)/ts_flat_generated.c $(SRCDIR)/ts_registry_generated.c,$(wildcard $(SRCDIR)/*.c))
- python3 $(SCRIPTDIR)/gen_bindings.py || (echo "ERROR: gen_bindings.py failed" && exit 1)
+ $(PYTHON3) $(SCRIPTDIR)/gen_bindings.py || (echo "ERROR: gen_bindings.py failed" && exit 1)
gen-bindings: python/ts/__init__.py
test-python: shared gen-bindings
- LD_LIBRARY_PATH=$(BUILDDIR):$$LD_LIBRARY_PATH python3 $(TESTDIR)/test_python.py
+ LD_LIBRARY_PATH=$(BUILDDIR):$$LD_LIBRARY_PATH $(PYTHON3) $(TESTDIR)/test_python.py
check:
$(MAKE) clean
- $(MAKE) test CFLAGS="$(CFLAGS_BASE) $(CFLAGS_HARDENING) -Werror"
+ $(MAKE) test CFLAGS="$(CFLAGS_BASE) $(CFLAGS_HARDENING) -Werror -Wno-error=strict-aliasing"
test-one: $(OBJS) $(TS_OBJ)
ifndef TEST
@@ -153,8 +154,8 @@ endif
@echo "$(TEST)" | grep -qE '^[a-z0-9_]+$$' || { echo "ERROR: TEST must match [a-z0-9_]+"; exit 1; }
@mkdir -p $(BUILDDIR)
@printf '#include <stdbool.h>\nextern bool ts_test_$(TEST)(void);\nint main(void){return ts_test_$(TEST)() ? 0 : 1;}\n' > $(BUILDDIR)/stub.c
- $(CC) $(CFLAGS) -DTS_IMPLEMENTATION $(BUILDDIR)/stub.c $(TESTDIR)/$(TEST).c $(OBJS) $(TS_OBJ) -o $(BUILDDIR)/test_$(TEST) $(LDLIBS)
- ./$(BUILDDIR)/test_$(TEST)
+ $(CC) $(CFLAGS) -DTS_IMPLEMENTATION $(BUILDDIR)/stub.c $(TESTDIR)/$(TEST).c $(OBJS) $(TS_OBJ) $(LDFLAGS) -o $(BUILDDIR)/test_$(TEST) $(LDLIBS)
+ @RET=0; ./$(BUILDDIR)/test_$(TEST) || RET=$$?; rm -f $(BUILDDIR)/stub.c $(BUILDDIR)/test_$(TEST); exit $$RET
valgrind: $(TEST_BIN)
valgrind --leak-check=full --error-exitcode=1 ./$(TEST_BIN)
@@ -196,7 +197,9 @@ clean:
distclean: clean
rm -f $(SRCDIR)/ts_flat_generated.c
+ rm -f $(SRCDIR)/ts_registry_generated.c
rm -f $(TESTDIR)/fuzz_table_generated.c
+ rm -f $(TESTDIR)/main_generated.c
rm -f ts_generated.h
rm -f python/ts/__init__.py