Skip to content

Commit daf6f62

Browse files
authored
Merge pull request #59 from bemanproject/preset
Add CMake presets
2 parents 4be809d + f9d7122 commit daf6f62

File tree

8 files changed

+355
-16
lines changed

8 files changed

+355
-16
lines changed

.github/workflows/ci_tests.yml

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -11,21 +11,31 @@ on:
1111
- cron: '30 15 * * *'
1212

1313
jobs:
14-
# preset-test:
15-
# runs-on: ubuntu-latest
16-
# strategy:
17-
# matrix:
18-
# preset: []
19-
# name: "Preset Test: ${{ matrix.preset }}"
20-
# steps:
21-
# - uses: actions/checkout@v4
22-
# - name: Setup build environment
23-
# uses: lukka/get-cmake@latest
24-
# with:
25-
# cmakeVersion: "~3.25.0"
26-
# ninjaVersion: "^1.11.1"
27-
# - name: Run preset
28-
# run: cmake --workflow --preset ${{ matrix.preset }}
14+
preset-test:
15+
strategy:
16+
fail-fast: false
17+
matrix:
18+
presets:
19+
- preset: "gcc-debug"
20+
platform: "ubuntu-latest"
21+
- preset: "gcc-release"
22+
platform: "ubuntu-latest"
23+
name: "Preset: ${{ matrix.presets.preset }} on ${{ matrix.presets.platform }}"
24+
runs-on: ${{ matrix.presets.platform }}
25+
steps:
26+
- uses: actions/checkout@v4
27+
- name: Setup build environment
28+
uses: lukka/get-cmake@latest
29+
with:
30+
cmakeVersion: "~3.25.0"
31+
ninjaVersion: "^1.11.1"
32+
- name: Setup MSVC
33+
if: startsWith(matrix.presets.platform, 'windows')
34+
uses: TheMrMilchmann/setup-msvc-dev@v3
35+
with:
36+
arch: x64
37+
- name: Run preset
38+
run: cmake --workflow --preset ${{ matrix.presets.preset }}
2939

3040
test:
3141
strategy:

CMakePresets.json

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
{
2+
"version": 6,
3+
"configurePresets": [
4+
{
5+
"name": "_root-config",
6+
"hidden": true,
7+
"generator": "Ninja",
8+
"binaryDir": "${sourceDir}/build/${presetName}",
9+
"cacheVariables": {
10+
"CMAKE_CXX_STANDARD": "20"
11+
}
12+
},
13+
{
14+
"name": "_debug-base",
15+
"hidden": true,
16+
"cacheVariables": {
17+
"CMAKE_BUILD_TYPE": "Debug",
18+
"BEMAN_BUILDSYS_SANITIZER": "MaxSan"
19+
}
20+
},
21+
{
22+
"name": "_release-base",
23+
"hidden": true,
24+
"cacheVariables": {
25+
"CMAKE_BUILD_TYPE": "RelWithDebInfo"
26+
}
27+
},
28+
{
29+
"name": "gcc-debug",
30+
"displayName": "GCC Debug Build",
31+
"inherits": [
32+
"_root-config",
33+
"_debug-base"
34+
],
35+
"cacheVariables": {
36+
"CMAKE_TOOLCHAIN_FILE": "cmake/gnu-toolchain.cmake"
37+
}
38+
},
39+
{
40+
"name": "gcc-release",
41+
"displayName": "GCC Release Build",
42+
"inherits": [
43+
"_root-config",
44+
"_release-base"
45+
],
46+
"cacheVariables": {
47+
"CMAKE_TOOLCHAIN_FILE": "cmake/gnu-toolchain.cmake"
48+
}
49+
}
50+
],
51+
"buildPresets": [
52+
{
53+
"name": "gcc-debug",
54+
"configurePreset": "gcc-debug"
55+
},
56+
{
57+
"name": "gcc-release",
58+
"configurePreset": "gcc-release"
59+
}
60+
],
61+
"testPresets": [
62+
{
63+
"name": "_test_base",
64+
"hidden": true,
65+
"output": {
66+
"outputOnFailure": true
67+
},
68+
"execution": {
69+
"noTestsAction": "error",
70+
"stopOnFailure": true
71+
}
72+
},
73+
{
74+
"name": "gcc-debug",
75+
"inherits": "_test_base",
76+
"configurePreset": "gcc-debug"
77+
},
78+
{
79+
"name": "gcc-release",
80+
"inherits": "_test_base",
81+
"configurePreset": "gcc-release"
82+
}
83+
],
84+
"workflowPresets": [
85+
{
86+
"name": "gcc-debug",
87+
"steps": [
88+
{
89+
"type": "configure",
90+
"name": "gcc-debug"
91+
},
92+
{
93+
"type": "build",
94+
"name": "gcc-debug"
95+
},
96+
{
97+
"type": "test",
98+
"name": "gcc-debug"
99+
}
100+
]
101+
},
102+
{
103+
"name": "gcc-release",
104+
"steps": [
105+
{
106+
"type": "configure",
107+
"name": "gcc-release"
108+
},
109+
{
110+
"type": "build",
111+
"name": "gcc-release"
112+
},
113+
{
114+
"type": "test",
115+
"name": "gcc-release"
116+
}
117+
]
118+
}
119+
]
120+
}

README.md

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,62 @@ TODO: tested platforms.
8080
8181
### Instructions
8282
83-
<!-- TODO: add preset support -->
83+
#### Using CMake Preset
84+
85+
[CMake Preset](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html)
86+
is a new CMake functionality that provides one-line configure + test.
87+
88+
You can use `gcc-debug` to setup a debug orienated `inplace_vector` development environment.
89+
90+
```text
91+
$ cmake --workflow --preset gcc-debug
92+
Executing workflow step 1 of 3: configure preset "gcc-debug"
93+
94+
Preset CMake variables:
95+
96+
BEMAN_BUILDSYS_SANITIZER="MaxSan"
97+
CMAKE_BUILD_TYPE="Debug"
98+
CMAKE_CXX_STANDARD="20"
99+
CMAKE_TOOLCHAIN_FILE="cmake/gnu-toolchain.cmake"
100+
101+
-- The CXX compiler identification is GNU 14.2.0
102+
....
103+
-- Generating done (0.0s)
104+
-- Build files have been written to: /inplace_vector/build/gcc-debug
105+
106+
Executing workflow step 2 of 3: build preset "gcc-debug"
107+
108+
[8/20] Building CXX object tests/beman/inplace_vector/CMakeFiles/beman.inplace_vector.tests.erasure.dir/erasure.test.cpp.o
109+
110+
Executing workflow step 3 of 3: test preset "gcc-debug"
111+
112+
Test project /home/bradwu/Desktop/inplace_vector/build/gcc-debug
113+
Start 1: beman.inplace_vector.test
114+
1/54 Test #1: beman.inplace_vector.test .................................... Passed 0.03 sec
115+
Start 2: beman.inplace_vector.ref-test
116+
2/54 Test #2: beman.inplace_vector.ref-test ................................ Passed 0.03 sec
117+
Start 3: ContainerRequirements/*.ValueType
118+
3/54 Test #3: ContainerRequirements/*.ValueType ............................ Passed 0.15 sec
119+
Start 4: ContainerRequirements/*.Reference
120+
...
121+
50/54 Test #50: SizeNCapacity/*.ResizeDown ................................... Passed 0.05 sec
122+
Start 51: SizeNCapacity/*.ResizeUp
123+
51/54 Test #51: SizeNCapacity/*.ResizeUp ..................................... Passed 0.05 sec
124+
Start 52: Data/*.Test
125+
52/54 Test #52: Data/*.Test .................................................. Passed 0.05 sec
126+
Start 53: Erasure/*.ByValue
127+
53/54 Test #53: Erasure/*.ByValue ............................................***Skipped 0.04 sec
128+
Start 54: Erasure/*.ByPred
129+
54/54 Test #54: Erasure/*.ByPred .............................................***Skipped 0.04 sec
130+
131+
100% tests passed, 0 tests failed out of 54
132+
133+
Total Test time (real) = 6.20 sec
134+
```
135+
136+
Note that this workflow compiles the project with sanitizers,
137+
if you wish to playaround with `inplace_vector` without sanitizers,
138+
use `gcc-release`.
84139

85140
#### Manual CMake Build
86141

cmake/appleclang-toolchain.cmake

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
2+
3+
# This toolchain file is not meant to be used directly,
4+
# but to be invoked by CMake preset and GitHub CI.
5+
#
6+
# This toolchain file configures for apple clang family of compiler.
7+
# Note this is different from LLVM toolchain.
8+
#
9+
# BEMAN_BUILDSYS_SANITIZER:
10+
# This optional CMake parameter is not meant for public use and is subject to
11+
# change.
12+
# Possible values:
13+
# - MaxSan: configures clang and clang++ to use all available non-conflicting
14+
# sanitizers. Note that apple clang does not support leak sanitizer.
15+
# - TSan: configures clang and clang++ to enable the use of thread sanitizer.
16+
17+
include_guard(GLOBAL)
18+
19+
set(CMAKE_C_COMPILER clang)
20+
set(CMAKE_CXX_COMPILER clang++)
21+
22+
if(BEMAN_BUILDSYS_SANITIZER STREQUAL "MaxSan")
23+
set(SANITIZER_FLAGS
24+
"-fsanitize=address -fsanitize=pointer-compare -fsanitize=pointer-subtract -fsanitize=undefined"
25+
)
26+
elseif(BEMAN_BUILDSYS_SANITIZER STREQUAL "TSan")
27+
set(SANITIZER_FLAGS "-fsanitize=thread")
28+
endif()
29+
30+
set(CMAKE_C_FLAGS_DEBUG_INIT "${SANITIZER_FLAGS}")
31+
set(CMAKE_CXX_FLAGS_DEBUG_INIT "${SANITIZER_FLAGS}")
32+
33+
set(RELEASE_FLAGS "-O3 ${SANITIZER_FLAGS}")
34+
35+
set(CMAKE_C_FLAGS_RELWITHDEBINFO_INIT "${RELEASE_FLAGS}")
36+
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT "${RELEASE_FLAGS}")
37+
38+
set(CMAKE_C_FLAGS_RELEASE_INIT "${RELEASE_FLAGS}")
39+
set(CMAKE_CXX_FLAGS_RELEASE_INIT "${RELEASE_FLAGS}")

cmake/gnu-toolchain.cmake

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
2+
3+
# This toolchain file is not meant to be used directly,
4+
# but to be invoked by CMake preset and GitHub CI.
5+
#
6+
# This toolchain file configures for GNU family of compiler.
7+
#
8+
# BEMAN_BUILDSYS_SANITIZER:
9+
# This optional CMake parameter is not meant for public use and is subject to
10+
# change.
11+
# Possible values:
12+
# - MaxSan: configures gcc and g++ to use all available non-conflicting
13+
# sanitizers.
14+
# - TSan: configures gcc and g++ to enable the use of thread sanitizer
15+
16+
include_guard(GLOBAL)
17+
18+
set(CMAKE_C_COMPILER gcc)
19+
set(CMAKE_CXX_COMPILER g++)
20+
21+
if(BEMAN_BUILDSYS_SANITIZER STREQUAL "MaxSan")
22+
set(SANITIZER_FLAGS
23+
"-fsanitize=address -fsanitize=leak -fsanitize=pointer-compare -fsanitize=pointer-subtract -fsanitize=undefined"
24+
)
25+
elseif(BEMAN_BUILDSYS_SANITIZER STREQUAL "TSan")
26+
set(SANITIZER_FLAGS "-fsanitize=thread")
27+
endif()
28+
29+
set(CMAKE_C_FLAGS_DEBUG_INIT "${SANITIZER_FLAGS}")
30+
set(CMAKE_CXX_FLAGS_DEBUG_INIT "${SANITIZER_FLAGS}")
31+
32+
set(RELEASE_FLAGS "-O3 ${SANITIZER_FLAGS}")
33+
34+
set(CMAKE_C_FLAGS_RELWITHDEBINFO_INIT "${RELEASE_FLAGS}")
35+
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT "${RELEASE_FLAGS}")
36+
37+
set(CMAKE_C_FLAGS_RELEASE_INIT "${RELEASE_FLAGS}")
38+
set(CMAKE_CXX_FLAGS_RELEASE_INIT "${RELEASE_FLAGS}")

cmake/llvm-toolchain.cmake

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
2+
3+
# This toolchain file is not meant to be used directly,
4+
# but to be invoked by CMake preset and GitHub CI.
5+
#
6+
# This toolchain file configures for LLVM family of compiler.
7+
#
8+
# BEMAN_BUILDSYS_SANITIZER:
9+
# This optional CMake parameter is not meant for public use and is subject to
10+
# change.
11+
# Possible values:
12+
# - MaxSan: configures clang and clang++ to use all available non-conflicting
13+
# sanitizers.
14+
# - TSan: configures clang and clang++ to enable the use of thread sanitizer.
15+
16+
include_guard(GLOBAL)
17+
18+
set(CMAKE_C_COMPILER clang)
19+
set(CMAKE_CXX_COMPILER clang++)
20+
21+
if(BEMAN_BUILDSYS_SANITIZER STREQUAL "MaxSan")
22+
set(SANITIZER_FLAGS
23+
"-fsanitize=address -fsanitize=leak -fsanitize=pointer-compare -fsanitize=pointer-subtract -fsanitize=undefined"
24+
)
25+
elseif(BEMAN_BUILDSYS_SANITIZER STREQUAL "TSan")
26+
set(SANITIZER_FLAGS "-fsanitize=thread")
27+
endif()
28+
29+
set(CMAKE_C_FLAGS_DEBUG_INIT "${SANITIZER_FLAGS}")
30+
set(CMAKE_CXX_FLAGS_DEBUG_INIT "${SANITIZER_FLAGS}")
31+
32+
set(RELEASE_FLAGS "-O3 ${SANITIZER_FLAGS}")
33+
34+
set(CMAKE_C_FLAGS_RELWITHDEBINFO_INIT "${RELEASE_FLAGS}")
35+
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT "${RELEASE_FLAGS}")
36+
37+
set(CMAKE_C_FLAGS_RELEASE_INIT "${RELEASE_FLAGS}")
38+
set(CMAKE_CXX_FLAGS_RELEASE_INIT "${RELEASE_FLAGS}")

cmake/msvc-toolchain.cmake

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
2+
3+
# This toolchain file is not meant to be used directly,
4+
# but to be invoked by CMake preset and GitHub CI.
5+
#
6+
# This toolchain file configures for MSVC family of compiler.
7+
#
8+
# BEMAN_BUILDSYS_SANITIZER:
9+
# This optional CMake parameter is not meant for public use and is subject to
10+
# change.
11+
# Possible values:
12+
# - MaxSan: configures cl to use all available non-conflicting sanitizers.
13+
#
14+
# Note that in other toolchain files, TSan is also a possible value for
15+
# BEMAN_BUILDSYS_SANITIZER, however, MSVC does not support thread sanitizer,
16+
# thus this value is omitted.
17+
18+
include_guard(GLOBAL)
19+
20+
set(CMAKE_C_COMPILER cl)
21+
set(CMAKE_CXX_COMPILER cl)
22+
23+
if(BEMAN_BUILDSYS_SANITIZER STREQUAL "MaxSan")
24+
# /Zi flag (add debug symbol) is needed when using address sanitizer
25+
# See C5072: https://learn.microsoft.com/en-us/cpp/error-messages/compiler-warnings/compiler-warning-c5072
26+
set(SANITIZER_FLAGS "/fsanitize=address /Zi")
27+
endif()
28+
29+
set(CMAKE_CXX_FLAGS_DEBUG_INIT "/EHsc /permissive- ${SANITIZER_FLAGS}")
30+
set(CMAKE_C_FLAGS_DEBUG_INIT "/EHsc /permissive- ${SANITIZER_FLAGS}")
31+
32+
set(RELEASE_FLAGS "/EHsc /permissive- /O2 ${SANITIZER_FLAGS}")
33+
34+
set(CMAKE_C_FLAGS_RELWITHDEBINFO_INIT "${RELEASE_FLAGS}")
35+
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT "${RELEASE_FLAGS}")
36+
37+
set(CMAKE_C_FLAGS_RELEASE_INIT "${RELEASE_FLAGS}")
38+
set(CMAKE_CXX_FLAGS_RELEASE_INIT "${RELEASE_FLAGS}")

include/beman/inplace_vector/inplace_vector.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,7 @@ Software.
262262
#include <functional> // for less and equal_to
263263
#include <iterator> // for reverse_iterator and iterator traits
264264
#include <limits> // for numeric_limits
265+
#include <memory> // for destroy
265266
#include <new> // for operator new
266267
#include <ranges>
267268
#include <stdexcept> // for length_error

0 commit comments

Comments
 (0)