Skip to content

Commit 1fca013

Browse files
committed
The final cut and cleanup
1 parent d1c7631 commit 1fca013

File tree

6 files changed

+105
-38
lines changed

6 files changed

+105
-38
lines changed

.pre-commit-config.yaml

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,23 +15,24 @@ repos:
1515
# This brings in a portable version of clang-format.
1616
# See also: https://github.com/ssciwr/clang-format-wheel
1717
- repo: https://github.com/pre-commit/mirrors-clang-format
18-
rev: v21.1.7
18+
rev: v21.1.8
1919
hooks:
2020
- id: clang-format
2121
types_or: [c++, c, json]
2222

2323
# CMake linting and formatting
2424
- repo: https://github.com/BlankSpruce/gersemi
25-
rev: 0.23.2
25+
rev: 0.25.1
2626
hooks:
2727
- id: gersemi
2828
name: CMake linting
29-
exclude: ^.*/tests/.*/data/ # Exclude test data directories
29+
args: ["--no-warn-about-unknown-commands"]
30+
exclude: ^.*/test/.*/data/ # Exclude test data directories
3031

3132
# Markdown linting
3233
# Config file: .markdownlint.yaml
3334
- repo: https://github.com/igorshubovych/markdownlint-cli
34-
rev: v0.46.0
35+
rev: v0.47.0
3536
hooks:
3637
- id: markdownlint
3738

GNUmakefile

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,25 +9,28 @@ MAKEFLAGS+= --no-builtin-rules # Disable the built-in implicit rules.
99
export hostSystemName=$(shell uname)
1010

1111
ifeq (${hostSystemName},Darwin)
12-
export LLVM_PREFIX=$(shell brew --prefix llvm)
13-
export LLVM_DIR=$(shell realpath ${LLVM_PREFIX})
12+
export LLVM_PREFIX:=$(shell brew --prefix llvm)
13+
export LLVM_DIR:=$(shell realpath ${LLVM_PREFIX})
1414
export PATH:=${LLVM_DIR}/bin:${PATH}
1515

1616
export CMAKE_CXX_STDLIB_MODULES_JSON=${LLVM_DIR}/lib/c++/libc++.modules.json
1717
export CXX=clang++
18-
export LDFLAGS=-L$(LLVM_DIR)/lib/c++ -lc++abi -lc++ # -lc++experimental
18+
export LDFLAGS=-L$(LLVM_DIR)/lib/c++ -lc++abi # XXX -lc++ # NO! -lc++experimental
1919
export GCOV="llvm-cov gcov"
2020

2121
### TODO: to test g++-15:
22-
export GCC_PREFIX=$(shell brew --prefix gcc)
23-
export GCC_DIR=$(shell realpath ${GCC_PREFIX})
22+
export GCC_PREFIX:=$(shell brew --prefix gcc)
23+
export GCC_DIR:=$(shell realpath ${GCC_PREFIX})
2424

25-
# export CMAKE_CXX_STDLIB_MODULES_JSON=${GCC_DIR}/lib/gcc/current/libstdc++.modules.json
26-
# export CXX:=g++-15
27-
# export CXXFLAGS:=-stdlib=libstdc++
25+
# export CMAKE_CXX_STDLIB_MODULES_JSON:=${GCC_DIR}/lib/gcc/current/libstdc++.modules.json
26+
# export CXX=g++-15
27+
# export CXXFLAGS=-stdlib=libstdc++
2828
# export GCOV="gcov"
29+
30+
### XXX: to test appleclang
31+
# export CXX=/usr/bin/c++
2932
else ifeq (${hostSystemName},Linux)
30-
# export LLVM_DIR=/usr/lib/llvm-20
33+
# export LLVM_DIR:=/usr/lib/llvm-20
3134
# export PATH:=${LLVM_DIR}/bin:${PATH}
3235
# export CXX=clang++-20
3336
endif
@@ -36,14 +39,14 @@ CONAN_HOME=$(shell conan config home)
3639
# BUILD_TYPE=Release
3740
BUILD_TYPE=Debug
3841

39-
.PHONY: all clean distclean check test
42+
.PHONY: all clean distclean check test format citest
4043

4144
all: .init # XXX clean # NO! conan
4245
cmake --workflow --preset dev
4346
# TODO(CK): gcovr -v
4447

4548
check: all
46-
-run-clang-tidy -p build/dev
49+
-run-clang-tidy
4750

4851
.init: .CMakeUserPresets.json GNUmakefile
4952
-pipx ensurepath
@@ -67,10 +70,22 @@ clean:
6770
rm -rf build example/build
6871

6972
distclean: clean
70-
rm -rf conan stagedir .init CMakeUserPresets.json tags
73+
rm -rf conan stagedir .init CMakeUserPresets.json tags compile_commands.json
7174
find . -name '*~' -delete
7275
# XXX NO! git clean -xdf
7376

77+
citest: distclean
78+
cmake --preset ci-Darwin # XXX --log-level=VERBOSE --fresh
79+
ninja -C build
80+
ctest --test-dir build --verbose
81+
cd build && cmake -L . && cd ..
82+
ln -fs build/compile_commands.json .
83+
run-clang-tidy
84+
85+
format:
86+
-pre-commit autoupdate
87+
pre-commit run --all
88+
7489
GNUmakefile :: ;
7590
*.txt :: ;
7691
*.json :: ;

cmake/cxx-modules-rules.cmake

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,21 @@
11
include_guard()
22

3-
# Use modules?
3+
# Use modules? default NO!
44
set(ALGO_USE_MODULES OFF)
55

66
set(CMAKE_SKIP_TEST_ALL_DEPENDENCY OFF)
7-
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
7+
8+
# gersemi: off
9+
option(CMAKE_EXPORT_COMPILE_COMMANDS "Prepare run-clang-tidy" ${PROJECT_IS_TOP_LEVEL})
10+
if(CMAKE_EXPORT_COMPILE_COMMANDS)
11+
message(
12+
STATUS
13+
"CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES=${CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES}"
14+
)
15+
set(CMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES ${CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES}
16+
)
17+
endif()
18+
# gersemi: on
819

920
# Ensure non-empty default build type for single-config
1021
get_property(isMultiConfig GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
@@ -13,16 +24,19 @@ if(NOT isMultiConfig)
1324
endif()
1425
set(CMAKE_DEBUG_POSTFIX _debug)
1526

16-
# This property setting also needs to be consistent between the
17-
# installed shared library and its consumer, otherwise most
18-
# toolchains will once again reject the consumer's generated BMI.
27+
# This property setting also needs to be consistent between the installed shared
28+
# library and its consumer, otherwise most toolchains will once again reject the
29+
# consumer's generated BMI.
1930
if(NOT DEFINED CMAKE_CXX_STANDARD)
2031
set(CMAKE_CXX_STANDARD 23)
21-
set(CMAKE_CXX_EXTENSIONS ON)
22-
set(CMAKE_CXX_STANDARD_REQUIRED ON)
2332
endif()
2433

25-
if(CMAKE_GENERATOR STREQUAL "Ninja")
34+
# Neither of these two are technically needed, but they make the expectation clear
35+
set(CMAKE_CXX_EXTENSIONS ON)
36+
set(CMAKE_CXX_STANDARD_REQUIRED ON)
37+
38+
# NOTE: only with Ninja generator install of bmi files works yet!
39+
if(CMAKE_GENERATOR MATCHES "Ninja")
2640
if(
2741
CMAKE_CXX_COMPILER_ID STREQUAL "Clang"
2842
AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 19.0
@@ -61,13 +75,17 @@ if(${CMAKE_CXX_STANDARD} IN_LIST CMAKE_CXX_COMPILER_IMPORT_STD)
6175
endif()
6276

6377
message(STATUS "ALGO_USE_MODULES=${ALGO_USE_MODULES}")
64-
message(
65-
STATUS
66-
"CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES=${CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES}"
67-
)
6878

79+
# Avoid creating CMAKE_..._OUTPUT_DIRECTORY as cache variables, they should not
80+
# be under the control of the developer. They should be controlled by the
81+
# project because parts of the project may make assumptions about the relative
82+
# layout of the binaries. More importantly, leaving them as ordinary variables
83+
# also means they can be unset within subdirectories where test executables are
84+
# defined, allowing them to avoid being collected with the other main binaries
85+
# and cluttering up that area.
6986
set(stageDir ${CMAKE_CURRENT_BINARY_DIR}/stagedir)
7087
include(GNUInstallDirs)
88+
7189
if(NOT CMAKE_RUNTIME_OUTPUT_DIRECTORY)
7290
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${stageDir}/${CMAKE_INSTALL_BINDIR})
7391
endif()

cmake/prelude.cmake

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,38 @@ if(CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR)
1111
endif()
1212

1313
# gersemi: off
14-
if(CMAKE_VERSION VERSION_EQUAL 4.2)
14+
# ---------------------------------------------------------------------------
15+
# use ccache if found
16+
# ---------------------------------------------------------------------------
17+
find_program(CCACHE_EXECUTABLE "ccache" HINTS /usr/local/bin /opt/local/bin)
18+
if(CCACHE_EXECUTABLE)
19+
message(STATUS "use ccache")
20+
set(CMAKE_CXX_COMPILER_LAUNCHER "${CCACHE_EXECUTABLE}" CACHE PATH "ccache")
21+
set(CMAKE_C_COMPILER_LAUNCHER "${CCACHE_EXECUTABLE}" CACHE PATH "ccache")
22+
endif()
23+
24+
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR})
25+
26+
# ---------------------------------------------------------------------------
27+
# check if import std; is supported by CMAKE_CXX_COMPILER
28+
# ---------------------------------------------------------------------------
29+
if(CMAKE_VERSION VERSION_GREATER_EQUAL 4.2)
1530
set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD "d0edc3af-4c50-42ea-a356-e2862fe7a444")
1631
endif()
1732
# gersemi: on
1833

19-
if($ENV{CXX} MATCHES "clang" OR CMAKE_CXX_COMPILER MATCHES "clang")
34+
if("$ENV{CXX}" STREQUAL "")
35+
message(WARNING "\$CXX is not set")
36+
# if(UNIX)
37+
# set(ENV{CXX} clang++)
38+
# else()
39+
# set(ENV{CXX} cl)
40+
# endif()
41+
endif()
42+
43+
if(CMAKE_VERSION VERSION_GREATER 4.1 AND ("$ENV{CXX}" MATCHES "clang" OR CMAKE_CXX_COMPILER MATCHES "clang"))
44+
# NOTE: Always use libc++
2045
# see https://releases.llvm.org/19.1.0/projects/libcxx/docs/index.html
21-
# Always use libc++
2246
set(ENV{CXXFLAGS} -stdlib=libc++)
2347
message(STATUS "CXXFLAGS=-stdlib=libc++")
2448

@@ -39,7 +63,7 @@ if($ENV{CXX} MATCHES "clang" OR CMAKE_CXX_COMPILER MATCHES "clang")
3963
set(CMAKE_CXX_STDLIB_MODULES_JSON
4064
${LLVM_DIR}/lib/c++/libc++.modules.json
4165
)
42-
elseif(LINUX AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 21.0)
66+
elseif(LINUX)
4367
execute_process(
4468
OUTPUT_VARIABLE LLVM_MODULES
4569
COMMAND clang++ -print-file-name=c++/libc++.modules.json
@@ -56,12 +80,21 @@ if($ENV{CXX} MATCHES "clang" OR CMAKE_CXX_COMPILER MATCHES "clang")
5680
endif()
5781

5882
if(EXISTS ${CMAKE_CXX_STDLIB_MODULES_JSON})
83+
message(
84+
STATUS
85+
"CMAKE_CXX_STDLIB_MODULES_JSON=${CMAKE_CXX_STDLIB_MODULES_JSON}"
86+
)
5987
# gersemi: off
6088
set(CACHE{CMAKE_CXX_STDLIB_MODULES_JSON}
6189
TYPE FILEPATH
6290
HELP "Result of: clang++ -print-file-name=c++/libc++.modules.json"
6391
VALUE ${CMAKE_CXX_STDLIB_MODULES_JSON}
6492
)
6593
# gersemi: on
94+
else()
95+
message(
96+
WARNING
97+
"File does NOT EXISTS! ${CMAKE_CXX_STDLIB_MODULES_JSON}"
98+
)
6699
endif()
67100
endif()

example/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ include(../cmake/prelude.cmake)
55
project(cmake-init-modulesExamples LANGUAGES CXX)
66

77
if(PROJECT_IS_TOP_LEVEL)
8-
# Neither of these two are technically needed, but they make the expectation clear
98
include(../cmake/cxx-modules-rules.cmake)
109

1110
find_package(my_package 0.2.0 EXACT REQUIRED)
@@ -48,6 +47,7 @@ if(NOT PROJECT_IS_TOP_LEVEL AND CMAKE_BUILD_TYPE STREQUAL Release)
4847
--build-options #
4948
"-D CMAKE_BUILD_TYPE=$<CONFIG>"
5049
"-D CMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}"
50+
"-D CMAKE_CXX_STANDARD=${CMAKE_CXX_STANDARD}"
5151
"-D CMAKE_CXX_STDLIB_MODULES_JSON=${CMAKE_CXX_STDLIB_MODULES_JSON}"
5252
"-D CMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}"
5353
"-D CMAKE_PREFIX_PATH=${CMAKE_BINARY_DIR}/stagedir"

requirements.txt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,14 @@ Pygments
66
black
77
builddriver
88
cmake-init>=0.41.1
9-
cmake>=4.2
9+
cmake>=4.2.1
1010
codespell>=2.4.1
11-
conan>=2.23
12-
gcovr>=8.4
13-
gersemi>=0.23.2
11+
conan>=2.24.0
12+
gcovr>=8.6
13+
gersemi>=0.25.1
1414
isort
1515
jinja2>=3.1.3
1616
ninja>=1.13.0
17-
pre-commit>=4.5.0
17+
pre-commit>=4.5.1
1818
pylint
1919
yamllint

0 commit comments

Comments
 (0)