@@ -31,14 +31,42 @@ endif
3131LDFLAGS ?=
3232SAN_FLAGS ?=
3333CXX_FLAGS ?= -g
34+ # TODO: SANITIZER := release
3435SANITIZER ?= default
3536SOURCEDIR = $(CURDIR )
3637BUILDROOT = build
37- SYSTEM = $(shell uname -s)
38- BUILD = $(BUILDROOT ) /$(SYSTEM ) /$(SANITIZER )
38+ export hostSystemName: =$(shell uname -s)
39+ # TODO BUILD := $(BUILDROOT)/$(SANITIZER)
40+ BUILD ?= $(BUILDROOT ) /$(hostSystemName ) /$(SANITIZER )
3941EXAMPLE = beman.execution.examples.stop_token
4042
41- export CXX =$(COMPILER )
43+ # ###############################################
44+ ifeq (${hostSystemName},Darwin)
45+ export LLVM_PREFIX:=$(shell brew --prefix llvm)
46+ export LLVM_DIR: =$(shell realpath ${LLVM_PREFIX})
47+ export PATH: =${LLVM_DIR}/bin:${PATH}
48+
49+ # export CMAKE_CXX_STDLIB_MODULES_JSON=${LLVM_DIR}/lib/c++/libc++.modules.json
50+ # export CXX=clang++
51+ # export LDFLAGS=-L$(LLVM_DIR)/lib/c++ -lc++abi -lc++ # -lc++experimental
52+ # export GCOV="llvm-cov gcov"
53+
54+ # ## TODO: to test g++-15:
55+ export GCC_PREFIX: =$(shell brew --prefix gcc)
56+ export GCC_DIR: =$(shell realpath ${GCC_PREFIX})
57+
58+ export CMAKE_CXX_STDLIB_MODULES_JSON =${GCC_DIR}/lib/gcc/current/libstdc++.modules.json
59+ export CXX: =g++-15
60+ export CXXFLAGS:=-stdlib =libstdc++
61+ export GCOV ="gcov"
62+ else ifeq (${hostSystemName},Linux)
63+ export LLVM_DIR =/usr/lib/llvm-20
64+ export PATH: =${LLVM_DIR}/bin:${PATH}
65+ export CXX =clang++-20
66+ else
67+ export CXX =$(COMPILER )
68+ endif
69+ # ###############################################
4270
4371ifeq ($(SANITIZER ) ,release)
4472 CXX_FLAGS = -O3 -Wpedantic -Wall -Wextra -Wno-shadow -Werror
@@ -66,6 +94,9 @@ ifeq ($(SANITIZER),lsan)
6694 LDFLAGS = $(SAN_FLAGS )
6795endif
6896
97+ # TODO: beman.execution.examples.modules
98+ # FIXME: beman.execution.execution-module.test beman.execution.stop-token-module.test
99+
69100default : test
70101
71102all : $(SANITIZERS )
@@ -80,29 +111,33 @@ doc:
80111# $(MAKE) SANITIZER=$@
81112
82113build :
83- cmake --fresh -G Ninja -S $(SOURCEDIR ) -B $(BUILD ) $(TOOLCHAIN ) $(SYSROOT ) \
84- -D CMAKE_EXPORT_COMPILE_COMMANDS=1 \
85- -D CMAKE_SKIP_INSTALL_RULES=1 \
114+ cmake --fresh -G Ninja -S $(SOURCEDIR ) -B $(BUILD ) $(TOOLCHAIN ) $(SYSROOT ) \
115+ -D CMAKE_EXPORT_COMPILE_COMMANDS=ON \
116+ -D CMAKE_SKIP_INSTALL_RULES=ON \
86117 -D CMAKE_CXX_STANDARD=23 \
118+ -D CMAKE_CXX_EXTENSIONS=ON \
119+ -D CMAKE_CXX_STANDARD_REQUIRED=ON \
87120 -D CMAKE_CXX_COMPILER=$(CXX ) # XXX -D CMAKE_CXX_FLAGS="$(CXX_FLAGS) $(SAN_FLAGS)"
88121 cmake --build $(BUILD )
89122
90- # NOTE: without install! CK
123+ # NOTE: without install, see CMAKE_SKIP_INSTALL_RULES ! CK
91124test : build
92125 ctest --test-dir $(BUILD ) --rerun-failed --output-on-failure
93126
94127install : test
95128 cmake --install $(BUILD ) --prefix /opt/local
96129
97- CMakeUserPresets.json : cmake/CMakeUserPresets.json
130+ CMakeUserPresets.json :: cmake/CMakeUserPresets.json
98131 ln -s $< $@
99132
100133release : CMakeUserPresets.json
101- cmake --preset $@ --fresh --log-level=TRACE
134+ cmake --preset $@ --log-level=TRACE # XXX --fresh
135+ ln -fs $(BUILDROOT ) /$@ /compile_commands.json .
102136 cmake --workflow --preset $@
103137
104138debug : CMakeUserPresets.json
105- cmake --preset $@ --fresh --log-level=TRACE
139+ cmake --preset $@ --log-level=TRACE # XXX --fresh
140+ ln -fs $(BUILDROOT ) build/$@ /compile_commands.json .
106141 cmake --workflow --preset $@
107142
108143ce :
@@ -123,18 +158,21 @@ check:
123158build/$(SANITIZER ) /compile_commands.json : $(SANITIZER )
124159
125160clang-tidy : $(BUILD ) /compile_commands.json
161+ ln -fs $< .
126162 run-clang-tidy -p $(BUILD ) tests examples
127163
128164codespell :
129- codespell -L statics,snd,copyable,cancelled
165+ pre-commit run $@
130166
131- format : cmake-format clang-format
167+ format :
168+ pre-commit run --all
132169
133170cmake-format :
134- pre-commit run --all
171+ pre-commit run gersemi
135172
136173clang-format :
137- git clang-format main
174+ pre-commit run $@
175+ # XXX TBD: git clang-format main
138176
139177todo :
140178 bin/mk-todo.py
@@ -147,8 +185,17 @@ clean-doc:
147185 $(RM ) -r docs/html docs/latex
148186
149187clean : clean-doc
150- cmake --build $(BUILD ) --target clean
151- $(RM ) mkerr olderr * ~
188+ - cmake --build $(BUILD ) --target clean
189+ $(RM ) mkerr olderr compile_commands.json
152190
153191distclean : clean
154- $(RM ) -r $(BUILDROOT ) stagedir
192+ $(RM ) -r $(BUILDROOT ) stagedir CMakeUserPresets.json
193+ find . -name ' *~' -delete
194+
195+ Makefile :: ;
196+ *.txt :: ;
197+ *.json :: ;
198+
199+ # Anything we don't know how to build will use this rule.
200+ % ::
201+ ninja -C $(BUILD ) $(@ )
0 commit comments