@@ -34,11 +34,37 @@ CXX_FLAGS ?= -g
3434SANITIZER ?= default
3535SOURCEDIR = $(CURDIR )
3636BUILDROOT = build
37- SYSTEM = $(shell uname -s)
38- BUILD = $(BUILDROOT ) /$(SYSTEM ) /$(SANITIZER )
37+ export hostSystemName: = $(shell uname -s)
38+ BUILD = $(BUILDROOT ) /$(hostSystemName ) /$(SANITIZER )
3939EXAMPLE = beman.execution.examples.stop_token
4040
41- export CXX =$(COMPILER )
41+ # ###############################################
42+ ifeq (${hostSystemName},Darwin)
43+ export LLVM_PREFIX:=$(shell brew --prefix llvm)
44+ export LLVM_DIR: =$(shell realpath ${LLVM_PREFIX})
45+ export PATH: =${LLVM_DIR}/bin:${PATH}
46+
47+ # export CMAKE_CXX_STDLIB_MODULES_JSON=${LLVM_DIR}/lib/c++/libc++.modules.json
48+ # export CXX=clang++
49+ # export LDFLAGS=-L$(LLVM_DIR)/lib/c++ -lc++abi -lc++ # -lc++experimental
50+ # export GCOV="llvm-cov gcov"
51+
52+ # ## TODO: to test g++-15:
53+ export GCC_PREFIX: =$(shell brew --prefix gcc)
54+ export GCC_DIR: =$(shell realpath ${GCC_PREFIX})
55+
56+ export CMAKE_CXX_STDLIB_MODULES_JSON =${GCC_DIR}/lib/gcc/current/libstdc++.modules.json
57+ export CXX: =g++-15
58+ export CXXFLAGS:=-stdlib =libstdc++
59+ export GCOV ="gcov"
60+ else ifeq (${hostSystemName},Linux)
61+ export LLVM_DIR =/usr/lib/llvm-20
62+ export PATH: =${LLVM_DIR}/bin:${PATH}
63+ export CXX =clang++-20
64+ else
65+ export CXX =$(COMPILER )
66+ endif
67+ # ###############################################
4268
4369ifeq ($(SANITIZER ) ,release)
4470 CXX_FLAGS = -O3 -Wpedantic -Wall -Wextra -Wno-shadow -Werror
@@ -80,10 +106,12 @@ doc:
80106# $(MAKE) SANITIZER=$@
81107
82108build :
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 \
109+ cmake --fresh -G Ninja -S $(SOURCEDIR ) -B $(BUILD ) $(TOOLCHAIN ) $(SYSROOT ) \
110+ -D CMAKE_EXPORT_COMPILE_COMMANDS=ON \
111+ -D CMAKE_SKIP_INSTALL_RULES=ON \
86112 -D CMAKE_CXX_STANDARD=23 \
113+ -D CMAKE_CXX_EXTENSIONS=ON \
114+ -D CMAKE_CXX_STANDARD_REQUIRED=ON \
87115 -D CMAKE_CXX_COMPILER=$(CXX ) # XXX -D CMAKE_CXX_FLAGS="$(CXX_FLAGS) $(SAN_FLAGS)"
88116 cmake --build $(BUILD )
89117
@@ -94,15 +122,17 @@ test: build
94122install : test
95123 cmake --install $(BUILD ) --prefix /opt/local
96124
97- CMakeUserPresets.json : cmake/CMakeUserPresets.json
125+ CMakeUserPresets.json :: cmake/CMakeUserPresets.json
98126 ln -s $< $@
99127
100128release : CMakeUserPresets.json
101129 cmake --preset $@ --fresh --log-level=TRACE
130+ ln -fs $(BUILDROOT ) /$@ /compile_commands.json .
102131 cmake --workflow --preset $@
103132
104133debug : CMakeUserPresets.json
105134 cmake --preset $@ --fresh --log-level=TRACE
135+ ln -fs $(BUILDROOT ) build/$@ /compile_commands.json .
106136 cmake --workflow --preset $@
107137
108138ce :
@@ -123,18 +153,21 @@ check:
123153build/$(SANITIZER ) /compile_commands.json : $(SANITIZER )
124154
125155clang-tidy : $(BUILD ) /compile_commands.json
156+ ln -fs $< .
126157 run-clang-tidy -p $(BUILD ) tests examples
127158
128159codespell :
129- codespell -L statics,snd,copyable,cancelled
160+ pre-commit run $@
130161
131- format : cmake-format clang-format
162+ format :
163+ pre-commit run --all
132164
133165cmake-format :
134- pre-commit run --all
166+ pre-commit run gersemi
135167
136168clang-format :
137- git clang-format main
169+ pre-commit run $@
170+ # XXX TBD: git clang-format main
138171
139172todo :
140173 bin/mk-todo.py
@@ -147,8 +180,16 @@ clean-doc:
147180 $(RM ) -r docs/html docs/latex
148181
149182clean : clean-doc
150- cmake --build $(BUILD ) --target clean
183+ - cmake --build $(BUILD ) --target clean
151184 $(RM ) mkerr olderr * ~
152185
153186distclean : clean
154187 $(RM ) -r $(BUILDROOT ) stagedir
188+
189+ Makefile :: ;
190+ *.txt :: ;
191+ *.json :: ;
192+
193+ # Anything we don't know how to build will use this rule.
194+ % ::
195+ ninja -C $(BUILD ) $(@ )
0 commit comments