Commit 911ee02f6c8251b11db72f3ad248d6a8c1debb03

Authored by Henry Schreiner
Committed by Henry Schreiner
1 parent 05586a9b

style: run pre-commit

.ci/azure-build.yml
... ... @@ -8,4 +8,3 @@ steps:
8 8 - script: cmake --build .
9 9 displayName: 'Build'
10 10 workingDirectory: build
11   -
... ...
.ci/azure-test.yml
... ... @@ -8,5 +8,3 @@ steps:
8 8 inputs:
9 9 testResultsFormat: 'cTest'
10 10 testResultsFiles: '**/Test.xml'
11   -
12   -
... ...
.ci/build_doxygen.sh
... ... @@ -23,4 +23,3 @@ export PATH="${DEPS_DIR}/doxygen/build/bin:${PATH}"
23 23 cd "${TRAVIS_BUILD_DIR}"
24 24  
25 25 set +evx
26   -
... ...
.clang-tidy
... ... @@ -22,4 +22,3 @@ HeaderFilterRegex: '.*hpp'
22 22 CheckOptions:
23 23 - key: google-readability-braces-around-statements.ShortStatementLines
24 24 value: '3'
25   -
... ...
.github/workflows/tests.yml
... ... @@ -178,5 +178,3 @@ jobs:
178 178 - name: Check CMake 3.20
179 179 uses: ./.github/actions/quick_cmake
180 180 if: success() || failure()
181   -
182   -
... ...
CLI11.CPack.Description.txt
1 1 CLI11 provides all the features you expect in a powerful command line parser, with a beautiful, minimal syntax and no dependencies beyond C++11. It is header only, and comes in a single file form for easy inclusion in projects. It is easy to use for small projects, but powerful enough for complex command line projects, and can be customized for frameworks.
2   -
... ...
CMakeLists.txt
... ... @@ -7,26 +7,29 @@ cmake_minimum_required(VERSION 3.4)
7 7 # We don't use the 3.4...3.17 syntax because of a bug in an older MSVC's
8 8 # built-in and modified CMake 3.11
9 9 if(${CMAKE_VERSION} VERSION_LESS 3.17)
10   - cmake_policy(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION})
  10 + cmake_policy(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION})
11 11 else()
12   - cmake_policy(VERSION 3.17)
  12 + cmake_policy(VERSION 3.17)
13 13 endif()
14 14  
15 15 set(VERSION_REGEX "#define CLI11_VERSION[ \t]+\"(.+)\"")
16 16  
17 17 # Read in the line containing the version
18   -file(STRINGS "${CMAKE_CURRENT_SOURCE_DIR}/include/CLI/Version.hpp"
19   - VERSION_STRING REGEX ${VERSION_REGEX})
  18 +file(STRINGS "${CMAKE_CURRENT_SOURCE_DIR}/include/CLI/Version.hpp" VERSION_STRING
  19 + REGEX ${VERSION_REGEX})
20 20  
21 21 # Pick out just the version
22 22 string(REGEX REPLACE ${VERSION_REGEX} "\\1" VERSION_STRING "${VERSION_STRING}")
23 23  
24 24 # Add the project
25   -project(CLI11 LANGUAGES CXX VERSION ${VERSION_STRING})
  25 +project(
  26 + CLI11
  27 + LANGUAGES CXX
  28 + VERSION ${VERSION_STRING})
26 29  
27 30 # Print the version number of CMake if this is the main project
28 31 if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME)
29   - message(STATUS "CMake ${CMAKE_VERSION}")
  32 + message(STATUS "CMake ${CMAKE_VERSION}")
30 33 endif()
31 34  
32 35 include(CMakeDependentOption)
... ... @@ -34,7 +37,7 @@ include(GNUInstallDirs)
34 37 include(CTest)
35 38  
36 39 if(NOT CMAKE_VERSION VERSION_LESS 3.11)
37   - include(FetchContent)
  40 + include(FetchContent)
38 41 endif()
39 42  
40 43 find_package(Doxygen)
... ... @@ -49,83 +52,76 @@ list(APPEND build-docs "Doxygen_FOUND")
49 52  
50 53 # Necessary to support paths with spaces, see #457
51 54 if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/docs")
52   - set(docs_EXIST TRUE)
  55 + set(docs_EXIST TRUE)
53 56 else()
54   - set(docs_EXIST FALSE)
  57 + set(docs_EXIST FALSE)
55 58 endif()
56 59 list(APPEND build-docs "docs_EXIST")
57 60  
58 61 if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/examples")
59   - set(examples_EXIST TRUE)
  62 + set(examples_EXIST TRUE)
60 63 else()
61   - set(examples_EXIST FALSE)
  64 + set(examples_EXIST FALSE)
62 65 endif()
63 66  
64 67 option(CLI11_WARNINGS_AS_ERRORS "Turn all warnings into errors (for CI)")
65 68 option(CLI11_SINGLE_FILE "Generate a single header file")
66   -cmake_dependent_option(CLI11_SANITIZERS
67   - "Download the sanitizers CMake config" OFF
68   - "NOT CMAKE_VERSION VERSION_LESS 3.11" OFF)
  69 +cmake_dependent_option(CLI11_SANITIZERS "Download the sanitizers CMake config" OFF
  70 + "NOT CMAKE_VERSION VERSION_LESS 3.11" OFF)
69 71  
70   -cmake_dependent_option(CLI11_BUILD_DOCS
71   - "Build CLI11 documentation" ON
72   - "${build-docs}" OFF)
  72 +cmake_dependent_option(CLI11_BUILD_DOCS "Build CLI11 documentation" ON "${build-docs}" OFF)
73 73  
74   -cmake_dependent_option(CLI11_BUILD_TESTS
75   - "Build CLI11 tests" ON
76   - "BUILD_TESTING;CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME" OFF)
  74 +cmake_dependent_option(CLI11_BUILD_TESTS "Build CLI11 tests" ON
  75 + "BUILD_TESTING;CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME" OFF)
77 76  
78   -cmake_dependent_option(CLI11_BUILD_EXAMPLES
79   - "Build CLI11 examples" ON
80   - "CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME;${examples_EXIST}" OFF)
  77 +cmake_dependent_option(CLI11_BUILD_EXAMPLES "Build CLI11 examples" ON
  78 + "CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME;${examples_EXIST}" OFF)
81 79  
82   -cmake_dependent_option(CLI11_BUILD_EXAMPLES_JSON
83   - "Build CLI11 json example" OFF
84   - "CLI11_BUILD_EXAMPLES;NOT CMAKE_VERSION VERSION_LESS 3.11" OFF)
  80 +cmake_dependent_option(CLI11_BUILD_EXAMPLES_JSON "Build CLI11 json example" OFF
  81 + "CLI11_BUILD_EXAMPLES;NOT CMAKE_VERSION VERSION_LESS 3.11" OFF)
85 82  
86   -cmake_dependent_option(CLI11_SINGLE_FILE_TESTS
87   - "Duplicate all the tests for a single file build" OFF
88   - "BUILD_TESTING;CLI11_SINGLE_FILE" OFF)
  83 +cmake_dependent_option(CLI11_SINGLE_FILE_TESTS "Duplicate all the tests for a single file build"
  84 + OFF "BUILD_TESTING;CLI11_SINGLE_FILE" OFF)
89 85  
90   -cmake_dependent_option(CLI11_INSTALL
91   - "Install the CLI11 folder to include during install process" ON
92   - "CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME" OFF)
  86 +cmake_dependent_option(CLI11_INSTALL "Install the CLI11 folder to include during install process"
  87 + ON "CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME" OFF)
93 88  
94   -cmake_dependent_option(CLI11_FORCE_LIBCXX
95   - "Force clang to use libc++ instead of libstdc++ (Linux only)" OFF
96   - "${force-libcxx}" OFF)
  89 +cmake_dependent_option(
  90 + CLI11_FORCE_LIBCXX "Force clang to use libc++ instead of libstdc++ (Linux only)" OFF
  91 + "${force-libcxx}" OFF)
97 92  
98   -cmake_dependent_option(CLI11_CUDA_TESTS
99   - "Build the tests with NVCC to check for warnings there - requires CMake 3.9+" OFF
100   - "CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME" OFF)
  93 +cmake_dependent_option(
  94 + CLI11_CUDA_TESTS "Build the tests with NVCC to check for warnings there - requires CMake 3.9+"
  95 + OFF "CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME" OFF)
101 96  
102   -cmake_dependent_option(CLI11_CLANG_TIDY
103   - "Look for and use Clang-Tidy" OFF
104   - "CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME;NOT CMAKE_VERSION VERSION_LESS 3.6" OFF)
105   -set(CLI11_CLANG_TIDY_OPTIONS "" CACHE STRING "Clang tidy options, such as -fix, semicolon separated")
  97 +cmake_dependent_option(
  98 + CLI11_CLANG_TIDY "Look for and use Clang-Tidy" OFF
  99 + "CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME;NOT CMAKE_VERSION VERSION_LESS 3.6" OFF)
  100 +set(CLI11_CLANG_TIDY_OPTIONS
  101 + ""
  102 + CACHE STRING "Clang tidy options, such as -fix, semicolon separated")
106 103  
107 104 if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME AND NOT DEFINED CMAKE_CXX_STANDARD)
108   - set(CMAKE_CXX_STANDARD 11)
  105 + set(CMAKE_CXX_STANDARD 11)
109 106 endif()
110 107  
111 108 if(NOT DEFINED CMAKE_CXX_EXTENSIONS)
112   - set(CMAKE_CXX_EXTENSIONS OFF)
  109 + set(CMAKE_CXX_EXTENSIONS OFF)
113 110 endif()
114 111  
115 112 if(NOT DEFINED CMAKE_CXX_STANDARD_REQUIRED)
116   - set(CMAKE_CXX_STANDARD_REQUIRED ON)
  113 + set(CMAKE_CXX_STANDARD_REQUIRED ON)
117 114 endif()
118 115  
119   -
120 116 # Allow IDE's to group targets into folders
121 117 if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME)
122   - set_property(GLOBAL PROPERTY USE_FOLDERS ON)
  118 + set_property(GLOBAL PROPERTY USE_FOLDERS ON)
123 119 endif()
124 120  
125 121 if(CMAKE_VERSION VERSION_LESS 3.10)
126   - message(STATUS "CMake 3.10+ adds Doxygen support. Update CMake to build documentation")
  122 + message(STATUS "CMake 3.10+ adds Doxygen support. Update CMake to build documentation")
127 123 elseif(NOT Doxygen_FOUND)
128   - message(STATUS "Doxygen not found, building docs has been disabled")
  124 + message(STATUS "Doxygen not found, building docs has been disabled")
129 125 endif()
130 126  
131 127 # Special target that adds warnings. Is not exported.
... ... @@ -135,32 +131,28 @@ set(unix-warnings -Wall -Wextra -pedantic -Wshadow -Wsign-conversion -Wswitch-en
135 131  
136 132 # Buggy in GCC 4.8
137 133 if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.9)
138   - list(APPEND unix-warnings -Weffc++)
  134 + list(APPEND unix-warnings -Weffc++)
139 135 endif()
140 136  
141   -target_compile_options(CLI11_warnings
142   - INTERFACE
143   - $<$<BOOL:${CLI11_FORCE_LIBCXX}>:-stdlib=libc++>
144   - $<$<CXX_COMPILER_ID:MSVC>:/W4 $<$<BOOL:${CLI11_WARNINGS_AS_ERRORS}>:/WX>>
145   - $<$<NOT:$<CXX_COMPILER_ID:MSVC>>:${unix-warnings} $<$<BOOL:${CLI11_WARNINGS_AS_ERRORS}>:-Werror>>)
146   -
147   -
148   - if(NOT CMAKE_VERSION VERSION_LESS 3.13)
149   - target_link_options(CLI11_warnings
150   - INTERFACE
151   - $<$<BOOL:${CLI11_FORCE_LIBCXX}>:-stdlib=libc++>)
152   - endif()
  137 +target_compile_options(
  138 + CLI11_warnings
  139 + INTERFACE $<$<BOOL:${CLI11_FORCE_LIBCXX}>:-stdlib=libc++>
  140 + $<$<CXX_COMPILER_ID:MSVC>:/W4
  141 + $<$<BOOL:${CLI11_WARNINGS_AS_ERRORS}>:/WX>>
  142 + $<$<NOT:$<CXX_COMPILER_ID:MSVC>>:${unix-warnings}
  143 + $<$<BOOL:${CLI11_WARNINGS_AS_ERRORS}>:-Werror>>)
153 144  
  145 +if(NOT CMAKE_VERSION VERSION_LESS 3.13)
  146 + target_link_options(CLI11_warnings INTERFACE $<$<BOOL:${CLI11_FORCE_LIBCXX}>:-stdlib=libc++>)
  147 +endif()
154 148  
155 149 # Allow IDE's to group targets into folders
156 150 add_library(CLI11 INTERFACE)
157 151 add_library(CLI11::CLI11 ALIAS CLI11) # for add_subdirectory calls
158 152  
159 153 # Duplicated because CMake adds the current source dir if you don't.
160   -target_include_directories(CLI11 INTERFACE
161   - $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
162   - $<INSTALL_INTERFACE:include>)
163   -
  154 +target_include_directories(CLI11 INTERFACE $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
  155 + $<INSTALL_INTERFACE:include>)
164 156  
165 157 # To see in IDE, headers must be listed for target
166 158 set(header-patterns "${PROJECT_SOURCE_DIR}/include/CLI/*")
... ... @@ -171,104 +163,96 @@ endif()
171 163 file(GLOB CLI11_headers ${header-patterns})
172 164  
173 165 # Allow tests to be run on CUDA
174   - if(CLI11_CUDA_TESTS)
175   - enable_language(CUDA)
176   -
177   - # Print out warning and error numbers
178   - set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -Xcudafe --display_error_number")
179   - endif()
  166 +if(CLI11_CUDA_TESTS)
  167 + enable_language(CUDA)
180 168  
  169 + # Print out warning and error numbers
  170 + set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -Xcudafe --display_error_number")
  171 +endif()
181 172  
182 173 # Prepare Clang-Tidy
183 174 if(CLI11_CLANG_TIDY)
184   - find_program(
185   - CLANG_TIDY_EXE
186   - NAMES "clang-tidy"
187   - DOC "Path to clang-tidy executable"
188   - REQUIRED
189   - )
190   -
191   - set(DO_CLANG_TIDY "${CLANG_TIDY_EXE}" ${CLI11_CLANG_TIDY_OPTIONS})
192   -endif()
  175 + find_program(
  176 + CLANG_TIDY_EXE
  177 + NAMES "clang-tidy"
  178 + DOC "Path to clang-tidy executable" REQUIRED)
193 179  
  180 + set(DO_CLANG_TIDY "${CLANG_TIDY_EXE}" ${CLI11_CLANG_TIDY_OPTIONS})
  181 +endif()
194 182  
195 183 # This folder should be installed
196 184 if(CLI11_INSTALL)
197   - install(DIRECTORY "${PROJECT_SOURCE_DIR}/include/"
198   - DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}")
  185 + install(DIRECTORY "${PROJECT_SOURCE_DIR}/include/" DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}")
199 186  
200   - # Make an export target
201   - install(TARGETS CLI11 EXPORT CLI11Targets)
  187 + # Make an export target
  188 + install(TARGETS CLI11 EXPORT CLI11Targets)
202 189  
203   - # Use find_package on the installed package
204   - # Since we have no custom code, we can directly write this
205   - # to Config.cmake (otherwise we'd have a custom config and would
206   - # import Targets.cmake
  190 + # Use find_package on the installed package
  191 + # Since we have no custom code, we can directly write this
  192 + # to Config.cmake (otherwise we'd have a custom config and would
  193 + # import Targets.cmake
207 194  
208   - # Add the version in a CMake readable way
209   - configure_file("cmake/CLI11ConfigVersion.cmake.in"
210   - "CLI11ConfigVersion.cmake" @ONLY)
  195 + # Add the version in a CMake readable way
  196 + configure_file("cmake/CLI11ConfigVersion.cmake.in" "CLI11ConfigVersion.cmake" @ONLY)
211 197  
212   - # Make version available in the install
213   - install(FILES "${PROJECT_BINARY_DIR}/CLI11ConfigVersion.cmake"
214   - DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/CLI11")
  198 + # Make version available in the install
  199 + install(FILES "${PROJECT_BINARY_DIR}/CLI11ConfigVersion.cmake"
  200 + DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/CLI11")
215 201  
216   - # Install the export target as a file
217   - install(EXPORT CLI11Targets
218   - FILE CLI11Config.cmake
219   - NAMESPACE CLI11::
220   - DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/CLI11")
  202 + # Install the export target as a file
  203 + install(
  204 + EXPORT CLI11Targets
  205 + FILE CLI11Config.cmake
  206 + NAMESPACE CLI11::
  207 + DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/CLI11")
221 208  
222   - # Use find_package on the installed package
223   - export(TARGETS CLI11
224   - NAMESPACE CLI11::
225   - FILE CLI11Targets.cmake)
  209 + # Use find_package on the installed package
  210 + export(
  211 + TARGETS CLI11
  212 + NAMESPACE CLI11::
  213 + FILE CLI11Targets.cmake)
226 214  
227   - include(cmake/CLI11GeneratePkgConfig.cmake)
  215 + include(cmake/CLI11GeneratePkgConfig.cmake)
228 216  
229   - # Register in the user cmake package registry
230   - export(PACKAGE CLI11)
  217 + # Register in the user cmake package registry
  218 + export(PACKAGE CLI11)
231 219 endif()
232 220  
233 221 if(CLI11_SINGLE_FILE)
234   - # Single file test
235   - if(CMAKE_VERSION VERSION_LESS 3.12)
236   - find_package(PythonInterp REQUIRED)
237   - add_executable(Python::Interpreter IMPORTED)
238   - set_target_properties(Python::Interpreter
239   - PROPERTIES
240   - IMPORTED_LOCATION "${PYTHON_EXECUTABLE}"
241   - VERSION "${PYTHON_VERSION_STRING}")
242   - else()
243   - find_package(Python COMPONENTS Interpreter REQUIRED)
244   - endif()
245   -
246   - file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/include")
247   - add_custom_command(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/include/CLI11.hpp"
248   - COMMAND Python::Interpreter
249   - "${CMAKE_CURRENT_SOURCE_DIR}/scripts/MakeSingleHeader.py"
250   - ${CLI11_headers}
251   - --main "${CMAKE_CURRENT_SOURCE_DIR}/CLI11.hpp.in"
252   - --output "${CMAKE_CURRENT_BINARY_DIR}/include/CLI11.hpp"
253   - --version "${CLI11_VERSION}"
254   - DEPENDS
255   - "${CMAKE_CURRENT_SOURCE_DIR}/include/CLI/CLI.hpp"
256   - ${CLI11_headers})
257   - add_custom_target(CLI11-generate-single-file ALL
258   - DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/include/CLI11.hpp")
259   - set_property(TARGET CLI11-generate-single-file PROPERTY FOLDER "Scripts")
260   - install(FILES "${CMAKE_CURRENT_BINARY_DIR}/include/CLI11.hpp"
261   - DESTINATION include)
262   - add_library(CLI11_SINGLE INTERFACE)
263   - target_link_libraries(CLI11_SINGLE INTERFACE CLI11)
264   - add_dependencies(CLI11_SINGLE CLI11-generate-single-file)
265   - target_compile_definitions(CLI11_SINGLE INTERFACE -DCLI11_SINGLE_FILE)
266   - target_include_directories(CLI11_SINGLE INTERFACE
267   - $<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/include/>
268   - $<INSTALL_INTERFACE:include>)
  222 + # Single file test
  223 + if(CMAKE_VERSION VERSION_LESS 3.12)
  224 + find_package(PythonInterp REQUIRED)
  225 + add_executable(Python::Interpreter IMPORTED)
  226 + set_target_properties(Python::Interpreter PROPERTIES IMPORTED_LOCATION "${PYTHON_EXECUTABLE}"
  227 + VERSION "${PYTHON_VERSION_STRING}")
  228 + else()
  229 + find_package(
  230 + Python
  231 + COMPONENTS Interpreter
  232 + REQUIRED)
  233 + endif()
  234 +
  235 + file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/include")
  236 + add_custom_command(
  237 + OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/include/CLI11.hpp"
  238 + COMMAND
  239 + Python::Interpreter "${CMAKE_CURRENT_SOURCE_DIR}/scripts/MakeSingleHeader.py"
  240 + ${CLI11_headers} --main "${CMAKE_CURRENT_SOURCE_DIR}/CLI11.hpp.in" --output
  241 + "${CMAKE_CURRENT_BINARY_DIR}/include/CLI11.hpp" --version "${CLI11_VERSION}"
  242 + DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/include/CLI/CLI.hpp" ${CLI11_headers})
  243 + add_custom_target(CLI11-generate-single-file ALL
  244 + DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/include/CLI11.hpp")
  245 + set_property(TARGET CLI11-generate-single-file PROPERTY FOLDER "Scripts")
  246 + install(FILES "${CMAKE_CURRENT_BINARY_DIR}/include/CLI11.hpp" DESTINATION include)
  247 + add_library(CLI11_SINGLE INTERFACE)
  248 + target_link_libraries(CLI11_SINGLE INTERFACE CLI11)
  249 + add_dependencies(CLI11_SINGLE CLI11-generate-single-file)
  250 + target_compile_definitions(CLI11_SINGLE INTERFACE -DCLI11_SINGLE_FILE)
  251 + target_include_directories(
  252 + CLI11_SINGLE INTERFACE $<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/include/>
  253 + $<INSTALL_INTERFACE:include>)
269 254 endif()
270 255  
271   -
272 256 if(CLI11_BUILD_TESTS)
273 257 add_subdirectory(tests)
274 258 endif()
... ... @@ -283,7 +267,7 @@ endif()
283 267  
284 268 # From a build system, this might not be included.
285 269 if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/book")
286   - add_subdirectory(book)
  270 + add_subdirectory(book)
287 271 endif()
288 272  
289 273 # Packaging support
... ... @@ -316,12 +300,10 @@ set(CPACK_SOURCE_IGNORE_FILES
316 300 .swp
317 301 /.all-contributorsrc
318 302 /.appveyor.yml
319   - /.pre-commit.*yaml
320   -)
  303 + /.pre-commit.*yaml)
321 304  
322 305 set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "all")
323 306 set(CPACK_DEBIAN_COMPRESSION_TYPE "xz")
324 307 set(CPACK_DEBIAN_PACKAGE_NAME "libcli11-dev")
325 308  
326 309 include(CPack)
327   -
... ...
CPPLINT.cfg
... ... @@ -11,4 +11,3 @@ filter=-runtime/references # Requires fundamental change of API, don&#39;t see need
11 11 filter=-whitespace/blank_line # Unnecessarily strict with blank lines that otherwise help with readability
12 12 filter=-whitespace/indent # Requires strange 3-space indent of private/protected/public markers
13 13 filter=-whitespace/parens,-whitespace/braces # Conflict with clang-format
14   -
... ...
book/CMakeLists.txt
  1 +set(book_sources README.md SUMMARY.md)
1 2  
2   -set(
3   - book_sources
4   - README.md
5   - SUMMARY.md
6   -)
7   -
8   -file(GLOB book_chapters RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} chapters/*.md)
  3 +file(
  4 + GLOB book_chapters
  5 + RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
  6 + chapters/*.md)
9 7 add_custom_target(cli_book SOURCES ${book_sources} ${book_chapters})
10   -
... ...
book/README.md
... ... @@ -64,6 +64,3 @@ CLI11 was developed at the [University of Cincinnati] in support of the [GooFit]
64 64 [University of Cincinnati]: http://www.uc.edu
65 65 [Plumbum]: http://plumbum.readthedocs.io/en/latest/
66 66 [Click]: https://click.palletsprojects.com/
67   -
68   -
69   -
... ...
book/SUMMARY.md
... ... @@ -13,4 +13,3 @@
13 13 * [Toolkits](/chapters/toolkits.md)
14 14 * [Advanced topics](/chapters/advanced-topics.md)
15 15 * [Internals](/chapters/internals.md)
16   -
... ...
book/chapters/basics.md
... ... @@ -24,4 +24,3 @@ Usage: ./a.out [OPTIONS]
24 24 Options:
25 25 -h,--help Print this help message and exit
26 26 ```
27   -
... ...
book/chapters/formatting.md
... ... @@ -72,7 +72,3 @@ Notes:
72 72  
73 73 * `*1`: This signature depends on whether the call is from a positional or optional.
74 74 * `o` is opt pointer, `p` is true if positional.
75   -
76   -
77   -
78   -
... ...
book/chapters/internals.md
... ... @@ -41,5 +41,3 @@ The `_process` procedure runs the following steps; each step is recursive and co
41 41 ## Exceptions
42 42  
43 43 The library immediately returns a C++ exception when it detects a problem, such as an incorrect construction or a malformed command line.
44   -
45   -
... ...
book/chapters/options.md
... ... @@ -266,4 +266,3 @@ There are some additional options that can be specified to modify an option for
266 266  
267 267 ## Unusual circumstances
268 268 There are a few cases where some things break down in the type system managing options and definitions. Using the `add_option` method defines a lambda function to extract a default value if required. In most cases this either straightforward or a failure is detected automatically and handled. But in a few cases a streaming template is available that several layers down may not actually be defined. The conditions in CLI11 cannot detect this circumstance automatically and will result in compile error. One specific known case is `boost::optional` if the boost optional_io header is included. This header defines a template for all boost optional values even if they do no actually have a streaming operator. For example `boost::optional<std::vector>` does not have a streaming operator but one is detected since it is part of a template. For these cases a secondary method `app->add_option_no_stream(...)` is provided that bypasses this operation completely and should compile in these cases.
269   -
... ...
book/chapters/validators.md
... ... @@ -60,5 +60,3 @@ And, the protected members that you can set when you make your own are:
60 60 | `int` (`-1`) | `application_index_` | The element this validator applies to (-1 for all) |
61 61 | `bool` (`true`) | `active_` | This can be disabled |
62 62 | `bool` (`false`) | `non_modifying_` | Specify that this is a Validator instead of a Transformer |
63   -
64   -
... ...
book/code/CMakeLists.txt
... ... @@ -12,27 +12,21 @@ enable_testing()
12 12  
13 13 # Quick function to add the base executable
14 14 function(add_cli_exe NAME)
15   - add_executable(${NAME} ${NAME}.cpp)
16   - target_link_libraries(${NAME} CLI11::CLI11)
  15 + add_executable(${NAME} ${NAME}.cpp)
  16 + target_link_libraries(${NAME} CLI11::CLI11)
17 17 endfunction()
18 18  
19   -
20 19 add_cli_exe(simplest)
21 20 add_test(NAME simplest COMMAND simplest)
22 21  
23   -
24 22 add_cli_exe(intro)
25 23 add_test(NAME intro COMMAND intro)
26 24 add_test(NAME intro_p COMMAND intro -p 5)
27 25  
28   -
29 26 add_cli_exe(flags)
30 27 add_test(NAME flags COMMAND flags)
31 28 add_test(NAME flags_bip COMMAND flags -b -i -p)
32 29  
33   -
34 30 add_cli_exe(geet)
35   -add_test(NAME geet_add COMMAND geet add)
  31 +add_test(NAME geet_add COMMAND geet add)
36 32 add_test(NAME geet_commit COMMAND geet commit -m "Test")
37   -
38   -
... ...
cmake/CLI11GeneratePkgConfig.cmake
1 1 configure_file("cmake/CLI11.pc.in" "CLI11.pc" @ONLY)
2 2  
3   -install(FILES "${PROJECT_BINARY_DIR}/CLI11.pc"
4   - DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
5   -
6   -
  3 +install(FILES "${PROJECT_BINARY_DIR}/CLI11.pc" DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
... ...
cmake/CodeCoverage.cmake
... ... @@ -69,57 +69,51 @@
69 69 include(CMakeParseArguments)
70 70  
71 71 # Check prereqs
72   -find_program( GCOV_PATH gcov )
73   -find_program( LCOV_PATH NAMES lcov lcov.bat lcov.exe lcov.perl)
74   -find_program( GENHTML_PATH NAMES genhtml genhtml.perl genhtml.bat )
75   -find_program( GCOVR_PATH gcovr PATHS ${CMAKE_SOURCE_DIR}/scripts/test)
76   -find_program( SIMPLE_PYTHON_EXECUTABLE python )
  72 +find_program(GCOV_PATH gcov)
  73 +find_program(LCOV_PATH NAMES lcov lcov.bat lcov.exe lcov.perl)
  74 +find_program(GENHTML_PATH NAMES genhtml genhtml.perl genhtml.bat)
  75 +find_program(GCOVR_PATH gcovr PATHS ${CMAKE_SOURCE_DIR}/scripts/test)
  76 +find_program(SIMPLE_PYTHON_EXECUTABLE python)
77 77  
78 78 if(NOT GCOV_PATH)
79   - message(FATAL_ERROR "gcov not found! Aborting...")
  79 + message(FATAL_ERROR "gcov not found! Aborting...")
80 80 endif() # NOT GCOV_PATH
81 81  
82 82 if("${CMAKE_CXX_COMPILER_ID}" MATCHES "(Apple)?[Cc]lang")
83   - if("${CMAKE_CXX_COMPILER_VERSION}" VERSION_LESS 3)
84   - message(FATAL_ERROR "Clang version must be 3.0.0 or greater! Aborting...")
85   - endif()
  83 + if("${CMAKE_CXX_COMPILER_VERSION}" VERSION_LESS 3)
  84 + message(FATAL_ERROR "Clang version must be 3.0.0 or greater! Aborting...")
  85 + endif()
86 86 elseif(NOT CMAKE_COMPILER_IS_GNUCXX)
87   - message(FATAL_ERROR "Compiler is not GNU gcc! Aborting...")
  87 + message(FATAL_ERROR "Compiler is not GNU gcc! Aborting...")
88 88 endif()
89 89  
90   -set(COVERAGE_COMPILER_FLAGS "-g -O0 --coverage -fprofile-arcs -ftest-coverage -fno-inline -fno-inline-small-functions -fno-default-inline"
  90 +set(COVERAGE_COMPILER_FLAGS
  91 + "-g -O0 --coverage -fprofile-arcs -ftest-coverage -fno-inline -fno-inline-small-functions -fno-default-inline"
91 92 CACHE INTERNAL "")
92 93  
93 94 set(CMAKE_CXX_FLAGS_COVERAGE
94 95 ${COVERAGE_COMPILER_FLAGS}
95   - CACHE STRING "Flags used by the C++ compiler during coverage builds."
96   - FORCE )
  96 + CACHE STRING "Flags used by the C++ compiler during coverage builds." FORCE)
97 97 set(CMAKE_C_FLAGS_COVERAGE
98 98 ${COVERAGE_COMPILER_FLAGS}
99   - CACHE STRING "Flags used by the C compiler during coverage builds."
100   - FORCE )
  99 + CACHE STRING "Flags used by the C compiler during coverage builds." FORCE)
101 100 set(CMAKE_EXE_LINKER_FLAGS_COVERAGE
102 101 ""
103   - CACHE STRING "Flags used for linking binaries during coverage builds."
104   - FORCE )
  102 + CACHE STRING "Flags used for linking binaries during coverage builds." FORCE)
105 103 set(CMAKE_SHARED_LINKER_FLAGS_COVERAGE
106 104 ""
107   - CACHE STRING "Flags used by the shared libraries linker during coverage builds."
108   - FORCE )
109   -mark_as_advanced(
110   - CMAKE_CXX_FLAGS_COVERAGE
111   - CMAKE_C_FLAGS_COVERAGE
112   - CMAKE_EXE_LINKER_FLAGS_COVERAGE
113   - CMAKE_SHARED_LINKER_FLAGS_COVERAGE )
  105 + CACHE STRING "Flags used by the shared libraries linker during coverage builds." FORCE)
  106 +mark_as_advanced(CMAKE_CXX_FLAGS_COVERAGE CMAKE_C_FLAGS_COVERAGE CMAKE_EXE_LINKER_FLAGS_COVERAGE
  107 + CMAKE_SHARED_LINKER_FLAGS_COVERAGE)
114 108  
115 109 if(NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
116   - message(WARNING "Code coverage results with an optimised (non-Debug) build may be misleading")
  110 + message(WARNING "Code coverage results with an optimised (non-Debug) build may be misleading")
117 111 endif() # NOT CMAKE_BUILD_TYPE STREQUAL "Debug"
118 112  
119 113 if(CMAKE_C_COMPILER_ID STREQUAL "GNU")
120   - link_libraries(gcov)
  114 + link_libraries(gcov)
121 115 else()
122   - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --coverage")
  116 + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --coverage")
123 117 endif()
124 118  
125 119 # Defines a target for running and collection code coverage information
... ... @@ -134,54 +128,57 @@ endif()
134 128 # )
135 129 function(SETUP_TARGET_FOR_COVERAGE)
136 130  
137   - set(options NONE)
138   - set(oneValueArgs NAME)
139   - set(multiValueArgs EXECUTABLE EXECUTABLE_ARGS DEPENDENCIES)
140   - cmake_parse_arguments(Coverage "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
141   -
142   - if(NOT LCOV_PATH)
143   - message(FATAL_ERROR "lcov not found! Aborting...")
144   - endif() # NOT LCOV_PATH
145   -
146   - if(NOT GENHTML_PATH)
147   - message(FATAL_ERROR "genhtml not found! Aborting...")
148   - endif() # NOT GENHTML_PATH
149   -
150   - # Setup target
151   - add_custom_target(${Coverage_NAME}
152   -
153   - # Cleanup lcov
154   - COMMAND ${LCOV_PATH} --directory . --zerocounters
155   - # Create baseline to make sure untouched files show up in the report
156   - COMMAND ${LCOV_PATH} -c -i -d . -o ${Coverage_NAME}.base
157   -
158   - # Run tests
159   - COMMAND ${Coverage_EXECUTABLE}
160   -
161   - # Capturing lcov counters and generating report
162   - COMMAND ${LCOV_PATH} --directory . --capture --output-file ${Coverage_NAME}.info
163   - # add baseline counters
164   - COMMAND ${LCOV_PATH} -a ${Coverage_NAME}.base -a ${Coverage_NAME}.info --output-file ${Coverage_NAME}.total
165   - COMMAND ${LCOV_PATH} --remove ${Coverage_NAME}.total ${COVERAGE_EXCLUDES} --output-file ${PROJECT_BINARY_DIR}/${Coverage_NAME}.info.cleaned
166   - COMMAND ${GENHTML_PATH} -o ${Coverage_NAME} ${PROJECT_BINARY_DIR}/${Coverage_NAME}.info.cleaned
167   - COMMAND ${CMAKE_COMMAND} -E remove ${Coverage_NAME}.base ${Coverage_NAME}.total ${PROJECT_BINARY_DIR}/${Coverage_NAME}.info.cleaned
168   -
169   - WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
170   - DEPENDS ${Coverage_DEPENDENCIES}
171   - COMMENT "Resetting code coverage counters to zero.\nProcessing code coverage counters and generating report."
172   - )
173   -
174   - # Show where to find the lcov info report
175   - add_custom_command(TARGET ${Coverage_NAME} POST_BUILD
176   - COMMAND ;
177   - COMMENT "Lcov code coverage info report saved in ${Coverage_NAME}.info."
178   - )
179   -
180   - # Show info where to find the report
181   - add_custom_command(TARGET ${Coverage_NAME} POST_BUILD
182   - COMMAND ;
183   - COMMENT "Open ./${Coverage_NAME}/index.html in your browser to view the coverage report."
184   - )
  131 + set(options NONE)
  132 + set(oneValueArgs NAME)
  133 + set(multiValueArgs EXECUTABLE EXECUTABLE_ARGS DEPENDENCIES)
  134 + cmake_parse_arguments(Coverage "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
  135 +
  136 + if(NOT LCOV_PATH)
  137 + message(FATAL_ERROR "lcov not found! Aborting...")
  138 + endif() # NOT LCOV_PATH
  139 +
  140 + if(NOT GENHTML_PATH)
  141 + message(FATAL_ERROR "genhtml not found! Aborting...")
  142 + endif() # NOT GENHTML_PATH
  143 +
  144 + # Setup target
  145 + add_custom_target(
  146 + ${Coverage_NAME}
  147 + # Cleanup lcov
  148 + COMMAND ${LCOV_PATH} --directory . --zerocounters
  149 + # Create baseline to make sure untouched files show up in the report
  150 + COMMAND ${LCOV_PATH} -c -i -d . -o ${Coverage_NAME}.base
  151 + # Run tests
  152 + COMMAND ${Coverage_EXECUTABLE}
  153 + # Capturing lcov counters and generating report
  154 + COMMAND ${LCOV_PATH} --directory . --capture --output-file ${Coverage_NAME}.info
  155 + # add baseline counters
  156 + COMMAND ${LCOV_PATH} -a ${Coverage_NAME}.base -a ${Coverage_NAME}.info --output-file
  157 + ${Coverage_NAME}.total
  158 + COMMAND ${LCOV_PATH} --remove ${Coverage_NAME}.total ${COVERAGE_EXCLUDES} --output-file
  159 + ${PROJECT_BINARY_DIR}/${Coverage_NAME}.info.cleaned
  160 + COMMAND ${GENHTML_PATH} -o ${Coverage_NAME} ${PROJECT_BINARY_DIR}/${Coverage_NAME}.info.cleaned
  161 + COMMAND ${CMAKE_COMMAND} -E remove ${Coverage_NAME}.base ${Coverage_NAME}.total
  162 + ${PROJECT_BINARY_DIR}/${Coverage_NAME}.info.cleaned
  163 + WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
  164 + DEPENDS ${Coverage_DEPENDENCIES}
  165 + COMMENT
  166 + "Resetting code coverage counters to zero.\nProcessing code coverage counters and generating report."
  167 + )
  168 +
  169 + # Show where to find the lcov info report
  170 + add_custom_command(
  171 + TARGET ${Coverage_NAME}
  172 + POST_BUILD
  173 + COMMAND ;
  174 + COMMENT "Lcov code coverage info report saved in ${Coverage_NAME}.info.")
  175 +
  176 + # Show info where to find the report
  177 + add_custom_command(
  178 + TARGET ${Coverage_NAME}
  179 + POST_BUILD
  180 + COMMAND ;
  181 + COMMENT "Open ./${Coverage_NAME}/index.html in your browser to view the coverage report.")
185 182  
186 183 endfunction() # SETUP_TARGET_FOR_COVERAGE
187 184  
... ... @@ -197,48 +194,50 @@ endfunction() # SETUP_TARGET_FOR_COVERAGE
197 194 # )
198 195 function(SETUP_TARGET_FOR_COVERAGE_COBERTURA)
199 196  
200   - set(options NONE)
201   - set(oneValueArgs NAME)
202   - set(multiValueArgs EXECUTABLE EXECUTABLE_ARGS DEPENDENCIES)
203   - cmake_parse_arguments(Coverage "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
204   -
205   - if(NOT SIMPLE_PYTHON_EXECUTABLE)
206   - message(FATAL_ERROR "python not found! Aborting...")
207   - endif() # NOT SIMPLE_PYTHON_EXECUTABLE
208   -
209   - if(NOT GCOVR_PATH)
210   - message(FATAL_ERROR "gcovr not found! Aborting...")
211   - endif() # NOT GCOVR_PATH
212   -
213   - # Combine excludes to several -e arguments
214   - set(COBERTURA_EXCLUDES "")
215   - foreach(EXCLUDE ${COVERAGE_EXCLUDES})
216   - set(COBERTURA_EXCLUDES "-e ${EXCLUDE} ${COBERTURA_EXCLUDES}")
217   - endforeach()
218   -
219   - add_custom_target(${Coverage_NAME}
220   -
221   - # Run tests
222   - ${Coverage_EXECUTABLE}
223   -
224   - # Running gcovr
225   - COMMAND ${GCOVR_PATH} -x -r ${CMAKE_SOURCE_DIR} ${COBERTURA_EXCLUDES}
226   - -o ${Coverage_NAME}.xml
227   - WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
228   - DEPENDS ${Coverage_DEPENDENCIES}
229   - COMMENT "Running gcovr to produce Cobertura code coverage report."
230   - )
231   -
232   - # Show info where to find the report
233   - add_custom_command(TARGET ${Coverage_NAME} POST_BUILD
234   - COMMAND ;
235   - COMMENT "Cobertura code coverage report saved in ${Coverage_NAME}.xml."
236   - )
  197 + set(options NONE)
  198 + set(oneValueArgs NAME)
  199 + set(multiValueArgs EXECUTABLE EXECUTABLE_ARGS DEPENDENCIES)
  200 + cmake_parse_arguments(Coverage "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
  201 +
  202 + if(NOT SIMPLE_PYTHON_EXECUTABLE)
  203 + message(FATAL_ERROR "python not found! Aborting...")
  204 + endif() # NOT SIMPLE_PYTHON_EXECUTABLE
  205 +
  206 + if(NOT GCOVR_PATH)
  207 + message(FATAL_ERROR "gcovr not found! Aborting...")
  208 + endif() # NOT GCOVR_PATH
  209 +
  210 + # Combine excludes to several -e arguments
  211 + set(COBERTURA_EXCLUDES "")
  212 + foreach(EXCLUDE ${COVERAGE_EXCLUDES})
  213 + set(COBERTURA_EXCLUDES "-e ${EXCLUDE} ${COBERTURA_EXCLUDES}")
  214 + endforeach()
  215 +
  216 + add_custom_target(
  217 + ${Coverage_NAME}
  218 + # Run tests
  219 + ${Coverage_EXECUTABLE}
  220 + # Running gcovr
  221 + COMMAND ${GCOVR_PATH} -x -r ${CMAKE_SOURCE_DIR} ${COBERTURA_EXCLUDES} -o ${Coverage_NAME}.xml
  222 + WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
  223 + DEPENDS ${Coverage_DEPENDENCIES}
  224 + COMMENT "Running gcovr to produce Cobertura code coverage report.")
  225 +
  226 + # Show info where to find the report
  227 + add_custom_command(
  228 + TARGET ${Coverage_NAME}
  229 + POST_BUILD
  230 + COMMAND ;
  231 + COMMENT "Cobertura code coverage report saved in ${Coverage_NAME}.xml.")
237 232  
238 233 endfunction() # SETUP_TARGET_FOR_COVERAGE_COBERTURA
239 234  
240 235 function(APPEND_COVERAGE_COMPILER_FLAGS)
241   - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${COVERAGE_COMPILER_FLAGS}" PARENT_SCOPE)
242   - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COVERAGE_COMPILER_FLAGS}" PARENT_SCOPE)
243   - message(STATUS "Appending code coverage compiler flags: ${COVERAGE_COMPILER_FLAGS}")
  236 + set(CMAKE_C_FLAGS
  237 + "${CMAKE_C_FLAGS} ${COVERAGE_COMPILER_FLAGS}"
  238 + PARENT_SCOPE)
  239 + set(CMAKE_CXX_FLAGS
  240 + "${CMAKE_CXX_FLAGS} ${COVERAGE_COMPILER_FLAGS}"
  241 + PARENT_SCOPE)
  242 + message(STATUS "Appending code coverage compiler flags: ${COVERAGE_COMPILER_FLAGS}")
244 243 endfunction() # APPEND_COVERAGE_COMPILER_FLAGS
... ...
docs/CMakeLists.txt
... ... @@ -2,17 +2,10 @@ set(DOXYGEN_EXTRACT_ALL YES)
2 2 set(DOXYGEN_BUILTIN_STL_SUPPORT YES)
3 3 set(PROJECT_BRIEF "C++11 Command Line Interface Parser")
4 4  
5   -file(GLOB DOC_LIST
6   - RELATIVE "${PROJECT_SOURCE_DIR}/include"
7   - "${PROJECT_SOURCE_DIR}/include/CLI/*.hpp"
8   - )
9   -
10   -doxygen_add_docs(docs
11   - ${DOC_LIST}
12   - "${CMAKE_CURRENT_SOURCE_DIR}/mainpage.md"
13   - WORKING_DIRECTORY
14   - "${PROJECT_SOURCE_DIR}/include"
15   -)
16   -
17   -
  5 +file(
  6 + GLOB DOC_LIST
  7 + RELATIVE "${PROJECT_SOURCE_DIR}/include"
  8 + "${PROJECT_SOURCE_DIR}/include/CLI/*.hpp")
18 9  
  10 +doxygen_add_docs(docs ${DOC_LIST} "${CMAKE_CURRENT_SOURCE_DIR}/mainpage.md"
  11 + WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}/include")
... ...
docs/mainpage.md
... ... @@ -21,6 +21,3 @@ Groups of related topics:
21 21 |----------------------|------------------------------------------------|
22 22 | @ref error_group | Errors that can be thrown |
23 23 | @ref validator_group | Common validators used in CLI::Option::check() |
24   -
25   -
26   -
... ...
examples/CMakeLists.txt
1   -
2 1 function(add_cli_exe T)
3   - add_executable(${T} ${ARGN} ${CLI11_headers})
4   - target_link_libraries(${T} PUBLIC CLI11)
5   - set_property(TARGET ${T} PROPERTY FOLDER "Examples")
6   - if(CLI11_FORCE_LIBCXX)
7   - set_property(TARGET ${T} APPEND_STRING PROPERTY LINK_FLAGS -stdlib=libc++)
8   - endif()
9   - if(CLI11_CLANG_TIDY)
10   - set_property(TARGET ${T} PROPERTY CXX_CLANG_TIDY "${DO_CLANG_TIDY}")
11   - endif()
  2 + add_executable(${T} ${ARGN} ${CLI11_headers})
  3 + target_link_libraries(${T} PUBLIC CLI11)
  4 + set_property(TARGET ${T} PROPERTY FOLDER "Examples")
  5 + if(CLI11_FORCE_LIBCXX)
  6 + set_property(
  7 + TARGET ${T}
  8 + APPEND_STRING
  9 + PROPERTY LINK_FLAGS -stdlib=libc++)
  10 + endif()
  11 + if(CLI11_CLANG_TIDY)
  12 + set_property(TARGET ${T} PROPERTY CXX_CLANG_TIDY "${DO_CLANG_TIDY}")
  13 + endif()
12 14 endfunction()
13 15  
14 16 if(CLI11_BUILD_EXAMPLES_JSON)
15   - message(STATUS "Using nlohmann/json")
16   - FetchContent_Declare(json
17   - URL https://github.com/nlohmann/json/releases/download/v3.7.3/include.zip
18   - URL_HASH "SHA256=87b5884741427220d3a33df1363ae0e8b898099fbc59f1c451113f6732891014"
19   - )
20   -
21   - FetchContent_GetProperties(json)
22   - if (NOT json_POPULATED)
23   - FetchContent_Populate(json)
24   - endif()
25   -
26   - add_cli_exe(json json.cpp)
27   - target_include_directories(json PUBLIC SYSTEM "${json_SOURCE_DIR}/single_include")
28   -
29   - add_test(NAME json_config_out COMMAND json --item 2)
30   - set_property(TEST json_config_out PROPERTY PASS_REGULAR_EXPRESSION
31   - [[{]]
32   - [["item": "2"]]
33   - [["simple": false]]
34   - [[}]]
35   - )
36   -
37   - file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/input.json" [=[{"item":3,"simple":false}]=])
38   - add_test(NAME json_config_in COMMAND json --config "${CMAKE_CURRENT_BINARY_DIR}/input.json")
39   - set_property(TEST json_config_in PROPERTY PASS_REGULAR_EXPRESSION
40   - [[{]]
41   - [["item": "3"]]
42   - [["simple": false]]
43   - [[}]]
44   -)
  17 + message(STATUS "Using nlohmann/json")
  18 + FetchContent_Declare(
  19 + json
  20 + URL https://github.com/nlohmann/json/releases/download/v3.7.3/include.zip
  21 + URL_HASH "SHA256=87b5884741427220d3a33df1363ae0e8b898099fbc59f1c451113f6732891014")
  22 +
  23 + FetchContent_GetProperties(json)
  24 + if(NOT json_POPULATED)
  25 + FetchContent_Populate(json)
  26 + endif()
  27 +
  28 + add_cli_exe(json json.cpp)
  29 + target_include_directories(json PUBLIC SYSTEM "${json_SOURCE_DIR}/single_include")
  30 +
  31 + add_test(NAME json_config_out COMMAND json --item 2)
  32 + set_property(TEST json_config_out PROPERTY PASS_REGULAR_EXPRESSION [[{]] [["item": "2"]]
  33 + [["simple": false]] [[}]])
  34 +
  35 + file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/input.json" [=[{"item":3,"simple":false}]=])
  36 + add_test(NAME json_config_in COMMAND json --config "${CMAKE_CURRENT_BINARY_DIR}/input.json")
  37 + set_property(TEST json_config_in PROPERTY PASS_REGULAR_EXPRESSION [[{]] [["item": "3"]]
  38 + [["simple": false]] [[}]])
45 39 endif()
46 40  
47   -
48 41 add_cli_exe(simple simple.cpp)
49 42 add_test(NAME simple_basic COMMAND simple)
50 43 add_test(NAME simple_all COMMAND simple -f filename.txt -c 12 --flag --flag -d 1.2)
51   -set_property(TEST simple_all PROPERTY PASS_REGULAR_EXPRESSION
52   - "Working on file: filename.txt, direct count: 1, opt count: 1"
53   - "Working on count: 12, direct count: 1, opt count: 1"
54   - "Received flag: 2 (2) times"
55   - "Some value: 1.2")
  44 +set_property(
  45 + TEST simple_all
  46 + PROPERTY PASS_REGULAR_EXPRESSION "Working on file: filename.txt, direct count: 1, opt count: 1"
  47 + "Working on count: 12, direct count: 1, opt count: 1" "Received flag: 2 (2) times"
  48 + "Some value: 1.2")
56 49  
57 50 add_test(NAME simple_version COMMAND simple --version)
58   -set_property(TEST simple_version PROPERTY PASS_REGULAR_EXPRESSION
59   - "${CLI11_VERSION}")
  51 +set_property(TEST simple_version PROPERTY PASS_REGULAR_EXPRESSION "${CLI11_VERSION}")
60 52  
61 53 add_cli_exe(subcommands subcommands.cpp)
62 54 add_test(NAME subcommands_none COMMAND subcommands)
63   -set_property(TEST subcommands_none PROPERTY
64   - PASS_REGULAR_EXPRESSION "A subcommand is required")
65   -add_test(NAME subcommands_all COMMAND subcommands --random start --file name stop --count)
66   -set_property(TEST subcommands_all PROPERTY PASS_REGULAR_EXPRESSION
67   - "Working on --file from start: name"
68   - "Working on --count from stop: 1, direct count: 1"
69   - "Count of --random flag: 1"
70   - "Subcommand: start"
71   - "Subcommand: stop")
  55 +set_property(TEST subcommands_none PROPERTY PASS_REGULAR_EXPRESSION "A subcommand is required")
  56 +add_test(
  57 + NAME subcommands_all
  58 + COMMAND subcommands --random start --file
  59 + name stop --count)
  60 +set_property(
  61 + TEST subcommands_all
  62 + PROPERTY PASS_REGULAR_EXPRESSION "Working on --file from start: name"
  63 + "Working on --count from stop: 1, direct count: 1" "Count of --random flag: 1"
  64 + "Subcommand: start" "Subcommand: stop")
72 65  
73 66 add_cli_exe(subcom_partitioned subcom_partitioned.cpp)
74 67 add_test(NAME subcom_partitioned_none COMMAND subcom_partitioned)
75   -set_property(TEST subcom_partitioned_none PROPERTY PASS_REGULAR_EXPRESSION
76   - "This is a timer:"
77   - "--file is required"
78   - "Run with --help for more information.")
  68 +set_property(
  69 + TEST subcom_partitioned_none
  70 + PROPERTY PASS_REGULAR_EXPRESSION "This is a timer:" "--file is required"
  71 + "Run with --help for more information.")
79 72  
80 73 add_test(NAME subcom_partitioned_all COMMAND subcom_partitioned --file this --count --count -d 1.2)
81   -set_property(TEST subcom_partitioned_all PROPERTY PASS_REGULAR_EXPRESSION
82   - "This is a timer:"
83   - "Working on file: this, direct count: 1, opt count: 1"
84   - "Working on count: 2, direct count: 2, opt count: 2"
85   - "Some value: 1.2")
86   - # test shows that the help prints out for unnamed subcommands
  74 +set_property(
  75 + TEST subcom_partitioned_all
  76 + PROPERTY PASS_REGULAR_EXPRESSION "This is a timer:"
  77 + "Working on file: this, direct count: 1, opt count: 1"
  78 + "Working on count: 2, direct count: 2, opt count: 2" "Some value: 1.2")
  79 +# test shows that the help prints out for unnamed subcommands
87 80 add_test(NAME subcom_partitioned_help COMMAND subcom_partitioned --help)
88 81 set_property(TEST subcom_partitioned_help PROPERTY PASS_REGULAR_EXPRESSION
89   - "-f,--file TEXT REQUIRED"
90   - "-d,--double FLOAT")
  82 + "-f,--file TEXT REQUIRED" "-d,--double FLOAT")
91 83  
92 84 add_cli_exe(option_groups option_groups.cpp)
93   -add_test(NAME option_groups_missing COMMAND option_groups )
94   -set_property(TEST option_groups_missing PROPERTY PASS_REGULAR_EXPRESSION
95   - "Exactly 1 option from"
96   - "is required")
  85 +add_test(NAME option_groups_missing COMMAND option_groups)
  86 +set_property(TEST option_groups_missing PROPERTY PASS_REGULAR_EXPRESSION "Exactly 1 option from"
  87 + "is required")
97 88 add_test(NAME option_groups_extra COMMAND option_groups --csv --binary)
98   -set_property(TEST option_groups_extra PROPERTY PASS_REGULAR_EXPRESSION
99   - "and 2 were given")
100   -add_test(NAME option_groups_extra2 COMMAND option_groups --csv --address "192.168.1.1" -o "test.out")
101   -set_property(TEST option_groups_extra2 PROPERTY PASS_REGULAR_EXPRESSION
102   - "at most 1")
  89 +set_property(TEST option_groups_extra PROPERTY PASS_REGULAR_EXPRESSION "and 2 were given")
  90 +add_test(NAME option_groups_extra2 COMMAND option_groups --csv --address "192.168.1.1" -o
  91 + "test.out")
  92 +set_property(TEST option_groups_extra2 PROPERTY PASS_REGULAR_EXPRESSION "at most 1")
103 93  
104 94 add_cli_exe(positional_arity positional_arity.cpp)
105   -add_test(NAME positional_arity1 COMMAND positional_arity one )
106   -set_property(TEST positional_arity1 PROPERTY PASS_REGULAR_EXPRESSION
107   - "File 1 = one")
108   -add_test(NAME positional_arity2 COMMAND positional_arity one two )
109   -set_property(TEST positional_arity2 PROPERTY PASS_REGULAR_EXPRESSION
110   - "File 1 = one"
111   - "File 2 = two")
  95 +add_test(NAME positional_arity1 COMMAND positional_arity one)
  96 +set_property(TEST positional_arity1 PROPERTY PASS_REGULAR_EXPRESSION "File 1 = one")
  97 +add_test(NAME positional_arity2 COMMAND positional_arity one two)
  98 +set_property(TEST positional_arity2 PROPERTY PASS_REGULAR_EXPRESSION "File 1 = one" "File 2 = two")
112 99 add_test(NAME positional_arity3 COMMAND positional_arity 1 2 one)
113   -set_property(TEST positional_arity3 PROPERTY PASS_REGULAR_EXPRESSION
114   - "File 1 = one")
  100 +set_property(TEST positional_arity3 PROPERTY PASS_REGULAR_EXPRESSION "File 1 = one")
115 101 add_test(NAME positional_arity_fail COMMAND positional_arity 1 one two)
116   -set_property(TEST positional_arity_fail PROPERTY PASS_REGULAR_EXPRESSION
117   - "Could not convert")
118   -
119   - add_cli_exe(positional_validation positional_validation.cpp)
120   -add_test(NAME positional_validation1 COMMAND positional_validation one )
121   -set_property(TEST positional_validation1 PROPERTY PASS_REGULAR_EXPRESSION
122   - "File 1 = one")
123   -add_test(NAME positional_validation2 COMMAND positional_validation one 1 2 two )
124   -set_property(TEST positional_validation2 PROPERTY PASS_REGULAR_EXPRESSION
125   - "File 1 = one"
126   - "File 2 = two")
  102 +set_property(TEST positional_arity_fail PROPERTY PASS_REGULAR_EXPRESSION "Could not convert")
  103 +
  104 +add_cli_exe(positional_validation positional_validation.cpp)
  105 +add_test(NAME positional_validation1 COMMAND positional_validation one)
  106 +set_property(TEST positional_validation1 PROPERTY PASS_REGULAR_EXPRESSION "File 1 = one")
  107 +add_test(NAME positional_validation2 COMMAND positional_validation one 1 2 two)
  108 +set_property(TEST positional_validation2 PROPERTY PASS_REGULAR_EXPRESSION "File 1 = one"
  109 + "File 2 = two")
127 110 add_test(NAME positional_validation3 COMMAND positional_validation 1 2 one)
128   -set_property(TEST positional_validation3 PROPERTY PASS_REGULAR_EXPRESSION
129   - "File 1 = one")
  111 +set_property(TEST positional_validation3 PROPERTY PASS_REGULAR_EXPRESSION "File 1 = one")
130 112 add_test(NAME positional_validation4 COMMAND positional_validation 1 one two 2)
131   -set_property(TEST positional_validation4 PROPERTY PASS_REGULAR_EXPRESSION
132   - "File 1 = one"
133   - "File 2 = two")
  113 +set_property(TEST positional_validation4 PROPERTY PASS_REGULAR_EXPRESSION "File 1 = one"
  114 + "File 2 = two")
134 115  
135 116 add_cli_exe(shapes shapes.cpp)
136   -add_test(NAME shapes_all COMMAND shapes circle 4.4 circle 10.7 rectangle 4 4 circle 2.3 triangle 4.5 ++ rectangle 2.1 ++ circle 234.675)
137   -set_property(TEST shapes_all PROPERTY PASS_REGULAR_EXPRESSION
138   - "circle2"
139   - "circle4"
140   - "rectangle2 with edges [2.1,2.1]"
141   - "triangel1 with sides [4.5]")
  117 +add_test(NAME shapes_all COMMAND shapes circle 4.4 circle 10.7 rectangle 4 4 circle 2.3 triangle
  118 + 4.5 ++ rectangle 2.1 ++ circle 234.675)
  119 +set_property(
  120 + TEST shapes_all PROPERTY PASS_REGULAR_EXPRESSION "circle2" "circle4"
  121 + "rectangle2 with edges [2.1,2.1]" "triangel1 with sides [4.5]")
142 122  
143 123 add_cli_exe(ranges ranges.cpp)
144 124 add_test(NAME ranges_range COMMAND ranges --range 1 2 3)
145   -set_property(TEST ranges_range PROPERTY PASS_REGULAR_EXPRESSION
146   - "[2:1:3]")
  125 +set_property(TEST ranges_range PROPERTY PASS_REGULAR_EXPRESSION "[2:1:3]")
147 126 add_test(NAME ranges_minmax COMMAND ranges --min 2 --max 3)
148   -set_property(TEST ranges_minmax PROPERTY PASS_REGULAR_EXPRESSION
149   - "[2:1:3]")
  127 +set_property(TEST ranges_minmax PROPERTY PASS_REGULAR_EXPRESSION "[2:1:3]")
150 128 add_test(NAME ranges_error COMMAND ranges --min 2 --max 3 --step 1 --range 1 2 3)
151   -set_property(TEST ranges_error PROPERTY PASS_REGULAR_EXPRESSION
152   - "Exactly 1 option from")
  129 +set_property(TEST ranges_error PROPERTY PASS_REGULAR_EXPRESSION "Exactly 1 option from")
153 130  
154 131 add_cli_exe(validators validators.cpp)
155 132 add_test(NAME validators_help COMMAND validators --help)
156   -set_property(TEST validators_help PROPERTY PASS_REGULAR_EXPRESSION
157   - " -f,--file TEXT:FILE[\\r\\n\\t ]+File name"
158   - " -v,--value INT:INT in [3 - 6][\\r\\n\\t ]+Value in range")
  133 +set_property(
  134 + TEST validators_help
  135 + PROPERTY PASS_REGULAR_EXPRESSION " -f,--file TEXT:FILE[\\r\\n\\t ]+File name"
  136 + " -v,--value INT:INT in [3 - 6][\\r\\n\\t ]+Value in range")
159 137 add_test(NAME validators_file COMMAND validators --file nonex.xxx)
160   -set_property(TEST validators_file PROPERTY PASS_REGULAR_EXPRESSION
161   - "--file: File does not exist: nonex.xxx"
162   - "Run with --help for more information.")
  138 +set_property(
  139 + TEST validators_file PROPERTY PASS_REGULAR_EXPRESSION "--file: File does not exist: nonex.xxx"
  140 + "Run with --help for more information.")
163 141 add_test(NAME validators_plain COMMAND validators --value 9)
164   -set_property(TEST validators_plain PROPERTY PASS_REGULAR_EXPRESSION
165   - "--value: Value 9 not in range 3 to 6"
166   - "Run with --help for more information.")
  142 +set_property(
  143 + TEST validators_plain PROPERTY PASS_REGULAR_EXPRESSION "--value: Value 9 not in range 3 to 6"
  144 + "Run with --help for more information.")
167 145  
168 146 add_cli_exe(groups groups.cpp)
169 147 add_test(NAME groups_none COMMAND groups)
170   -set_property(TEST groups_none PROPERTY PASS_REGULAR_EXPRESSION
171   - "This is a timer:"
172   - "--file is required"
173   - "Run with --help for more information.")
  148 +set_property(
  149 + TEST groups_none PROPERTY PASS_REGULAR_EXPRESSION "This is a timer:" "--file is required"
  150 + "Run with --help for more information.")
174 151 add_test(NAME groups_all COMMAND groups --file this --count --count -d 1.2)
175   -set_property(TEST groups_all PROPERTY PASS_REGULAR_EXPRESSION
176   - "This is a timer:"
177   - "Working on file: this, direct count: 1, opt count: 1"
178   - "Working on count: 2, direct count: 2, opt count: 2"
179   - "Some value: 1.2")
  152 +set_property(
  153 + TEST groups_all
  154 + PROPERTY PASS_REGULAR_EXPRESSION "This is a timer:"
  155 + "Working on file: this, direct count: 1, opt count: 1"
  156 + "Working on count: 2, direct count: 2, opt count: 2" "Some value: 1.2")
180 157  
181 158 add_cli_exe(inter_argument_order inter_argument_order.cpp)
182   -add_test(NAME inter_argument_order COMMAND inter_argument_order --foo 1 2 3 --x --bar 4 5 6 --z --foo 7 8)
183   -set_property(TEST inter_argument_order PROPERTY PASS_REGULAR_EXPRESSION
  159 +add_test(NAME inter_argument_order COMMAND inter_argument_order --foo 1 2 3 --x --bar 4 5 6 --z
  160 + --foo 7 8)
  161 +set_property(
  162 + TEST inter_argument_order
  163 + PROPERTY
  164 + PASS_REGULAR_EXPRESSION
184 165 [=[foo : 1
185 166 foo : 2
186 167 foo : 3
... ... @@ -192,44 +173,37 @@ foo : 8]=])
192 173  
193 174 add_cli_exe(prefix_command prefix_command.cpp)
194 175 add_test(NAME prefix_command COMMAND prefix_command -v 3 2 1 -- other one two 3)
195   -set_property(TEST prefix_command PROPERTY PASS_REGULAR_EXPRESSION
196   - "Prefix: 3 : 2 : 1"
197   - "Remaining commands: other one two 3")
  176 +set_property(TEST prefix_command PROPERTY PASS_REGULAR_EXPRESSION "Prefix: 3 : 2 : 1"
  177 + "Remaining commands: other one two 3")
198 178  
199 179 add_cli_exe(callback_passthrough callback_passthrough.cpp)
200 180 add_test(NAME callback_passthrough1 COMMAND callback_passthrough --argname t2 --t2 test)
201   -set_property(TEST callback_passthrough1 PROPERTY PASS_REGULAR_EXPRESSION
202   - "the value is now test")
  181 +set_property(TEST callback_passthrough1 PROPERTY PASS_REGULAR_EXPRESSION "the value is now test")
203 182 add_test(NAME callback_passthrough2 COMMAND callback_passthrough --arg EEEK --argname arg)
204   -set_property(TEST callback_passthrough2 PROPERTY PASS_REGULAR_EXPRESSION
205   - "the value is now EEEK")
  183 +set_property(TEST callback_passthrough2 PROPERTY PASS_REGULAR_EXPRESSION "the value is now EEEK")
206 184  
207 185 add_cli_exe(enum enum.cpp)
208 186 add_test(NAME enum_pass COMMAND enum -l 1)
209 187 add_test(NAME enum_fail COMMAND enum -l 4)
210   -set_property(TEST enum_fail PROPERTY PASS_REGULAR_EXPRESSION
211   - "--level: Check 4 value in {" "FAILED")
  188 +set_property(TEST enum_fail PROPERTY PASS_REGULAR_EXPRESSION "--level: Check 4 value in {"
  189 + "FAILED")
212 190  
213 191 add_cli_exe(enum_ostream enum_ostream.cpp)
214 192 add_test(NAME enum_ostream_pass COMMAND enum_ostream --level medium)
215   -set_property(TEST enum_ostream_pass PROPERTY PASS_REGULAR_EXPRESSION
216   - "Enum received: Medium")
  193 +set_property(TEST enum_ostream_pass PROPERTY PASS_REGULAR_EXPRESSION "Enum received: Medium")
217 194  
218 195 add_cli_exe(digit_args digit_args.cpp)
219 196 add_test(NAME digit_args COMMAND digit_args -h)
220   -set_property(TEST digit_args PROPERTY PASS_REGULAR_EXPRESSION
221   - "-3{3}")
  197 +set_property(TEST digit_args PROPERTY PASS_REGULAR_EXPRESSION "-3{3}")
222 198  
223 199 add_cli_exe(modhelp modhelp.cpp)
224 200 add_test(NAME modhelp COMMAND modhelp -a test -h)
225   -set_property(TEST modhelp PROPERTY PASS_REGULAR_EXPRESSION
226   - "Option -a string in help: test")
  201 +set_property(TEST modhelp PROPERTY PASS_REGULAR_EXPRESSION "Option -a string in help: test")
227 202  
228 203 add_subdirectory(subcom_in_files)
229 204 add_test(NAME subcom_in_files COMMAND subcommand_main subcommand_a -f this.txt --with-foo)
230   -set_property(TEST subcom_in_files PROPERTY PASS_REGULAR_EXPRESSION
231   - "Working on file: this\.txt"
232   - "Using foo!")
  205 +set_property(TEST subcom_in_files PROPERTY PASS_REGULAR_EXPRESSION "Working on file: this\.txt"
  206 + "Using foo!")
233 207  
234 208 add_cli_exe(formatter formatter.cpp)
235 209  
... ... @@ -245,14 +219,10 @@ add_test(NAME retired_retired_test2 COMMAND retired --retired_option 567)
245 219 add_test(NAME retired_retired_test3 COMMAND retired --retired_option2 567 689 789)
246 220 add_test(NAME retired_deprecated COMMAND retired --deprecate 19 20)
247 221  
248   -set_property(TEST retired_retired_test PROPERTY PASS_REGULAR_EXPRESSION
249   - "WARNING.*retired")
  222 +set_property(TEST retired_retired_test PROPERTY PASS_REGULAR_EXPRESSION "WARNING.*retired")
250 223  
251   -set_property(TEST retired_retired_test2 PROPERTY PASS_REGULAR_EXPRESSION
252   - "WARNING.*retired")
  224 +set_property(TEST retired_retired_test2 PROPERTY PASS_REGULAR_EXPRESSION "WARNING.*retired")
253 225  
254   -set_property(TEST retired_retired_test3 PROPERTY PASS_REGULAR_EXPRESSION
255   - "WARNING.*retired")
  226 +set_property(TEST retired_retired_test3 PROPERTY PASS_REGULAR_EXPRESSION "WARNING.*retired")
256 227  
257   -set_property(TEST retired_deprecated PROPERTY PASS_REGULAR_EXPRESSION
258   - "deprecated.*not_deprecated")
  228 +set_property(TEST retired_deprecated PROPERTY PASS_REGULAR_EXPRESSION "deprecated.*not_deprecated")
... ...
tests/CMakeLists.txt
1 1 list(APPEND CMAKE_MODULE_PATH "${CLI11_SOURCE_DIR}/cmake")
2 2  
3 3 if(CLI11_SANITIZERS)
4   - message(STATUS "Using arsenm/sanitizers-cmake")
5   - FetchContent_Declare(sanitizers
6   - GIT_REPOSITORY https://github.com/arsenm/sanitizers-cmake.git
7   - GIT_SHALLOW 1
8   - GIT_TAG 99e159e)
  4 + message(STATUS "Using arsenm/sanitizers-cmake")
  5 + FetchContent_Declare(
  6 + sanitizers
  7 + GIT_REPOSITORY https://github.com/arsenm/sanitizers-cmake.git
  8 + GIT_SHALLOW 1
  9 + GIT_TAG 99e159e)
9 10  
10   - FetchContent_GetProperties(sanitizers)
  11 + FetchContent_GetProperties(sanitizers)
11 12  
12   - if (NOT sanitizers_POPULATED)
13   - FetchContent_Populate(sanitizers)
14   - endif()
  13 + if(NOT sanitizers_POPULATED)
  14 + FetchContent_Populate(sanitizers)
  15 + endif()
15 16  
16   - list(APPEND CMAKE_MODULE_PATH "${sanitizers_SOURCE_DIR}/cmake")
  17 + list(APPEND CMAKE_MODULE_PATH "${sanitizers_SOURCE_DIR}/cmake")
17 18  
18   - find_package(Sanitizers)
19   - if(SANITIZE_ADDRESS)
20   - message(STATUS "You might want to use \"${ASan_WRAPPER}\" to run your program")
21   - endif()
  19 + find_package(Sanitizers)
  20 + if(SANITIZE_ADDRESS)
  21 + message(STATUS "You might want to use \"${ASan_WRAPPER}\" to run your program")
  22 + endif()
22 23 else()
23   - macro(add_sanitizers)
24   - endmacro()
25   -endif()
  24 + macro(add_sanitizers)
26 25  
  26 + endmacro()
  27 +endif()
27 28  
28 29 # Add boost to test boost::optional (currently explicitly requested)"
29 30 option(CLI11_BOOST "Turn on boost test (currently may fail with Boost 1.70)" OFF)
30 31 if(CLI11_BOOST)
31   - find_package(Boost 1.61 REQUIRED)
  32 + find_package(Boost 1.61 REQUIRED)
32 33 endif()
33 34 set(boost-optional-def $<$<BOOL:${Boost_FOUND}>:CLI11_BOOST_OPTIONAL>)
34 35  
... ... @@ -50,15 +51,14 @@ set(CLI11_TESTS
50 51 StringParseTest
51 52 ComplexTypeTest
52 53 TrueFalseTest
53   - OptionGroupTest
54   - )
  54 + OptionGroupTest)
55 55  
56 56 if(WIN32)
57   - list(APPEND CLI11_TESTS WindowsTest)
  57 + list(APPEND CLI11_TESTS WindowsTest)
58 58 endif()
59 59  
60   -if (Boost_FOUND)
61   - list(APPEND CLI11_TESTS BoostOptionTypeTest)
  60 +if(Boost_FOUND)
  61 + list(APPEND CLI11_TESTS BoostOptionTypeTest)
62 62 endif()
63 63  
64 64 set(CLI11_MULTIONLY_TESTS TimerTest)
... ... @@ -71,67 +71,63 @@ target_include_directories(catch_main PUBLIC &quot;${CMAKE_CURRENT_SOURCE_DIR}&quot;)
71 71 # requires newer CMake.
72 72  
73 73 set(url https://github.com/philsquared/Catch/releases/download/v2.13.4/catch.hpp)
74   -file(DOWNLOAD ${url} "${CMAKE_CURRENT_BINARY_DIR}/catch.hpp" STATUS status EXPECTED_HASH SHA256=6e0fa3dd160891a01c1f3b34e8bcd6e0140abe08eca022e390027f27dec2050b)
  74 +file(
  75 + DOWNLOAD ${url} "${CMAKE_CURRENT_BINARY_DIR}/catch.hpp"
  76 + STATUS status
  77 + EXPECTED_HASH SHA256=6e0fa3dd160891a01c1f3b34e8bcd6e0140abe08eca022e390027f27dec2050b)
75 78 list(GET status 0 error)
76 79 if(error)
77   - message(FATAL_ERROR "Could not download ${url}")
  80 + message(FATAL_ERROR "Could not download ${url}")
78 81 endif()
79 82 target_include_directories(catch_main PUBLIC "${CMAKE_CURRENT_BINARY_DIR}")
80 83  
81 84 # Target must already exist
82 85 macro(add_catch_test TESTNAME)
83   - target_link_libraries(${TESTNAME} PUBLIC catch_main)
84   -
85   - add_test(${TESTNAME} ${TESTNAME})
86   - set_target_properties(${TESTNAME} PROPERTIES FOLDER "Tests")
87   - if (CLI11_FORCE_LIBCXX)
88   - set_property(TARGET ${T} APPEND_STRING
89   - PROPERTY LINK_FLAGS -stdlib=libc++)
90   - endif()
  86 + target_link_libraries(${TESTNAME} PUBLIC catch_main)
  87 +
  88 + add_test(${TESTNAME} ${TESTNAME})
  89 + set_target_properties(${TESTNAME} PROPERTIES FOLDER "Tests")
  90 + if(CLI11_FORCE_LIBCXX)
  91 + set_property(
  92 + TARGET ${T}
  93 + APPEND_STRING
  94 + PROPERTY LINK_FLAGS -stdlib=libc++)
  95 + endif()
91 96 endmacro()
92 97  
93 98 foreach(T IN LISTS CLI11_TESTS)
94   - if(CLI11_CUDA_TESTS)
95   - set_property(
96   - SOURCE ${T}.cpp
97   - PROPERTY LANGUAGE CUDA
98   - )
99   - endif()
100   - add_executable(${T} ${T}.cpp ${CLI11_headers})
101   - add_sanitizers(${T})
102   - if(NOT CLI11_CUDA_TESTS)
103   - target_link_libraries(${T} PRIVATE CLI11_warnings)
104   - endif()
105   - target_link_libraries(${T} PRIVATE CLI11)
106   - add_catch_test(${T})
107   -
108   - if(CLI11_SINGLE_FILE AND CLI11_SINGLE_FILE_TESTS)
109   - add_executable(${T}_Single ${T}.cpp)
110   - target_link_libraries(${T}_Single PRIVATE CLI11_SINGLE)
111   - add_catch_test(${T}_Single)
112   - set_property(TARGET ${T}_Single PROPERTY FOLDER "Tests Single File")
113   - endif()
  99 + if(CLI11_CUDA_TESTS)
  100 + set_property(SOURCE ${T}.cpp PROPERTY LANGUAGE CUDA)
  101 + endif()
  102 + add_executable(${T} ${T}.cpp ${CLI11_headers})
  103 + add_sanitizers(${T})
  104 + if(NOT CLI11_CUDA_TESTS)
  105 + target_link_libraries(${T} PRIVATE CLI11_warnings)
  106 + endif()
  107 + target_link_libraries(${T} PRIVATE CLI11)
  108 + add_catch_test(${T})
  109 +
  110 + if(CLI11_SINGLE_FILE AND CLI11_SINGLE_FILE_TESTS)
  111 + add_executable(${T}_Single ${T}.cpp)
  112 + target_link_libraries(${T}_Single PRIVATE CLI11_SINGLE)
  113 + add_catch_test(${T}_Single)
  114 + set_property(TARGET ${T}_Single PROPERTY FOLDER "Tests Single File")
  115 + endif()
114 116 endforeach()
115 117  
116 118 foreach(T IN LISTS CLI11_MULTIONLY_TESTS)
117   - add_executable(${T} ${T}.cpp ${CLI11_headers})
118   - add_sanitizers(${T})
119   - target_link_libraries(${T} PUBLIC CLI11)
120   - add_catch_test(${T})
  119 + add_executable(${T} ${T}.cpp ${CLI11_headers})
  120 + add_sanitizers(${T})
  121 + target_link_libraries(${T} PUBLIC CLI11)
  122 + add_catch_test(${T})
121 123 endforeach()
122 124  
123 125 # Add -Wno-deprecated-declarations to DeprecatedTest
124   -set(no-deprecated-declarations
125   - $<$<CXX_COMPILER_ID:MSVC>:/wd4996>
126   - $<$<NOT:$<CXX_COMPILER_ID:MSVC>>:-Wno-deprecated-declarations>
127   - )
128   -target_compile_options(DeprecatedTest
129   - PRIVATE
130   - ${no-deprecated-declarations})
131   -if (TARGET DeprecatedTest_Single)
132   - target_compile_options(DeprecatedTest_Single
133   - PRIVATE
134   - ${no-deprecated-declarations})
  126 +set(no-deprecated-declarations $<$<CXX_COMPILER_ID:MSVC>:/wd4996>
  127 + $<$<NOT:$<CXX_COMPILER_ID:MSVC>>:-Wno-deprecated-declarations>)
  128 +target_compile_options(DeprecatedTest PRIVATE ${no-deprecated-declarations})
  129 +if(TARGET DeprecatedTest_Single)
  130 + target_compile_options(DeprecatedTest_Single PRIVATE ${no-deprecated-declarations})
135 131 endif()
136 132  
137 133 # Link test (build error if inlines missing)
... ... @@ -142,33 +138,38 @@ add_executable(link_test_2 link_test_2.cpp)
142 138 target_link_libraries(link_test_2 PUBLIC CLI11 link_test_1)
143 139 add_catch_test(link_test_2)
144 140 if(CLI11_FORCE_LIBCXX)
145   - set_property(TARGET link_test_1 APPEND_STRING
146   - PROPERTY LINK_FLAGS -stdlib=libc++)
147   - set_property(TARGET link_test_2 APPEND_STRING
148   - PROPERTY LINK_FLAGS -stdlib=libc++)
  141 + set_property(
  142 + TARGET link_test_1
  143 + APPEND_STRING
  144 + PROPERTY LINK_FLAGS -stdlib=libc++)
  145 + set_property(
  146 + TARGET link_test_2
  147 + APPEND_STRING
  148 + PROPERTY LINK_FLAGS -stdlib=libc++)
149 149 endif()
150 150  
151 151 # Add informational printout
152 152 add_executable(informational informational.cpp)
153 153 target_link_libraries(informational PUBLIC CLI11)
154 154 if(CLI11_FORCE_LIBCXX)
155   - set_property(TARGET informational APPEND_STRING
156   - PROPERTY LINK_FLAGS -stdlib=libc++)
  155 + set_property(
  156 + TARGET informational
  157 + APPEND_STRING
  158 + PROPERTY LINK_FLAGS -stdlib=libc++)
157 159 endif()
158 160  
159 161 # Force this to be in a standard location so CTest can find it
160   -set_target_properties(informational PROPERTIES
161   - RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}"
162   - RUNTIME_OUTPUT_DIRECTORY_DEBUG "${CMAKE_BINARY_DIR}"
163   - RUNTIME_OUTPUT_DIRECTORY_RELEASE "${CMAKE_BINARY_DIR}"
164   - RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO "${CMAKE_BINARY_DIR}"
165   - RUNTIME_OUTPUT_DIRECTORY_MINSIZEREL "${CMAKE_BINARY_DIR}"
166   - )
  162 +set_target_properties(
  163 + informational
  164 + PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}"
  165 + RUNTIME_OUTPUT_DIRECTORY_DEBUG "${CMAKE_BINARY_DIR}"
  166 + RUNTIME_OUTPUT_DIRECTORY_RELEASE "${CMAKE_BINARY_DIR}"
  167 + RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO "${CMAKE_BINARY_DIR}"
  168 + RUNTIME_OUTPUT_DIRECTORY_MINSIZEREL "${CMAKE_BINARY_DIR}")
167 169  
168 170 # Adding this printout to CTest
169 171 file(WRITE "${PROJECT_BINARY_DIR}/CTestCustom.cmake"
170   - "set(CTEST_CUSTOM_PRE_TEST \"${CMAKE_BINARY_DIR}/informational\")"
171   -)
  172 + "set(CTEST_CUSTOM_PRE_TEST \"${CMAKE_BINARY_DIR}/informational\")")
172 173  
173 174 target_compile_definitions(informational PRIVATE ${boost-optional-def})
174 175 target_compile_definitions(OptionalTest PRIVATE ${boost-optional-def})
... ... @@ -176,33 +177,33 @@ target_compile_definitions(OptionalTest PRIVATE ${boost-optional-def})
176 177 message(STATUS "Boost libs=${Boost_INCLUDE_DIRS}")
177 178  
178 179 if(TARGET Boost::boost)
179   - message(STATUS "including boost target")
180   - target_link_libraries(informational PRIVATE Boost::boost)
181   - target_link_libraries(OptionalTest PRIVATE Boost::boost)
182   - target_link_libraries(BoostOptionTypeTest PRIVATE Boost::boost)
183   - if(CLI11_SINGLE_FILE AND CLI11_SINGLE_FILE_TESTS)
184   - target_link_libraries(OptionalTest_Single PRIVATE Boost::boost)
185   - target_link_libraries(BoostOptionTypeTest_Single PRIVATE Boost::boost)
186   - endif()
  180 + message(STATUS "including boost target")
  181 + target_link_libraries(informational PRIVATE Boost::boost)
  182 + target_link_libraries(OptionalTest PRIVATE Boost::boost)
  183 + target_link_libraries(BoostOptionTypeTest PRIVATE Boost::boost)
  184 + if(CLI11_SINGLE_FILE AND CLI11_SINGLE_FILE_TESTS)
  185 + target_link_libraries(OptionalTest_Single PRIVATE Boost::boost)
  186 + target_link_libraries(BoostOptionTypeTest_Single PRIVATE Boost::boost)
  187 + endif()
187 188 elseif(BOOST_FOUND)
188   -message(STATUS "no boost target")
189   - target_include_directories(informational PRIVATE ${Boost_INCLUDE_DIRS})
190   - target_include_directories(OptionalTest PRIVATE ${Boost_INCLUDE_DIRS})
191   - target_include_directories(BoostOptionTypeTest PRIVATE ${Boost_INCLUDE_DIRS})
192   - if(CLI11_SINGLE_FILE AND CLI11_SINGLE_FILE_TESTS)
193   - target_include_directories(OptionalTest_Single PRIVATE ${Boost_INCLUDE_DIRS})
194   - target_include_directories(BoostOptionTypeTest_Single PRIVATE ${Boost_INCLUDE_DIRS})
195   - endif()
  189 + message(STATUS "no boost target")
  190 + target_include_directories(informational PRIVATE ${Boost_INCLUDE_DIRS})
  191 + target_include_directories(OptionalTest PRIVATE ${Boost_INCLUDE_DIRS})
  192 + target_include_directories(BoostOptionTypeTest PRIVATE ${Boost_INCLUDE_DIRS})
  193 + if(CLI11_SINGLE_FILE AND CLI11_SINGLE_FILE_TESTS)
  194 + target_include_directories(OptionalTest_Single PRIVATE ${Boost_INCLUDE_DIRS})
  195 + target_include_directories(BoostOptionTypeTest_Single PRIVATE ${Boost_INCLUDE_DIRS})
  196 + endif()
196 197 endif()
197 198  
198 199 if(CMAKE_BUILD_TYPE STREQUAL Coverage)
199   - include(CodeCoverage)
200   - setup_target_for_coverage(
201   - NAME CLI11_coverage
202   - EXECUTABLE ctest
203   - DEPENDENCIES
204   - ${CLI11_TESTS}
205   - ${CLI11_MULTIONLY_TESTS}
206   - )
  200 + include(CodeCoverage)
  201 + setup_target_for_coverage(
  202 + NAME
  203 + CLI11_coverage
  204 + EXECUTABLE
  205 + ctest
  206 + DEPENDENCIES
  207 + ${CLI11_TESTS}
  208 + ${CLI11_MULTIONLY_TESTS})
207 209 endif()
208   -
... ...