diff --git a/.ci/azure-build.yml b/.ci/azure-build.yml index ab0bf069..04ee5d6b 100644 --- a/.ci/azure-build.yml +++ b/.ci/azure-build.yml @@ -1,7 +1,7 @@ steps: # Needed on GCC 4.8 docker image for some reason - script: mkdir build - displalyName: "Make build directory" + displayName: "Make build directory" - task: CMake@1 inputs: diff --git a/CMakeLists.txt b/CMakeLists.txt index 7786d9cd..31bbbbb6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -27,6 +27,8 @@ project( LANGUAGES CXX VERSION ${VERSION_STRING}) +list(APPEND CMAKE_MODULE_PATH "${CLI11_SOURCE_DIR}/cmake") + # Print the version number of CMake if this is the main project if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME) message(STATUS "CMake ${CMAKE_VERSION}") @@ -128,89 +130,9 @@ if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME) set_property(GLOBAL PROPERTY USE_FOLDERS ON) endif() -# Special target that adds warnings. Is not exported. -add_library(CLI11_warnings INTERFACE) +include(CLI11Warnings) -set(unix-warnings -Wall -Wextra -pedantic -Wshadow -Wsign-conversion -Wswitch-enum) - -# Clang warnings -# -Wfloat-equal could be added with Catch::literals and _a usage -if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") - list( - APPEND - unix-warnings - -Wcast-align - -Wimplicit-atomic-properties - -Wmissing-declarations - -Woverlength-strings - -Wshadow - -Wstrict-selector-match - -Wundeclared-selector) - # -Wunreachable-code Doesn't work on Clang 3.4 -endif() - -# Buggy in GCC 4.8 -if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.9) - list(APPEND unix-warnings -Weffc++) -endif() - -target_compile_options( - CLI11_warnings - INTERFACE $<$:-stdlib=libc++> - $<$:/W4 - $<$:/WX>> - $<$>:${unix-warnings} - $<$:-Werror>>) - -if(NOT CMAKE_VERSION VERSION_LESS 3.13) - target_link_options(CLI11_warnings INTERFACE $<$:-stdlib=libc++>) -endif() - -# To see in IDE, headers must be listed for target -set(MAYBE_CONFIGURE_DEPENDS "") -if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME AND NOT CMAKE_VERSION VERSION_LESS 3.12) - list(INSERT MAYBE_CONFIGURE_DEPENDS 0 CONFIGURE_DEPENDS) -endif() - -file(GLOB CLI11_headers ${MAYBE_CONFIGURE_DEPENDS} "${PROJECT_SOURCE_DIR}/include/CLI/*.hpp") -file(GLOB CLI11_impl_headers ${MAYBE_CONFIGURE_DEPENDS} - "${PROJECT_SOURCE_DIR}/include/CLI/impl/*.hpp") - -if(CLI11_PRECOMPILED) - # Create static lib - file(GLOB CLI11_precompile_sources "${PROJECT_SOURCE_DIR}/src/*.cpp") - add_library(CLI11 STATIC ${CLI11_headers} ${CLI11_impl_headers} ${CLI11_precompile_sources}) - target_compile_definitions(CLI11 PUBLIC -DCLI11_COMPILE) - - set(PUBLIC_OR_INTERFACE PUBLIC) -else() - add_library(CLI11 INTERFACE) - set(PUBLIC_OR_INTERFACE INTERFACE) -endif() - -# Allow IDE's to group targets into folders -add_library(CLI11::CLI11 ALIAS CLI11) # for add_subdirectory calls - -# Duplicated because CMake adds the current source dir if you don't. -target_include_directories( - CLI11 ${PUBLIC_OR_INTERFACE} $ - $) - -if(CMAKE_VERSION VERSION_LESS 3.8) - # This might not be a complete list - target_compile_features( - CLI11 - INTERFACE cxx_lambdas - cxx_nullptr - cxx_override - cxx_range_for - cxx_right_angle_brackets - cxx_strong_enums - cxx_constexpr - cxx_auto_type) -else() - target_compile_features(CLI11 INTERFACE cxx_std_11) -endif() +add_subdirectory(src) # Allow tests to be run on CUDA if(CLI11_CUDA_TESTS) @@ -222,13 +144,6 @@ endif() # This folder should be installed if(CLI11_INSTALL) - install(FILES ${CLI11_headers} DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/CLI") - if(NOT CLI11_COMPILE) - install(FILES ${CLI11_impl_headers} DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/CLI/impl") - endif() - - # Make an export target - install(TARGETS CLI11 EXPORT CLI11Targets) # Use find_package on the installed package # Since we have no custom code, we can directly write this @@ -261,42 +176,6 @@ if(CLI11_INSTALL) export(PACKAGE CLI11) endif() -if(CLI11_SINGLE_FILE) - # Single file test - if(CMAKE_VERSION VERSION_LESS 3.12) - find_package(PythonInterp REQUIRED) - add_executable(Python::Interpreter IMPORTED) - set_target_properties(Python::Interpreter PROPERTIES IMPORTED_LOCATION "${PYTHON_EXECUTABLE}" - VERSION "${PYTHON_VERSION_STRING}") - else() - find_package( - Python - COMPONENTS Interpreter - REQUIRED) - endif() - - file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/include") - add_custom_command( - OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/include/CLI11.hpp" - COMMAND - Python::Interpreter "${CMAKE_CURRENT_SOURCE_DIR}/scripts/MakeSingleHeader.py" - ${CLI11_headers} ${CLI11_impl_headers} --main "${CMAKE_CURRENT_SOURCE_DIR}/CLI11.hpp.in" - --output "${CMAKE_CURRENT_BINARY_DIR}/include/CLI11.hpp" --version "${CLI11_VERSION}" - DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/include/CLI/CLI.hpp" ${CLI11_headers} - ${CLI11_impl_headers}) - add_custom_target(CLI11-generate-single-file ALL - DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/include/CLI11.hpp") - set_property(TARGET CLI11-generate-single-file PROPERTY FOLDER "Scripts") - install(FILES "${CMAKE_CURRENT_BINARY_DIR}/include/CLI11.hpp" DESTINATION include) - add_library(CLI11_SINGLE INTERFACE) - target_link_libraries(CLI11_SINGLE INTERFACE CLI11) - add_dependencies(CLI11_SINGLE CLI11-generate-single-file) - target_compile_definitions(CLI11_SINGLE INTERFACE -DCLI11_SINGLE_FILE) - target_include_directories( - CLI11_SINGLE INTERFACE $ - $) -endif() - if(CLI11_BUILD_TESTS) include(CTest) add_subdirectory(tests) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 7540a2ea..c519e153 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -110,7 +110,7 @@ jobs: containerImage: gcc:8 cli11.std: 17 gcc4.8: - containerImage: gcc:4.8 + containerImage: helics/buildenv:gcc4-8-builder cli11.std: 11 cli11.options: clang3.4: diff --git a/cmake/CLI11Warnings.cmake b/cmake/CLI11Warnings.cmake new file mode 100644 index 00000000..8b4b499d --- /dev/null +++ b/cmake/CLI11Warnings.cmake @@ -0,0 +1,37 @@ +# Special target that adds warnings. Is not exported. +add_library(CLI11_warnings INTERFACE) + +set(unix-warnings -Wall -Wextra -pedantic -Wshadow -Wsign-conversion -Wswitch-enum) + +# Clang warnings +# -Wfloat-equal could be added with Catch::literals and _a usage +if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") + list( + APPEND + unix-warnings + -Wcast-align + -Wimplicit-atomic-properties + -Wmissing-declarations + -Woverlength-strings + -Wshadow + -Wstrict-selector-match + -Wundeclared-selector) + # -Wunreachable-code Doesn't work on Clang 3.4 +endif() + +# Buggy in GCC 4.8 +if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.9) + list(APPEND unix-warnings -Weffc++) +endif() + +target_compile_options( + CLI11_warnings + INTERFACE $<$:-stdlib=libc++> + $<$:/W4 + $<$:/WX>> + $<$>:${unix-warnings} + $<$:-Werror>>) + +if(NOT CMAKE_VERSION VERSION_LESS 3.13) + target_link_options(CLI11_warnings INTERFACE $<$:-stdlib=libc++>) +endif() diff --git a/conanfile.py b/conanfile.py index 377cd014..9dc6ce3a 100644 --- a/conanfile.py +++ b/conanfile.py @@ -27,6 +27,7 @@ class CLI11Conan(ConanFile): "LICENSE", "README.md", "include/*", + "src/*", "extern/*", "cmake/*", "CMakeLists.txt", diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index e124df67..131a9fd0 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,5 +1,5 @@ function(add_cli_exe T) - add_executable(${T} ${ARGN} ${CLI11_headers}) + add_executable(${T} ${ARGN}) target_link_libraries(${T} PUBLIC CLI11) set_property(TARGET ${T} PROPERTY FOLDER "Examples") if(CLI11_FORCE_LIBCXX) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 00000000..341cae42 --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,120 @@ +set(CLI11_headerLoc "${PROJECT_SOURCE_DIR}/include/CLI") + +set(CLI11_headers + ${CLI11_headerLoc}/App.hpp + ${CLI11_headerLoc}/CLI.hpp + ${CLI11_headerLoc}/Config.hpp + ${CLI11_headerLoc}/ConfigFwd.hpp + ${CLI11_headerLoc}/Error.hpp + ${CLI11_headerLoc}/Formatter.hpp + ${CLI11_headerLoc}/FormatterFwd.hpp + ${CLI11_headerLoc}/Macros.hpp + ${CLI11_headerLoc}/Option.hpp + ${CLI11_headerLoc}/Split.hpp + ${CLI11_headerLoc}/StringTools.hpp + ${CLI11_headerLoc}/Timer.hpp + ${CLI11_headerLoc}/TypeTools.hpp + ${CLI11_headerLoc}/Validators.hpp + ${CLI11_headerLoc}/Version.hpp) + +set(CLI11_implLoc "${PROJECT_SOURCE_DIR}/include/CLI/impl") + +set(CLI11_impl_headers + ${CLI11_implLoc}/App_inl.hpp + ${CLI11_implLoc}/Config_inl.hpp + ${CLI11_implLoc}/Formatter_inl.hpp + ${CLI11_implLoc}/Option_inl.hpp + ${CLI11_implLoc}/Split_inl.hpp + ${CLI11_implLoc}/StringTools_inl.hpp + ${CLI11_implLoc}/Validators_inl.hpp) + +if(CLI11_PRECOMPILED) + # Create static lib + file(GLOB CLI11_precompile_sources "${PROJECT_SOURCE_DIR}/src/*.cpp") + add_library(CLI11 STATIC ${CLI11_headers} ${CLI11_impl_headers} ${CLI11_precompile_sources}) + target_compile_definitions(CLI11 PUBLIC -DCLI11_COMPILE) + + set(PUBLIC_OR_INTERFACE PUBLIC) +else() + add_library(CLI11 INTERFACE) + if(CMAKE_VERSION VERSION_GREATER 3.19) + # This is only useful for visual studio and other IDE builds + target_sources(CLI11 PRIVATE ${CLI11_headers} ${CLI11_impl_headers}) + endif() + + set(PUBLIC_OR_INTERFACE INTERFACE) +endif() + +# Allow IDE's to group targets into folders +add_library(CLI11::CLI11 ALIAS CLI11) # for add_subdirectory calls + +# Duplicated because CMake adds the current source dir if you don't. +target_include_directories( + CLI11 ${PUBLIC_OR_INTERFACE} $ + $) + +if(CMAKE_VERSION VERSION_LESS 3.8) + # This might not be a complete list + target_compile_features( + CLI11 + INTERFACE cxx_lambdas + cxx_nullptr + cxx_override + cxx_range_for + cxx_right_angle_brackets + cxx_strong_enums + cxx_constexpr + cxx_auto_type) +else() + target_compile_features(CLI11 INTERFACE cxx_std_11) +endif() + +if(CLI11_SINGLE_FILE) + # Single file test + if(CMAKE_VERSION VERSION_LESS 3.12) + find_package(PythonInterp REQUIRED) + add_executable(Python::Interpreter IMPORTED) + set_target_properties(Python::Interpreter PROPERTIES IMPORTED_LOCATION "${PYTHON_EXECUTABLE}" + VERSION "${PYTHON_VERSION_STRING}") + else() + find_package( + Python + COMPONENTS Interpreter + REQUIRED) + endif() + + file(MAKE_DIRECTORY "${PROJECT_BINARY_DIR}/include") + add_custom_command( + OUTPUT "${PROJECT_BINARY_DIR}/include/CLI11.hpp" + COMMAND + Python::Interpreter "${PROJECT_SOURCE_DIR}/scripts/MakeSingleHeader.py" ${CLI11_headers} + ${CLI11_impl_headers} --main "${PROJECT_SOURCE_DIR}/CLI11.hpp.in" --output + "${PROJECT_BINARY_DIR}/include/CLI11.hpp" --version "${CLI11_VERSION}" + DEPENDS "${PROJECT_SOURCE_DIR}/include/CLI/CLI.hpp" ${CLI11_headers} ${CLI11_impl_headers}) + add_custom_target(CLI11-generate-single-file ALL + DEPENDS "${PROJECT_BINARY_DIR}/include/CLI11.hpp") + set_property(TARGET CLI11-generate-single-file PROPERTY FOLDER "Scripts") + if(CLI11_INSTALL) + install(FILES "${PROJECT_BINARY_DIR}/include/CLI11.hpp" + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) + endif() + add_library(CLI11_SINGLE INTERFACE) + target_link_libraries(CLI11_SINGLE INTERFACE CLI11) + add_dependencies(CLI11_SINGLE CLI11-generate-single-file) + target_compile_definitions(CLI11_SINGLE INTERFACE -DCLI11_SINGLE_FILE) + target_include_directories( + CLI11_SINGLE INTERFACE $ + $) +endif() + +if(CLI11_INSTALL) + + # Make an export target + install(TARGETS CLI11 EXPORT CLI11Targets) + if(NOT CLI11_SINGLE_FILE) + install(FILES ${CLI11_headers} DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/CLI") + if(NOT CLI11_COMPILE) + install(FILES ${CLI11_impl_headers} DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/CLI/impl") + endif() + endif() +endif() diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 80c4f6a8..7d89e128 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -1,5 +1,3 @@ -list(APPEND CMAKE_MODULE_PATH "${CLI11_SOURCE_DIR}/cmake") - if(CLI11_SANITIZERS) message(STATUS "Using arsenm/sanitizers-cmake") FetchContent_Declare( @@ -109,7 +107,7 @@ foreach(T IN LISTS CLI11_TESTS) if(CLI11_CUDA_TESTS) set_property(SOURCE ${T}.cpp PROPERTY LANGUAGE CUDA) endif() - add_executable(${T} ${T}.cpp ${CLI11_headers}) + add_executable(${T} ${T}.cpp) add_sanitizers(${T}) if(NOT CLI11_CUDA_TESTS) target_link_libraries(${T} PRIVATE CLI11_warnings) @@ -126,7 +124,7 @@ foreach(T IN LISTS CLI11_TESTS) endforeach() foreach(T IN LISTS CLI11_MULTIONLY_TESTS) - add_executable(${T} ${T}.cpp ${CLI11_headers}) + add_executable(${T} ${T}.cpp) add_sanitizers(${T}) target_link_libraries(${T} PUBLIC CLI11) add_catch_test(${T})