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,4 +8,3 @@ steps:
8 - script: cmake --build . 8 - script: cmake --build .
9 displayName: 'Build' 9 displayName: 'Build'
10 workingDirectory: build 10 workingDirectory: build
11 -  
.ci/azure-test.yml
@@ -8,5 +8,3 @@ steps: @@ -8,5 +8,3 @@ steps:
8 inputs: 8 inputs:
9 testResultsFormat: 'cTest' 9 testResultsFormat: 'cTest'
10 testResultsFiles: '**/Test.xml' 10 testResultsFiles: '**/Test.xml'
11 -  
12 -  
.ci/build_doxygen.sh
@@ -23,4 +23,3 @@ export PATH="${DEPS_DIR}/doxygen/build/bin:${PATH}" @@ -23,4 +23,3 @@ export PATH="${DEPS_DIR}/doxygen/build/bin:${PATH}"
23 cd "${TRAVIS_BUILD_DIR}" 23 cd "${TRAVIS_BUILD_DIR}"
24 24
25 set +evx 25 set +evx
26 -  
.clang-tidy
@@ -22,4 +22,3 @@ HeaderFilterRegex: '.*hpp' @@ -22,4 +22,3 @@ HeaderFilterRegex: '.*hpp'
22 CheckOptions: 22 CheckOptions:
23 - key: google-readability-braces-around-statements.ShortStatementLines 23 - key: google-readability-braces-around-statements.ShortStatementLines
24 value: '3' 24 value: '3'
25 -  
.github/workflows/tests.yml
@@ -178,5 +178,3 @@ jobs: @@ -178,5 +178,3 @@ jobs:
178 - name: Check CMake 3.20 178 - name: Check CMake 3.20
179 uses: ./.github/actions/quick_cmake 179 uses: ./.github/actions/quick_cmake
180 if: success() || failure() 180 if: success() || failure()
181 -  
182 -  
CLI11.CPack.Description.txt
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. 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,26 +7,29 @@ cmake_minimum_required(VERSION 3.4)
7 # We don't use the 3.4...3.17 syntax because of a bug in an older MSVC's 7 # We don't use the 3.4...3.17 syntax because of a bug in an older MSVC's
8 # built-in and modified CMake 3.11 8 # built-in and modified CMake 3.11
9 if(${CMAKE_VERSION} VERSION_LESS 3.17) 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 else() 11 else()
12 - cmake_policy(VERSION 3.17) 12 + cmake_policy(VERSION 3.17)
13 endif() 13 endif()
14 14
15 set(VERSION_REGEX "#define CLI11_VERSION[ \t]+\"(.+)\"") 15 set(VERSION_REGEX "#define CLI11_VERSION[ \t]+\"(.+)\"")
16 16
17 # Read in the line containing the version 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 # Pick out just the version 21 # Pick out just the version
22 string(REGEX REPLACE ${VERSION_REGEX} "\\1" VERSION_STRING "${VERSION_STRING}") 22 string(REGEX REPLACE ${VERSION_REGEX} "\\1" VERSION_STRING "${VERSION_STRING}")
23 23
24 # Add the project 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 # Print the version number of CMake if this is the main project 30 # Print the version number of CMake if this is the main project
28 if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME) 31 if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME)
29 - message(STATUS "CMake ${CMAKE_VERSION}") 32 + message(STATUS "CMake ${CMAKE_VERSION}")
30 endif() 33 endif()
31 34
32 include(CMakeDependentOption) 35 include(CMakeDependentOption)
@@ -34,7 +37,7 @@ include(GNUInstallDirs) @@ -34,7 +37,7 @@ include(GNUInstallDirs)
34 include(CTest) 37 include(CTest)
35 38
36 if(NOT CMAKE_VERSION VERSION_LESS 3.11) 39 if(NOT CMAKE_VERSION VERSION_LESS 3.11)
37 - include(FetchContent) 40 + include(FetchContent)
38 endif() 41 endif()
39 42
40 find_package(Doxygen) 43 find_package(Doxygen)
@@ -49,83 +52,76 @@ list(APPEND build-docs "Doxygen_FOUND") @@ -49,83 +52,76 @@ list(APPEND build-docs "Doxygen_FOUND")
49 52
50 # Necessary to support paths with spaces, see #457 53 # Necessary to support paths with spaces, see #457
51 if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/docs") 54 if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/docs")
52 - set(docs_EXIST TRUE) 55 + set(docs_EXIST TRUE)
53 else() 56 else()
54 - set(docs_EXIST FALSE) 57 + set(docs_EXIST FALSE)
55 endif() 58 endif()
56 list(APPEND build-docs "docs_EXIST") 59 list(APPEND build-docs "docs_EXIST")
57 60
58 if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/examples") 61 if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/examples")
59 - set(examples_EXIST TRUE) 62 + set(examples_EXIST TRUE)
60 else() 63 else()
61 - set(examples_EXIST FALSE) 64 + set(examples_EXIST FALSE)
62 endif() 65 endif()
63 66
64 option(CLI11_WARNINGS_AS_ERRORS "Turn all warnings into errors (for CI)") 67 option(CLI11_WARNINGS_AS_ERRORS "Turn all warnings into errors (for CI)")
65 option(CLI11_SINGLE_FILE "Generate a single header file") 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 if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME AND NOT DEFINED CMAKE_CXX_STANDARD) 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 endif() 106 endif()
110 107
111 if(NOT DEFINED CMAKE_CXX_EXTENSIONS) 108 if(NOT DEFINED CMAKE_CXX_EXTENSIONS)
112 - set(CMAKE_CXX_EXTENSIONS OFF) 109 + set(CMAKE_CXX_EXTENSIONS OFF)
113 endif() 110 endif()
114 111
115 if(NOT DEFINED CMAKE_CXX_STANDARD_REQUIRED) 112 if(NOT DEFINED CMAKE_CXX_STANDARD_REQUIRED)
116 - set(CMAKE_CXX_STANDARD_REQUIRED ON) 113 + set(CMAKE_CXX_STANDARD_REQUIRED ON)
117 endif() 114 endif()
118 115
119 -  
120 # Allow IDE's to group targets into folders 116 # Allow IDE's to group targets into folders
121 if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME) 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 endif() 119 endif()
124 120
125 if(CMAKE_VERSION VERSION_LESS 3.10) 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 elseif(NOT Doxygen_FOUND) 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 endif() 125 endif()
130 126
131 # Special target that adds warnings. Is not exported. 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,32 +131,28 @@ set(unix-warnings -Wall -Wextra -pedantic -Wshadow -Wsign-conversion -Wswitch-en
135 131
136 # Buggy in GCC 4.8 132 # Buggy in GCC 4.8
137 if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.9) 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 endif() 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 # Allow IDE's to group targets into folders 149 # Allow IDE's to group targets into folders
156 add_library(CLI11 INTERFACE) 150 add_library(CLI11 INTERFACE)
157 add_library(CLI11::CLI11 ALIAS CLI11) # for add_subdirectory calls 151 add_library(CLI11::CLI11 ALIAS CLI11) # for add_subdirectory calls
158 152
159 # Duplicated because CMake adds the current source dir if you don't. 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 # To see in IDE, headers must be listed for target 157 # To see in IDE, headers must be listed for target
166 set(header-patterns "${PROJECT_SOURCE_DIR}/include/CLI/*") 158 set(header-patterns "${PROJECT_SOURCE_DIR}/include/CLI/*")
@@ -171,104 +163,96 @@ endif() @@ -171,104 +163,96 @@ endif()
171 file(GLOB CLI11_headers ${header-patterns}) 163 file(GLOB CLI11_headers ${header-patterns})
172 164
173 # Allow tests to be run on CUDA 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 # Prepare Clang-Tidy 173 # Prepare Clang-Tidy
183 if(CLI11_CLANG_TIDY) 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 # This folder should be installed 183 # This folder should be installed
196 if(CLI11_INSTALL) 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 endif() 219 endif()
232 220
233 if(CLI11_SINGLE_FILE) 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 endif() 254 endif()
270 255
271 -  
272 if(CLI11_BUILD_TESTS) 256 if(CLI11_BUILD_TESTS)
273 add_subdirectory(tests) 257 add_subdirectory(tests)
274 endif() 258 endif()
@@ -283,7 +267,7 @@ endif() @@ -283,7 +267,7 @@ endif()
283 267
284 # From a build system, this might not be included. 268 # From a build system, this might not be included.
285 if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/book") 269 if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/book")
286 - add_subdirectory(book) 270 + add_subdirectory(book)
287 endif() 271 endif()
288 272
289 # Packaging support 273 # Packaging support
@@ -316,12 +300,10 @@ set(CPACK_SOURCE_IGNORE_FILES @@ -316,12 +300,10 @@ set(CPACK_SOURCE_IGNORE_FILES
316 .swp 300 .swp
317 /.all-contributorsrc 301 /.all-contributorsrc
318 /.appveyor.yml 302 /.appveyor.yml
319 - /.pre-commit.*yaml  
320 -) 303 + /.pre-commit.*yaml)
321 304
322 set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "all") 305 set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "all")
323 set(CPACK_DEBIAN_COMPRESSION_TYPE "xz") 306 set(CPACK_DEBIAN_COMPRESSION_TYPE "xz")
324 set(CPACK_DEBIAN_PACKAGE_NAME "libcli11-dev") 307 set(CPACK_DEBIAN_PACKAGE_NAME "libcli11-dev")
325 308
326 include(CPack) 309 include(CPack)
327 -  
CPPLINT.cfg
@@ -11,4 +11,3 @@ filter=-runtime/references # Requires fundamental change of API, don&#39;t see need @@ -11,4 +11,3 @@ filter=-runtime/references # Requires fundamental change of API, don&#39;t see need
11 filter=-whitespace/blank_line # Unnecessarily strict with blank lines that otherwise help with readability 11 filter=-whitespace/blank_line # Unnecessarily strict with blank lines that otherwise help with readability
12 filter=-whitespace/indent # Requires strange 3-space indent of private/protected/public markers 12 filter=-whitespace/indent # Requires strange 3-space indent of private/protected/public markers
13 filter=-whitespace/parens,-whitespace/braces # Conflict with clang-format 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 add_custom_target(cli_book SOURCES ${book_sources} ${book_chapters}) 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,6 +64,3 @@ CLI11 was developed at the [University of Cincinnati] in support of the [GooFit]
64 [University of Cincinnati]: http://www.uc.edu 64 [University of Cincinnati]: http://www.uc.edu
65 [Plumbum]: http://plumbum.readthedocs.io/en/latest/ 65 [Plumbum]: http://plumbum.readthedocs.io/en/latest/
66 [Click]: https://click.palletsprojects.com/ 66 [Click]: https://click.palletsprojects.com/
67 -  
68 -  
69 -  
book/SUMMARY.md
@@ -13,4 +13,3 @@ @@ -13,4 +13,3 @@
13 * [Toolkits](/chapters/toolkits.md) 13 * [Toolkits](/chapters/toolkits.md)
14 * [Advanced topics](/chapters/advanced-topics.md) 14 * [Advanced topics](/chapters/advanced-topics.md)
15 * [Internals](/chapters/internals.md) 15 * [Internals](/chapters/internals.md)
16 -  
book/chapters/basics.md
@@ -24,4 +24,3 @@ Usage: ./a.out [OPTIONS] @@ -24,4 +24,3 @@ Usage: ./a.out [OPTIONS]
24 Options: 24 Options:
25 -h,--help Print this help message and exit 25 -h,--help Print this help message and exit
26 ``` 26 ```
27 -  
book/chapters/formatting.md
@@ -72,7 +72,3 @@ Notes: @@ -72,7 +72,3 @@ Notes:
72 72
73 * `*1`: This signature depends on whether the call is from a positional or optional. 73 * `*1`: This signature depends on whether the call is from a positional or optional.
74 * `o` is opt pointer, `p` is true if positional. 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,5 +41,3 @@ The `_process` procedure runs the following steps; each step is recursive and co
41 ## Exceptions 41 ## Exceptions
42 42
43 The library immediately returns a C++ exception when it detects a problem, such as an incorrect construction or a malformed command line. 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,4 +266,3 @@ There are some additional options that can be specified to modify an option for
266 266
267 ## Unusual circumstances 267 ## Unusual circumstances
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. 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,5 +60,3 @@ And, the protected members that you can set when you make your own are:
60 | `int` (`-1`) | `application_index_` | The element this validator applies to (-1 for all) | 60 | `int` (`-1`) | `application_index_` | The element this validator applies to (-1 for all) |
61 | `bool` (`true`) | `active_` | This can be disabled | 61 | `bool` (`true`) | `active_` | This can be disabled |
62 | `bool` (`false`) | `non_modifying_` | Specify that this is a Validator instead of a Transformer | 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,27 +12,21 @@ enable_testing()
12 12
13 # Quick function to add the base executable 13 # Quick function to add the base executable
14 function(add_cli_exe NAME) 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 endfunction() 17 endfunction()
18 18
19 -  
20 add_cli_exe(simplest) 19 add_cli_exe(simplest)
21 add_test(NAME simplest COMMAND simplest) 20 add_test(NAME simplest COMMAND simplest)
22 21
23 -  
24 add_cli_exe(intro) 22 add_cli_exe(intro)
25 add_test(NAME intro COMMAND intro) 23 add_test(NAME intro COMMAND intro)
26 add_test(NAME intro_p COMMAND intro -p 5) 24 add_test(NAME intro_p COMMAND intro -p 5)
27 25
28 -  
29 add_cli_exe(flags) 26 add_cli_exe(flags)
30 add_test(NAME flags COMMAND flags) 27 add_test(NAME flags COMMAND flags)
31 add_test(NAME flags_bip COMMAND flags -b -i -p) 28 add_test(NAME flags_bip COMMAND flags -b -i -p)
32 29
33 -  
34 add_cli_exe(geet) 30 add_cli_exe(geet)
35 -add_test(NAME geet_add COMMAND geet add) 31 +add_test(NAME geet_add COMMAND geet add)
36 add_test(NAME geet_commit COMMAND geet commit -m "Test") 32 add_test(NAME geet_commit COMMAND geet commit -m "Test")
37 -  
38 -  
cmake/CLI11GeneratePkgConfig.cmake
1 configure_file("cmake/CLI11.pc.in" "CLI11.pc" @ONLY) 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,57 +69,51 @@
69 include(CMakeParseArguments) 69 include(CMakeParseArguments)
70 70
71 # Check prereqs 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 if(NOT GCOV_PATH) 78 if(NOT GCOV_PATH)
79 - message(FATAL_ERROR "gcov not found! Aborting...") 79 + message(FATAL_ERROR "gcov not found! Aborting...")
80 endif() # NOT GCOV_PATH 80 endif() # NOT GCOV_PATH
81 81
82 if("${CMAKE_CXX_COMPILER_ID}" MATCHES "(Apple)?[Cc]lang") 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 elseif(NOT CMAKE_COMPILER_IS_GNUCXX) 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 endif() 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 CACHE INTERNAL "") 92 CACHE INTERNAL "")
92 93
93 set(CMAKE_CXX_FLAGS_COVERAGE 94 set(CMAKE_CXX_FLAGS_COVERAGE
94 ${COVERAGE_COMPILER_FLAGS} 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 set(CMAKE_C_FLAGS_COVERAGE 97 set(CMAKE_C_FLAGS_COVERAGE
98 ${COVERAGE_COMPILER_FLAGS} 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 set(CMAKE_EXE_LINKER_FLAGS_COVERAGE 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 set(CMAKE_SHARED_LINKER_FLAGS_COVERAGE 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 if(NOT CMAKE_BUILD_TYPE STREQUAL "Debug") 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 endif() # NOT CMAKE_BUILD_TYPE STREQUAL "Debug" 111 endif() # NOT CMAKE_BUILD_TYPE STREQUAL "Debug"
118 112
119 if(CMAKE_C_COMPILER_ID STREQUAL "GNU") 113 if(CMAKE_C_COMPILER_ID STREQUAL "GNU")
120 - link_libraries(gcov) 114 + link_libraries(gcov)
121 else() 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 endif() 117 endif()
124 118
125 # Defines a target for running and collection code coverage information 119 # Defines a target for running and collection code coverage information
@@ -134,54 +128,57 @@ endif() @@ -134,54 +128,57 @@ endif()
134 # ) 128 # )
135 function(SETUP_TARGET_FOR_COVERAGE) 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 endfunction() # SETUP_TARGET_FOR_COVERAGE 183 endfunction() # SETUP_TARGET_FOR_COVERAGE
187 184
@@ -197,48 +194,50 @@ endfunction() # SETUP_TARGET_FOR_COVERAGE @@ -197,48 +194,50 @@ endfunction() # SETUP_TARGET_FOR_COVERAGE
197 # ) 194 # )
198 function(SETUP_TARGET_FOR_COVERAGE_COBERTURA) 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 endfunction() # SETUP_TARGET_FOR_COVERAGE_COBERTURA 233 endfunction() # SETUP_TARGET_FOR_COVERAGE_COBERTURA
239 234
240 function(APPEND_COVERAGE_COMPILER_FLAGS) 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 endfunction() # APPEND_COVERAGE_COMPILER_FLAGS 243 endfunction() # APPEND_COVERAGE_COMPILER_FLAGS
docs/CMakeLists.txt
@@ -2,17 +2,10 @@ set(DOXYGEN_EXTRACT_ALL YES) @@ -2,17 +2,10 @@ set(DOXYGEN_EXTRACT_ALL YES)
2 set(DOXYGEN_BUILTIN_STL_SUPPORT YES) 2 set(DOXYGEN_BUILTIN_STL_SUPPORT YES)
3 set(PROJECT_BRIEF "C++11 Command Line Interface Parser") 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,6 +21,3 @@ Groups of related topics:
21 |----------------------|------------------------------------------------| 21 |----------------------|------------------------------------------------|
22 | @ref error_group | Errors that can be thrown | 22 | @ref error_group | Errors that can be thrown |
23 | @ref validator_group | Common validators used in CLI::Option::check() | 23 | @ref validator_group | Common validators used in CLI::Option::check() |
24 -  
25 -  
26 -  
examples/CMakeLists.txt
1 -  
2 function(add_cli_exe T) 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 endfunction() 14 endfunction()
13 15
14 if(CLI11_BUILD_EXAMPLES_JSON) 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 endif() 39 endif()
46 40
47 -  
48 add_cli_exe(simple simple.cpp) 41 add_cli_exe(simple simple.cpp)
49 add_test(NAME simple_basic COMMAND simple) 42 add_test(NAME simple_basic COMMAND simple)
50 add_test(NAME simple_all COMMAND simple -f filename.txt -c 12 --flag --flag -d 1.2) 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 add_test(NAME simple_version COMMAND simple --version) 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 add_cli_exe(subcommands subcommands.cpp) 53 add_cli_exe(subcommands subcommands.cpp)
62 add_test(NAME subcommands_none COMMAND subcommands) 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 add_cli_exe(subcom_partitioned subcom_partitioned.cpp) 66 add_cli_exe(subcom_partitioned subcom_partitioned.cpp)
74 add_test(NAME subcom_partitioned_none COMMAND subcom_partitioned) 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 add_test(NAME subcom_partitioned_all COMMAND subcom_partitioned --file this --count --count -d 1.2) 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 add_test(NAME subcom_partitioned_help COMMAND subcom_partitioned --help) 80 add_test(NAME subcom_partitioned_help COMMAND subcom_partitioned --help)
88 set_property(TEST subcom_partitioned_help PROPERTY PASS_REGULAR_EXPRESSION 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 add_cli_exe(option_groups option_groups.cpp) 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 add_test(NAME option_groups_extra COMMAND option_groups --csv --binary) 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 add_cli_exe(positional_arity positional_arity.cpp) 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 add_test(NAME positional_arity3 COMMAND positional_arity 1 2 one) 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 add_test(NAME positional_arity_fail COMMAND positional_arity 1 one two) 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 add_test(NAME positional_validation3 COMMAND positional_validation 1 2 one) 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 add_test(NAME positional_validation4 COMMAND positional_validation 1 one two 2) 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 add_cli_exe(shapes shapes.cpp) 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 add_cli_exe(ranges ranges.cpp) 123 add_cli_exe(ranges ranges.cpp)
144 add_test(NAME ranges_range COMMAND ranges --range 1 2 3) 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 add_test(NAME ranges_minmax COMMAND ranges --min 2 --max 3) 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 add_test(NAME ranges_error COMMAND ranges --min 2 --max 3 --step 1 --range 1 2 3) 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 add_cli_exe(validators validators.cpp) 131 add_cli_exe(validators validators.cpp)
155 add_test(NAME validators_help COMMAND validators --help) 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 add_test(NAME validators_file COMMAND validators --file nonex.xxx) 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 add_test(NAME validators_plain COMMAND validators --value 9) 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 add_cli_exe(groups groups.cpp) 146 add_cli_exe(groups groups.cpp)
169 add_test(NAME groups_none COMMAND groups) 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 add_test(NAME groups_all COMMAND groups --file this --count --count -d 1.2) 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 add_cli_exe(inter_argument_order inter_argument_order.cpp) 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 [=[foo : 1 165 [=[foo : 1
185 foo : 2 166 foo : 2
186 foo : 3 167 foo : 3
@@ -192,44 +173,37 @@ foo : 8]=]) @@ -192,44 +173,37 @@ foo : 8]=])
192 173
193 add_cli_exe(prefix_command prefix_command.cpp) 174 add_cli_exe(prefix_command prefix_command.cpp)
194 add_test(NAME prefix_command COMMAND prefix_command -v 3 2 1 -- other one two 3) 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 add_cli_exe(callback_passthrough callback_passthrough.cpp) 179 add_cli_exe(callback_passthrough callback_passthrough.cpp)
200 add_test(NAME callback_passthrough1 COMMAND callback_passthrough --argname t2 --t2 test) 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 add_test(NAME callback_passthrough2 COMMAND callback_passthrough --arg EEEK --argname arg) 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 add_cli_exe(enum enum.cpp) 185 add_cli_exe(enum enum.cpp)
208 add_test(NAME enum_pass COMMAND enum -l 1) 186 add_test(NAME enum_pass COMMAND enum -l 1)
209 add_test(NAME enum_fail COMMAND enum -l 4) 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 add_cli_exe(enum_ostream enum_ostream.cpp) 191 add_cli_exe(enum_ostream enum_ostream.cpp)
214 add_test(NAME enum_ostream_pass COMMAND enum_ostream --level medium) 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 add_cli_exe(digit_args digit_args.cpp) 195 add_cli_exe(digit_args digit_args.cpp)
219 add_test(NAME digit_args COMMAND digit_args -h) 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 add_cli_exe(modhelp modhelp.cpp) 199 add_cli_exe(modhelp modhelp.cpp)
224 add_test(NAME modhelp COMMAND modhelp -a test -h) 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 add_subdirectory(subcom_in_files) 203 add_subdirectory(subcom_in_files)
229 add_test(NAME subcom_in_files COMMAND subcommand_main subcommand_a -f this.txt --with-foo) 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 add_cli_exe(formatter formatter.cpp) 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,14 +219,10 @@ add_test(NAME retired_retired_test2 COMMAND retired --retired_option 567)
245 add_test(NAME retired_retired_test3 COMMAND retired --retired_option2 567 689 789) 219 add_test(NAME retired_retired_test3 COMMAND retired --retired_option2 567 689 789)
246 add_test(NAME retired_deprecated COMMAND retired --deprecate 19 20) 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 list(APPEND CMAKE_MODULE_PATH "${CLI11_SOURCE_DIR}/cmake") 1 list(APPEND CMAKE_MODULE_PATH "${CLI11_SOURCE_DIR}/cmake")
2 2
3 if(CLI11_SANITIZERS) 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 else() 23 else()
23 - macro(add_sanitizers)  
24 - endmacro()  
25 -endif() 24 + macro(add_sanitizers)
26 25
  26 + endmacro()
  27 +endif()
27 28
28 # Add boost to test boost::optional (currently explicitly requested)" 29 # Add boost to test boost::optional (currently explicitly requested)"
29 option(CLI11_BOOST "Turn on boost test (currently may fail with Boost 1.70)" OFF) 30 option(CLI11_BOOST "Turn on boost test (currently may fail with Boost 1.70)" OFF)
30 if(CLI11_BOOST) 31 if(CLI11_BOOST)
31 - find_package(Boost 1.61 REQUIRED) 32 + find_package(Boost 1.61 REQUIRED)
32 endif() 33 endif()
33 set(boost-optional-def $<$<BOOL:${Boost_FOUND}>:CLI11_BOOST_OPTIONAL>) 34 set(boost-optional-def $<$<BOOL:${Boost_FOUND}>:CLI11_BOOST_OPTIONAL>)
34 35
@@ -50,15 +51,14 @@ set(CLI11_TESTS @@ -50,15 +51,14 @@ set(CLI11_TESTS
50 StringParseTest 51 StringParseTest
51 ComplexTypeTest 52 ComplexTypeTest
52 TrueFalseTest 53 TrueFalseTest
53 - OptionGroupTest  
54 - ) 54 + OptionGroupTest)
55 55
56 if(WIN32) 56 if(WIN32)
57 - list(APPEND CLI11_TESTS WindowsTest) 57 + list(APPEND CLI11_TESTS WindowsTest)
58 endif() 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 endif() 62 endif()
63 63
64 set(CLI11_MULTIONLY_TESTS TimerTest) 64 set(CLI11_MULTIONLY_TESTS TimerTest)
@@ -71,67 +71,63 @@ target_include_directories(catch_main PUBLIC &quot;${CMAKE_CURRENT_SOURCE_DIR}&quot;) @@ -71,67 +71,63 @@ target_include_directories(catch_main PUBLIC &quot;${CMAKE_CURRENT_SOURCE_DIR}&quot;)
71 # requires newer CMake. 71 # requires newer CMake.
72 72
73 set(url https://github.com/philsquared/Catch/releases/download/v2.13.4/catch.hpp) 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 list(GET status 0 error) 78 list(GET status 0 error)
76 if(error) 79 if(error)
77 - message(FATAL_ERROR "Could not download ${url}") 80 + message(FATAL_ERROR "Could not download ${url}")
78 endif() 81 endif()
79 target_include_directories(catch_main PUBLIC "${CMAKE_CURRENT_BINARY_DIR}") 82 target_include_directories(catch_main PUBLIC "${CMAKE_CURRENT_BINARY_DIR}")
80 83
81 # Target must already exist 84 # Target must already exist
82 macro(add_catch_test TESTNAME) 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 endmacro() 96 endmacro()
92 97
93 foreach(T IN LISTS CLI11_TESTS) 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 endforeach() 116 endforeach()
115 117
116 foreach(T IN LISTS CLI11_MULTIONLY_TESTS) 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 endforeach() 123 endforeach()
122 124
123 # Add -Wno-deprecated-declarations to DeprecatedTest 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 endif() 131 endif()
136 132
137 # Link test (build error if inlines missing) 133 # Link test (build error if inlines missing)
@@ -142,33 +138,38 @@ add_executable(link_test_2 link_test_2.cpp) @@ -142,33 +138,38 @@ add_executable(link_test_2 link_test_2.cpp)
142 target_link_libraries(link_test_2 PUBLIC CLI11 link_test_1) 138 target_link_libraries(link_test_2 PUBLIC CLI11 link_test_1)
143 add_catch_test(link_test_2) 139 add_catch_test(link_test_2)
144 if(CLI11_FORCE_LIBCXX) 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 endif() 149 endif()
150 150
151 # Add informational printout 151 # Add informational printout
152 add_executable(informational informational.cpp) 152 add_executable(informational informational.cpp)
153 target_link_libraries(informational PUBLIC CLI11) 153 target_link_libraries(informational PUBLIC CLI11)
154 if(CLI11_FORCE_LIBCXX) 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 endif() 159 endif()
158 160
159 # Force this to be in a standard location so CTest can find it 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 # Adding this printout to CTest 170 # Adding this printout to CTest
169 file(WRITE "${PROJECT_BINARY_DIR}/CTestCustom.cmake" 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 target_compile_definitions(informational PRIVATE ${boost-optional-def}) 174 target_compile_definitions(informational PRIVATE ${boost-optional-def})
174 target_compile_definitions(OptionalTest PRIVATE ${boost-optional-def}) 175 target_compile_definitions(OptionalTest PRIVATE ${boost-optional-def})
@@ -176,33 +177,33 @@ target_compile_definitions(OptionalTest PRIVATE ${boost-optional-def}) @@ -176,33 +177,33 @@ target_compile_definitions(OptionalTest PRIVATE ${boost-optional-def})
176 message(STATUS "Boost libs=${Boost_INCLUDE_DIRS}") 177 message(STATUS "Boost libs=${Boost_INCLUDE_DIRS}")
177 178
178 if(TARGET Boost::boost) 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 elseif(BOOST_FOUND) 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 endif() 197 endif()
197 198
198 if(CMAKE_BUILD_TYPE STREQUAL Coverage) 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 endif() 209 endif()
208 -