detect duplicate comment fields
[simplev-cpp.git] / Makefile
1 # SPDX-License-Identifier: LGPL-2.1-or-later
2 # See Notices.txt for copyright information
3 .PHONY: all tests clean fix-tests format-tests build-tests
4
5 SHELL=/bin/bash
6
7 CC = powerpc64le-linux-gnu-gcc
8 CXX = powerpc64le-linux-gnu-g++
9 CFLAGS = -O3 -Iinclude -g0 -mno-altivec -mno-vsx -Wall
10 CXXFLAGS = -std=gnu++17
11
12 all: tests
13
14 TESTS_SOURCE := $(wildcard tests/*/test.cpp) $(wildcard tests/*/test.c)
15 TESTS_DIR := $(dir $(TESTS_SOURCE))
16 TESTS_BUILD_DIR := $(addprefix build/,$(TESTS_DIR))
17 TESTS_DIFF := $(addsuffix diff.txt,$(TESTS_BUILD_DIR))
18 TESTS_FILTERED_OUT := $(addsuffix filtered-out.s,$(TESTS_BUILD_DIR))
19 EXTRA_DEPS := Makefile $(wildcard include/*.h) include/simplev_cpp_generated.h
20
21 include/simplev_cpp_generated.h: Makefile generate_headers.py
22 python3 generate_headers.py
23
24 build/tests/%/:
25 mkdir -p $@
26
27 build/tests/%/out.s: tests/%/test.cpp $(EXTRA_DEPS) | build/tests/%/
28 $(CXX) -S $(CFLAGS) $(CXXFLAGS) $< -o $@
29
30 build/tests/%/out.s: tests/%/test.c $(EXTRA_DEPS) | build/tests/%/
31 $(CC) -S $(CFLAGS) $< -o $@
32
33 build/tests/%/filtered-out.s: build/tests/%/out.s $(EXTRA_DEPS)
34 sed 's/\(^\t.ident\t"\).*"/\1GCC"/' < $< > $@
35
36 build/tests/%/diff.txt: tests/%/expected.s build/tests/%/filtered-out.s $(EXTRA_DEPS)
37 diff -u $< build/$(dir $<)filtered-out.s > $@ || true
38
39 .PRECIOUS: build/tests/%/out.s build/tests/%/filtered-out.s build/tests/%/ include/simplev_cpp_generated.h
40
41 tests: build-tests format-tests
42
43 build-tests: $(TESTS_DIFF)
44 @failed=0; \
45 for i in $+; do \
46 if [ -s "$$i" -o ! -e "$$i" ]; then \
47 echo "Test failed: $$i" >&2; \
48 head -n 10 "$$i" >&2; \
49 failed=$$((failed + 1)); \
50 fi; \
51 done; \
52 if [ $$((failed)) != 0 ]; then \
53 echo "$$failed test(s) failed" >&2; \
54 false; \
55 else \
56 echo "all tests passed"; \
57 fi
58
59 fix-tests: $(TESTS_FILTERED_OUT)
60 @for i in $(TESTS_FILTERED_OUT); do \
61 target="$$(dirname "$${i##build/}")/expected.s"; \
62 status=""; \
63 [ "$(FORCE_FIX_TESTS)" = "$$target" ] || status="$$(git status --porcelain "$$target")"; \
64 if [ -z "$$status" ]; then \
65 cp -v "$$i" "$$target"; \
66 elif ! cmp "$$i" "$$target"; then \
67 echo "$$target has uncommitted changes, not overwriting -- commit changes or run make with FORCE_FIX_TESTS=$$target" >&2; \
68 exit 1; \
69 fi; \
70 done
71
72 format-tests: Makefile include/simplev_cpp_generated.h .clang-format
73 @if ! which clang-format-11 > /dev/null; then \
74 echo "clang-format-11 not found -- skipping format test"; \
75 else \
76 diff -u <(clang-format-11 < include/simplev_cpp_generated.h) include/simplev_cpp_generated.h; \
77 fi
78
79 clean:
80 rm -rf build/tests include/simplev_cpp_generated.h