Browse code

Add implementation

Robert Cranston authored on 04/10/2021 20:38:56
Showing 1 changed files
... ...
@@ -2,6 +2,13 @@
2 2
 
3 3
 A [CMake][]\>=3.14 [C++][] common project helper.
4 4
 
5
+[CMake][] has many useful features but requires verbose per-project
6
+configuration to enable them. This helper allows you to just place your files
7
+where everyone expects them to be anyway, install the tools you want to use,
8
+and things like downloading dependencies, linting, building, testing,
9
+sanitizing, packaging (build artifacts, assets, documentation), and installing
10
+will automatically be enabled.
11
+
5 12
 [`cmake-common`]: https://git.rcrnstn.net/rcrnstn/cmake-common
6 13
 [CMake]: https://cmake.org
7 14
 [C++]: https://en.wikipedia.org/wiki/C++
... ...
@@ -14,11 +21,281 @@ this work is to simply copy the required files or content into your project,
14 21
 optionally(!) mentioning where it came from in the readme or other
15 22
 documentation. See [License][].
16 23
 
24
+Copy the file [`common.cmake`][] into your project and [`include`][] it from
25
+(e.g.) the main [`CMakeLists.txt`][]. This will define a `common` function that
26
+takes a number of arguments to configure the project.
27
+
17 28
 [License]: #license
29
+[`include`]: https://cmake.org/cmake/help/v3.14/command/include.html
30
+[`common.cmake`]: common.cmake
31
+[`CMakeLists.txt`]: https://cmake.org/cmake/help/v3.14/manual/cmake-language.7.html#directories
32
+
33
+### Overview
34
+
35
+```cmake
36
+## CMake
37
+cmake_minimum_required(VERSION 3.14)
38
+if(NOT CMAKE_BUILD_TYPE)
39
+    set(CMAKE_BUILD_TYPE Debug)
40
+endif()
41
+
42
+## Project
43
+project(project-name
44
+    VERSION 1.0.0
45
+    LANGUAGES CXX
46
+)
47
+
48
+## Main target
49
+add_library(${PROJECT_NAME})
50
+
51
+## Common
52
+include(common.cmake)
53
+common(
54
+    CXX_STANDARD 11
55
+    DISABLE_INCLUDE_WHAT_YOU_USE
56
+    PACKAGES
57
+        Package
58
+    EXTERNAL
59
+        external_project
60
+    FETCHCONTENT
61
+        "https://example.com/user/online_project GIT_TAG v1.2.3"
62
+    DEPENDENCIES_PUBLIC
63
+        Package::Package
64
+    DEPENDENCIES_PRIVATE
65
+        external_project
66
+    DEPENDENCIES_TESTS
67
+        online_project
68
+    DEFINITIONS
69
+        PROJECT_FEATURE
70
+)
71
+```
72
+
73
+### Main target
74
+
75
+If there are files in the `src` and/or `include` directories, they are added as
76
+sources to a single "main" target, which is assumed to already be declared with
77
+the name `${`[`PROJECT_NAME`][]`}` (which is automatically set by CMake when
78
+calling [`project`][]). The "main" target may be of any type, such as [normal
79
+executable][], [normal library][], [interface library][], or [custom target][]
80
+(the latter probably with the `ALL` specifier, so that it is added to the
81
+default build target so that it will be run every time).
82
+
83
+[`PUBLIC`][] dependencies are taken from `DEPENDENCIES_PUBLIC` and
84
+[`PRIVATE`][] dependencies are taken from `DEPENDENCIES_PRIVATE`, see
85
+[Dependencies][].
86
+
87
+For [top level project][]s, `*Config.cmake` and `*ConfigVersion.cmake` files
88
+that can be used by [`find_package`][] to find this project are
89
+[`install`][]ed, see [Packaging][].
90
+
91
+[`PROJECT_NAME`]: https://cmake.org/cmake/help/v3.14/variable/PROJECT_NAME.html
92
+[`project`]: https://cmake.org/cmake/help/v3.14/command/project.html
93
+[normal executable]: https://cmake.org/cmake/help/v3.14/command/add_executable.html#normal-executables
94
+[normal library]: https://cmake.org/cmake/help/v3.14/command/add_library.html#normal-libraries
95
+[interface library]: https://cmake.org/cmake/help/v3.14/command/add_library.html#interface-libraries
96
+[custom target]: https://cmake.org/cmake/help/v3.14/command/add_custom_target.html
97
+[`PUBLIC`]: https://cmake.org/cmake/help/v3.14/manual/cmake-buildsystem.7.html#target-usage-requirements
98
+[`PRIVATE`]: https://cmake.org/cmake/help/v3.14/manual/cmake-buildsystem.7.html#target-usage-requirements
99
+[Dependencies]: #dependencies
100
+[top level project]: https://cmake.org/cmake/help/v3.14/variable/CMAKE_PROJECT_NAME.html
101
+[`find_package`]: https://cmake.org/cmake/help/v3.14/command/find_package.html
102
+[`install`]: https://cmake.org/cmake/help/v3.14/command/install.html
103
+[Packaging]: #packaging
104
+
105
+### Test targets
106
+
107
+For [top level project][]s, every file directly under the `tests` directory is
108
+individually added as a source to a separate executable "test" target, which is
109
+automatically declared with the name `${PROJECT_NAME}-test-${TEST_NAME}` and
110
+passed to [`add_test`][]. All files in the `tests/common` directory are also
111
+added as sources to all "test" targets.
112
+
113
+A ([`PRIVATE`][]) dependency on the "main" target is declared and further
114
+([`PRIVATE`][]) dependencies are taken from `DEPENDENCIES_TESTS`, see
115
+[Dependencies][].
116
+
117
+CMake can be run with the standard `-D`[`BUILD_TESTING`][]`=OFF` to disable
118
+testing.
119
+
120
+See [Testing][].
121
+
122
+[`add_test`]: https://cmake.org/cmake/help/v3.14/command/add_test.html
123
+[`BUILD_TESTING`]: https://cmake.org/cmake/help/v3.14/module/CTest.html
124
+[Testing]: #testing
125
+
126
+### Assets
127
+
128
+If there are files in the `assets` directory, a target named
129
+`${PROJECT_NAME}-assets` that runs by default and [symlink][]s them to
130
+`${`[`CMAKE_BINARY_DIR`][]`}/assets` is automatically declared.
131
+
132
+If the path does not include `/tests/`, the asset is [`install`][]ed into
133
+`${`[`CMAKE_INSTALL_DATADIR`][]`}/${CMAKE_PROJECT_NAME}/assets` (note that
134
+`CMAKE_PROJECT_NAME` is the name of the [top level project][]), see
135
+[Packaging][].
136
+
137
+[symlink]: https://en.wikipedia.org/wiki/Symbolic_link
138
+[`CMAKE_BINARY_DIR`]: https://cmake.org/cmake/help/v3.14/variable/CMAKE_BINARY_DIR.html
139
+[`CMAKE_INSTALL_DATADIR`]: https://cmake.org/cmake/help/v3.14/module/GNUInstallDirs.html
140
+
141
+### Documentation
142
+
143
+For [top level project][]s, documentation from the `doc` directory and
144
+repository root is automatically [`install`][]ed, see [Packaging][].
145
+
146
+### Man pages
147
+
148
+For [top level project][]s, [man page][]s from the `man` directory is
149
+automatically [`install`][]ed, see [Packaging][].
150
+
151
+[man page]: https://en.wikipedia.org/wiki/Man_page
152
+
153
+### Dependencies
154
+
155
+Dependencies on other targets are declared with `DEPENDENCIES_PUBLIC`,
156
+`DEPENDENCIES_PRIVATE`, and `DEPENDENCIES_TESTS`, see [Main target][] and [Test
157
+targets][].
158
+
159
+Three mechanisms to make these dependencies available are provided, given as
160
+arguments to the `common` function:
161
+
162
+-   `PACKAGES`: Packages passed to [`find_package`][]`(...)` in order to find
163
+    system packages.
164
+-   `EXTERNAL`: Subdirectories of `external` that is passed to
165
+    [`add_subdirectory`][].
166
+-   `FETCHCONTENT`: [Git][] [URL][]s passed to [`FetchContent_Declare`][]'s
167
+    `GIT_REPOSITORY`. If a specific [Git tag][] is wanted, specify it in the
168
+    same (quoted) argument, delimited with `GIT_TAG`, see [Usage][].
169
+    (`GIT_SHALLOW` and `GIT_PROGRESS` are always set to `TRUE`).
170
+    [`FetchContent_MakeAvailable`][] is automatically called in order to
171
+    download and make targets available during the CMake configure step.
172
+
173
+If more involved steps are required to make targets available, perform them
174
+manually before calling the `common` function.
175
+
176
+[Main target]: #main-target
177
+[Test targets]: #test-targets
178
+[`add_subdirectory`]: https://cmake.org/cmake/help/v3.14/command/add_subdirectory.html
179
+[Git]: https://git-scm.com
180
+[URL]: https://en.wikipedia.org/wiki/URL
181
+[`FetchContent_Declare`]: https://cmake.org/cmake/help/v3.14/module/FetchContent.html#command:fetchcontent_declare
182
+[`FetchContent_MakeAvailable`]: https://cmake.org/cmake/help/v3.14/module/FetchContent.html#command:fetchcontent_makeavailable
183
+[Git tag]: https://git-scm.com/book/en/v2/Git-Basics-Tagging
184
+[Usage]: #usage
185
+
186
+### Preprocessor definitions
187
+
188
+[Preprocessor definitions][] can be specified with the `DEFINITIONS` argument
189
+to the `common` function. Both `NAME` and `NAME=EXPANSION` forms are supported.
190
+
191
+[preprocessor definitions]: https://en.cppreference.com/w/cpp/preprocessor/replace#.23define_directives
192
+
193
+### Language version
194
+
195
+For [top level project][]s, the `CXX_STANDARD` argument to the `common`
196
+function sets the [`CXX_STANDARD`][] property applied to configured targets
197
+([`CXX_STANDARD_REQUIRED`][] is always set to `ON`, [`CXX_EXTENSIONS`][] is
198
+always set to `OFF`).
199
+
200
+[`CXX_STANDARD`]: https://cmake.org/cmake/help/v3.14/prop_tgt/CXX_STANDARD.html
201
+[`CXX_STANDARD_REQUIRED`]: https://cmake.org/cmake/help/v3.14/prop_tgt/CXX_STANDARD_REQUIRED.html
202
+[`CXX_EXTENSIONS`]: https://cmake.org/cmake/help/v3.14/prop_tgt/CXX_EXTENSIONS.html
203
+
204
+### Build options
205
+
206
+For [top level project][]s, aggressive warnings are enabled and treated as
207
+errors.
208
+
209
+For projects compiled with [GCC][] or [Clang][], [`-Wshadow`][] is enabled by
210
+default, but can be disabled by passing `DISABLE_WSHADOW` to the `common`
211
+function.
212
+
213
+For projects compiled with [MSVC][], [`/Zc:__cplusplus`][] is enabled.
214
+
215
+If supported, [interprocedural optimization][] (also known as link-time
216
+optimization) is enabled.
217
+
218
+For projects compiled with the `Debug` [build type][] with [GCC][] or
219
+[Clang][], [address sanitizer][] ([wiki][address sanitizer wiki]), [leak
220
+sanitizer][] ([wiki][leak sanitizer wiki]), and [undefined behavior
221
+sanitizer][] are linked into all targets. The sanitizers can be disabled by
222
+passing `DISABLE_SANITIZERS` to the `common` function. Suppression files that
223
+match the [glob][]s `*.asan.supp`, `*.lsan.supp`, and `*.ubsan.supp`
224
+respectively in the repository root are automatically used.
225
+
226
+[GCC]: https://gcc.gnu.org
227
+[Clang]: https://clang.llvm.org
228
+[`-Wshadow=`]: https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#index-Wshadow
229
+[MSVC]: https://visualstudio.microsoft.com/vs/
230
+[`/Zc:__cplusplus`]: https://learn.microsoft.com/en-us/cpp/build/reference/zc-cplusplus
231
+[interprocedural optimization]: https://en.wikipedia.org/wiki/Interprocedural_optimization
232
+[build type]: https://cmake.org/cmake/help/v3.14/variable/CMAKE_BUILD_TYPE.html
233
+[address sanitizer]: https://clang.llvm.org/docs/AddressSanitizer.html
234
+[address sanitizer wiki]: https://github.com/google/sanitizers/wiki/AddressSanitizer
235
+[leak sanitizer]: https://clang.llvm.org/docs/LeakSanitizer.html
236
+[leak sanitizer wiki]: https://github.com/google/sanitizers/wiki/AddressSanitizerLeakSanitizer
237
+[undefined behavior sanitizer]: https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html
238
+[glob]: https://en.wikipedia.org/wiki/Glob_(programming)
239
+
240
+### Tools
241
+
242
+For [top level project][]s compiled with the `Debug` [build type][],
243
+[Cppcheck][], [Clang-Tidy][], and [Include What You Use][] are automatically
244
+configured if present on the system. The tools can be disabled by passing the
245
+`DISABLE_CPPCHECK`, `DISABLE_CLANG_TIDY`, and/or `DISABLE_INCLUDE_WHAT_YOU_USE`
246
+options, respectively, to the `common` function. CppCheck suppressions list
247
+files that match the [glob][] `.cppcheck.supp`, a Clang-Tidy configuration file
248
+named `.clang-tidy`, and Include What You Use [mapping files][] that match the
249
+[glob][] `*.iwyu.imp`, in the repository root, are automatically used.
250
+
251
+[Cppcheck]: https://cppcheck.sourceforge.io
252
+[Clang-Tidy]: https://clang.llvm.org/extra/clang-tidy
253
+[Include What You Use]: https://include-what-you-use.org
254
+[mapping files]: https://github.com/include-what-you-use/include-what-you-use/blob/0.20/docs/IWYUMappings.md
255
+
256
+### Testing
257
+
258
+For [top level project][]s, [CTest][] is automatically configured and can be
259
+run with [`ctest`][], see the [`BUILDING.md`][] auxiliary file.
260
+
261
+[CTest]: https://cmake.org/cmake/help/v3.14/module/CTest.html
262
+[`ctest`]: https://cmake.org/cmake/help/v3.14/manual/ctest.1.html
263
+[`BUILDING.md`]: BUILDING.md
264
+
265
+### Packaging
266
+
267
+For [top level project][]s, [CPack][] is automatically configured and can be
268
+run with [`cpack`][], see the [`BUILDING.md`][] auxiliary file.
269
+
270
+[CPack]: https://cmake.org/cmake/help/v3.14/module/Pack.html
271
+[`cpack`]: ttps://cmake.org/cmake/help/v3.14/manual/cpack.1.html
272
+
273
+## Auxiliary files
274
+
275
+This repository includes some files besides [`common.cmake`][] that may be of
276
+use:
277
+
278
+-   [`BUILDING.md`][]: Instructions to build a project that uses
279
+    [`cmake-common`][].
280
+
281
+-   [`.gitignore`][]: A configuration file for [Git][] that makes it ignore the
282
+    created `_build` directory created when following the instructions in
283
+    [`BUILDING.md`][].
284
+
285
+-   [`.cppcheck.supp`][]: A suppressions list for [CppCheck][] with a set of
286
+    suppressed warnings.
287
+
288
+-   [`.clang-tidy`][]: A configuration file for [Clang-Tidy][] with a set of
289
+    enabled and disabled warnings.
290
+
291
+[`.gitignore`]: .gitignore
292
+[`.cppcheck.supp`]: .cppcheck.supp
293
+[`.clang-tidy`]: .clang-tidy
18 294
 
19 295
 ## License
20 296
 
21 297
 Licensed under the [BSD 0-Clause License][] unless otherwise noted, see the
22
-[`LICENSE`](LICENSE) file.
298
+[`LICENSE`][] file.
23 299
 
24 300
 [BSD 0-Clause License]: https://choosealicense.com/licenses/0bsd/
301
+[`LICENSE`]: LICENSE
Browse code

Add license

Robert Cranston authored on 04/10/2021 20:38:50
Showing 1 changed files
... ...
@@ -5,3 +5,20 @@ A [CMake][]\>=3.14 [C++][] common project helper.
5 5
 [`cmake-common`]: https://git.rcrnstn.net/rcrnstn/cmake-common
6 6
 [CMake]: https://cmake.org
7 7
 [C++]: https://en.wikipedia.org/wiki/C++
8
+
9
+## Usage
10
+
11
+This work is licensed in such a way that you may use it however you please,
12
+including relicensing, without attribution. As such, the encouraged way to use
13
+this work is to simply copy the required files or content into your project,
14
+optionally(!) mentioning where it came from in the readme or other
15
+documentation. See [License][].
16
+
17
+[License]: #license
18
+
19
+## License
20
+
21
+Licensed under the [BSD 0-Clause License][] unless otherwise noted, see the
22
+[`LICENSE`](LICENSE) file.
23
+
24
+[BSD 0-Clause License]: https://choosealicense.com/licenses/0bsd/
Browse code

Add readme

Robert Cranston authored on 04/10/2021 20:35:13
Showing 1 changed files
1 1
new file mode 100644
... ...
@@ -0,0 +1,7 @@
1
+# [`cmake-common`][]
2
+
3
+A [CMake][]\>=3.14 [C++][] common project helper.
4
+
5
+[`cmake-common`]: https://git.rcrnstn.net/rcrnstn/cmake-common
6
+[CMake]: https://cmake.org
7
+[C++]: https://en.wikipedia.org/wiki/C++