From 5549a82b0e42a981150591afb1619c0b35486b14 Mon Sep 17 00:00:00 2001 From: ClausKlein Date: Sun, 27 Aug 2023 10:01:21 +0200 Subject: [PATCH 1/2] Try to use UNITY_BUILD With CMAKE_UNITY_BUILD there are build error with ftxui! Quickfix: don't build ftxui_sample if CMAKE_UNITY_BUILD is set. --- CMakeLists.txt | 2 +- CMakePresets.json | 9 ++++++++- ProjectOptions.cmake | 6 +++--- src/CMakeLists.txt | 4 +++- test/CMakeLists.txt | 20 +++++++++++--------- 5 files changed, 26 insertions(+), 15 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 45e19f03..59be03b0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.21) +cmake_minimum_required(VERSION 3.21...3.27) # This template attempts to be "fetch_content"-able # so that it works well with tools like CPM or other diff --git a/CMakePresets.json b/CMakePresets.json index 5871489e..9f16e253 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -50,6 +50,9 @@ "Darwin" ] }, + "cacheVariables": { + "CMAKE_UNITY_BUILD": true + }, "vendor": { "microsoft.com/VisualStudioRemoteSettings/CMake/1.0": { "sourceDir": "$env{HOME}/.vs/$ms{projectDirName}" @@ -142,6 +145,8 @@ "description": "Target Unix-like OS with the gcc compiler, debug build type", "inherits": "conf-unixlike-common", "cacheVariables": { + "myproject_ENABLE_COVERAGE": false, + "CMAKE_SKIP_INSTALL_RULES": true, "CMAKE_C_COMPILER": "gcc", "CMAKE_CXX_COMPILER": "g++", "CMAKE_BUILD_TYPE": "Debug" @@ -164,6 +169,8 @@ "description": "Target Unix-like OS with the clang compiler, debug build type", "inherits": "conf-unixlike-common", "cacheVariables": { + "myproject_ENABLE_COVERAGE": false, + "CMAKE_SKIP_INSTALL_RULES": true, "CMAKE_C_COMPILER": "clang", "CMAKE_CXX_COMPILER": "clang++", "CMAKE_BUILD_TYPE": "Debug" @@ -251,4 +258,4 @@ "configurePreset": "unixlike-clang-release" } ] -} \ No newline at end of file +} diff --git a/ProjectOptions.cmake b/ProjectOptions.cmake index 2709aa1a..ae3a5453 100644 --- a/ProjectOptions.cmake +++ b/ProjectOptions.cmake @@ -53,9 +53,9 @@ macro(myproject_setup_options) option(myproject_ENABLE_SANITIZER_UNDEFINED "Enable undefined sanitizer" ${SUPPORTS_UBSAN}) option(myproject_ENABLE_SANITIZER_THREAD "Enable thread sanitizer" OFF) option(myproject_ENABLE_SANITIZER_MEMORY "Enable memory sanitizer" OFF) - option(myproject_ENABLE_UNITY_BUILD "Enable unity builds" OFF) - option(myproject_ENABLE_CLANG_TIDY "Enable clang-tidy" ON) - option(myproject_ENABLE_CPPCHECK "Enable cpp-check analysis" ON) + option(myproject_ENABLE_UNITY_BUILD "Enable unity builds" ON) + option(myproject_ENABLE_CLANG_TIDY "Enable clang-tidy" OFF) + option(myproject_ENABLE_CPPCHECK "Enable cpp-check analysis" OFF) option(myproject_ENABLE_PCH "Enable precompiled headers" OFF) option(myproject_ENABLE_CACHE "Enable ccache" ON) endif() diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 0f92a9d6..e35378d4 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,2 +1,4 @@ add_subdirectory(sample_library) -add_subdirectory(ftxui_sample) +if(NOT CMAKE_UNITY_BUILD) + add_subdirectory(ftxui_sample) +endif() diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 0739f424..4ca63e64 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.15...3.23) +cmake_minimum_required(VERSION 3.21...3.27) project(CmakeConfigPackageTests LANGUAGES CXX) @@ -19,15 +19,17 @@ endif() include(${Catch2_SOURCE_DIR}/extras/Catch.cmake) -# Provide a simple smoke test to make sure that the CLI works and can display a --help message -add_test(NAME cli.has_help COMMAND intro --help) +if(TARGET intro) + # Provide a simple smoke test to make sure that the CLI works and can display a --help message + add_test(NAME cli.has_help COMMAND intro --help) -# Provide a test to verify that the version being reported from the application -# matches the version given to CMake. This will be important once you package -# your program. Real world shows that this is the kind of simple mistake that is easy -# to make, but also easy to test for. -add_test(NAME cli.version_matches COMMAND intro --version) -set_tests_properties(cli.version_matches PROPERTIES PASS_REGULAR_EXPRESSION "${PROJECT_VERSION}") + # Provide a test to verify that the version being reported from the application + # matches the version given to CMake. This will be important once you package + # your program. Real world shows that this is the kind of simple mistake that is easy + # to make, but also easy to test for. + add_test(NAME cli.version_matches COMMAND intro --version) + set_tests_properties(cli.version_matches PROPERTIES PASS_REGULAR_EXPRESSION "${PROJECT_VERSION}") +endif() add_executable(tests tests.cpp) target_link_libraries( From 8024301d80c3f14c42d05e6763bae67e307f05ea Mon Sep 17 00:00:00 2001 From: ClausKlein Date: Tue, 5 Sep 2023 18:09:35 +0200 Subject: [PATCH 2/2] Add CMake workflow presets clang-format -i *.json use CMAKE_UNITY_BUILD as default prevent clang-tidy as precompile step add ENABLE_DOXYGEN option --- CMakeLists.txt | 5 ++ CMakePresets.json | 150 +++++++++++++++++++++++++++++------- CMakeUserPresets.json | 171 ++++++++++++++++++++++++++++++++++++++++++ Dependencies.cmake | 2 +- cmake/Doxygen.cmake | 2 +- src/CMakeLists.txt | 4 +- test/CMakeLists.txt | 20 +++-- 7 files changed, 312 insertions(+), 42 deletions(-) create mode 100644 CMakeUserPresets.json diff --git a/CMakeLists.txt b/CMakeLists.txt index 59be03b0..660724c0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -94,6 +94,11 @@ endif() # set the startup project for the "play" button in MSVC set_property(DIRECTORY PROPERTY VS_STARTUP_PROJECT intro) +if(ENABLE_DOXYGEN) + include(cmake/Doxygen.cmake) + myproject_enable_doxygen("") +endif() + if(CMAKE_SKIP_INSTALL_RULES) return() endif() diff --git a/CMakePresets.json b/CMakePresets.json index 9f16e253..6703f241 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -1,8 +1,8 @@ { - "version": 3, + "version": 6, "cmakeMinimumRequired": { "major": 3, - "minor": 21, + "minor": 25, "patch": 0 }, "configurePresets": [ @@ -16,7 +16,8 @@ }, { "name": "conf-windows-common", - "description": "Windows settings for MSBuild toolchain that apply to msvc and clang", + "description": + "Windows settings for MSBuild toolchain that apply to msvc and clang", "hidden": true, "inherits": "conf-common", "condition": { @@ -62,7 +63,8 @@ { "name": "windows-msvc-debug-developer-mode", "displayName": "msvc Debug (Developer Mode)", - "description": "Target Windows with the msvc compiler, debug build type", + "description": + "Target Windows with the msvc compiler, debug build type", "inherits": "conf-windows-common", "cacheVariables": { "CMAKE_C_COMPILER": "cl", @@ -74,7 +76,8 @@ { "name": "windows-msvc-release-developer-mode", "displayName": "msvc Release (Developer Mode)", - "description": "Target Windows with the msvc compiler, release build type", + "description": + "Target Windows with the msvc compiler, release build type", "inherits": "conf-windows-common", "cacheVariables": { "CMAKE_C_COMPILER": "cl", @@ -86,7 +89,8 @@ { "name": "windows-msvc-debug-user-mode", "displayName": "msvc Debug (User Mode)", - "description": "Target Windows with the msvc compiler, debug build type", + "description": + "Target Windows with the msvc compiler, debug build type", "inherits": "conf-windows-common", "cacheVariables": { "CMAKE_C_COMPILER": "cl", @@ -98,7 +102,8 @@ { "name": "windows-msvc-release-user-mode", "displayName": "msvc Release (User Mode)", - "description": "Target Windows with the msvc compiler, release build type", + "description": + "Target Windows with the msvc compiler, release build type", "inherits": "conf-windows-common", "cacheVariables": { "CMAKE_C_COMPILER": "cl", @@ -110,7 +115,8 @@ { "name": "windows-clang-debug", "displayName": "clang Debug", - "description": "Target Windows with the clang compiler, debug build type", + "description": + "Target Windows with the clang compiler, debug build type", "inherits": "conf-windows-common", "cacheVariables": { "CMAKE_C_COMPILER": "clang-cl", @@ -126,7 +132,8 @@ { "name": "windows-clang-release", "displayName": "clang Release", - "description": "Target Windows with the clang compiler, release build type", + "description": + "Target Windows with the clang compiler, release build type", "inherits": "conf-windows-common", "cacheVariables": { "CMAKE_C_COMPILER": "clang-cl", @@ -140,9 +147,10 @@ } }, { - "name": "unixlike-gcc-debug", + "name": "gcc-debug", "displayName": "gcc Debug", - "description": "Target Unix-like OS with the gcc compiler, debug build type", + "description": + "Target Unix-like OS with the gcc compiler, debug build type", "inherits": "conf-unixlike-common", "cacheVariables": { "myproject_ENABLE_COVERAGE": false, @@ -153,9 +161,10 @@ } }, { - "name": "unixlike-gcc-release", + "name": "gcc-release", "displayName": "gcc Release", - "description": "Target Unix-like OS with the gcc compiler, release build type", + "description": + "Target Unix-like OS with the gcc compiler, release build type", "inherits": "conf-unixlike-common", "cacheVariables": { "CMAKE_C_COMPILER": "gcc", @@ -164,9 +173,10 @@ } }, { - "name": "unixlike-clang-debug", + "name": "clang-debug", "displayName": "clang Debug", - "description": "Target Unix-like OS with the clang compiler, debug build type", + "description": + "Target Unix-like OS with the clang compiler, debug build type", "inherits": "conf-unixlike-common", "cacheVariables": { "myproject_ENABLE_COVERAGE": false, @@ -177,9 +187,10 @@ } }, { - "name": "unixlike-clang-release", + "name": "clang-release", "displayName": "clang Release", - "description": "Target Unix-like OS with the clang compiler, release build type", + "description": + "Target Unix-like OS with the clang compiler, release build type", "inherits": "conf-unixlike-common", "cacheVariables": { "CMAKE_C_COMPILER": "clang", @@ -191,7 +202,8 @@ "testPresets": [ { "name": "test-common", - "description": "Test CMake settings that apply to all configurations", + "description": + "Test CMake settings that apply to all configurations", "hidden": true, "output": { "outputOnFailure": true @@ -230,32 +242,118 @@ "configurePreset": "windows-clang-release" }, { - "name": "test-unixlike-gcc-debug", + "name": "gcc-debug", "displayName": "Strict", "description": "Enable output and stop on failure", "inherits": "test-common", - "configurePreset": "unixlike-gcc-debug" + "configurePreset": "gcc-debug" }, { - "name": "test-unixlike-gcc-release", + "name": "gcc-release", "displayName": "Strict", "description": "Enable output and stop on failure", "inherits": "test-common", - "configurePreset": "unixlike-gcc-release" + "configurePreset": "gcc-release" }, { - "name": "test-unixlike-clang-debug", + "name": "clang-debug", "displayName": "Strict", "description": "Enable output and stop on failure", "inherits": "test-common", - "configurePreset": "unixlike-clang-debug" + "configurePreset": "clang-debug" }, { - "name": "test-unixlike-clang-release", + "name": "clang-release", "displayName": "Strict", "description": "Enable output and stop on failure", "inherits": "test-common", - "configurePreset": "unixlike-clang-release" + "configurePreset": "clang-release" + } + ], + "buildPresets": [ + { + "name": "clang-release", + "configurePreset": "clang-release" + }, + { + "name": "clang-install", + "configurePreset": "clang-release", + "targets": [ + "install" + ] + }, + { + "name": "clang-debug", + "configurePreset": "clang-debug" + }, + { + "name": "gcc-release", + "configurePreset": "gcc-release" + }, + { + "name": "gcc-install", + "configurePreset": "gcc-release", + "targets": [ + "install" + ] + }, + { + "name": "gcc-debug", + "configurePreset": "gcc-debug" + } + ], + "packagePresets": [ + { + "name": "clang-release", + "configurePreset": "clang-release", + "generators": [ + "TGZ" + ] + }, + { + "name": "gcc-release", + "configurePreset": "gcc-release", + "generators": [ + "TGZ" + ] + } + ], + "workflowPresets": [ + { + "description": "Developer workflow without installation", + "name": "clang-debug", + "steps": [ + { + "type": "configure", + "name": "clang-debug" + }, + { + "type": "build", + "name": "clang-debug" + }, + { + "type": "test", + "name": "clang-debug" + } + ] + }, + { + "description": "Release workflow without test", + "name": "clang-release", + "steps": [ + { + "name": "clang-release", + "type": "configure" + }, + { + "name": "clang-release", + "type": "build" + }, + { + "name": "clang-release", + "type": "package" + } + ] } ] } diff --git a/CMakeUserPresets.json b/CMakeUserPresets.json new file mode 100644 index 00000000..78052ded --- /dev/null +++ b/CMakeUserPresets.json @@ -0,0 +1,171 @@ +{ + "version": 6, + "cmakeMinimumRequired": { + "major": 3, + "minor": 26, + "patch": 0 + }, + "configurePresets": [ + { + "name": "default-config", + "hidden": true, + "generator": "Ninja", + "cacheVariables": { + "CMAKE_HOST_SYSTEM_PROCESSOR": "$penv{PROCESSOR_ARCHITECTURE}" + } + }, + { + "name": "common-config", + "description": "Settings for all toolchains", + "hidden": true, + "inherits": "default-config", + "binaryDir": "${sourceDir}/out/build/${presetName}", + "installDir": "${sourceDir}/out/install/${presetName}", + "cacheVariables": { + "ENABLE_DOXYGEN": false, + "ENABLE_CPPCHECK": false, + "ENABLE_CLANG_TIDY": false + }, + "vendor": { + "microsoft.com/VisualStudioRemoteSettings/CMake/1.0": { + "sourceDir": "$env{HOME}/.vs/$ms{projectDirName}" + } + } + }, + { + "name": "debug", + "displayName": "Debug", + "description": "Debug build type", + "inherits": "conf-unixlike-common", + "cacheVariables": { + "CMAKE_SKIP_INSTALL_RULES": true, + "CMAKE_BUILD_TYPE": "Debug", + "myproject_ENABLE_COVERAGE": true + } + }, + { + "name": "release", + "displayName": "Release", + "description": "Release build type", + "inherits": "conf-unixlike-common", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Release", + "ENABLE_DOXYGEN": true + } + } + ], + "testPresets": [ + { + "name": "common-test", + "description": + "Test CMake settings that apply to all configurations", + "hidden": true, + "output": { + "outputOnFailure": true + }, + "execution": { + "noTestsAction": "error", + "stopOnFailure": true + } + }, + { + "name": "debug", + "displayName": "Strict", + "description": "Enable output and stop on failure", + "inherits": "common-test", + "configuration": "Debug", + "configurePreset": "debug" + }, + { + "name": "release", + "displayName": "Strict", + "description": "Enable output and stop on failure", + "inherits": "common-test", + "configuration": "Release", + "configurePreset": "release" + } + ], + "buildPresets": [ + { + "name": "release", + "configurePreset": "release" + }, + { + "name": "install", + "configurePreset": "release", + "targets": [ + "install" + ] + }, + { + "name": "doxygen-docs", + "configurePreset": "release", + "targets": [ + "doxygen-docs" + ] + }, + { + "name": "debug", + "configurePreset": "debug" + } + ], + "packagePresets": [ + { + "name": "release", + "configurePreset": "release", + "generators": [ + "TGZ" + ] + } + ], + "workflowPresets": [ + { + "description": "Developer workflow without installation", + "name": "debug", + "steps": [ + { + "type": "configure", + "name": "debug" + }, + { + "type": "build", + "name": "debug" + }, + { + "type": "test", + "name": "debug" + } + ] + }, + { + "description": "Release workflow without test", + "name": "release", + "steps": [ + { + "name": "release", + "type": "configure" + }, + { + "name": "release", + "type": "build" + }, + { + "name": "release", + "type": "test" + }, + { + "name": "install", + "type": "build" + }, + { + "name": "doxygen-docs", + "type": "build" + }, + { + "name": "release", + "type": "package" + } + ] + } + ] +} diff --git a/Dependencies.cmake b/Dependencies.cmake index a84378d2..9b6f22bb 100644 --- a/Dependencies.cmake +++ b/Dependencies.cmake @@ -33,7 +33,7 @@ function(myproject_setup_dependencies) endif() if(NOT TARGET ftxui::screen) - cpmaddpackage("gh:ArthurSonzogni/FTXUI#e23dbc7473654024852ede60e2121276c5aab660") + cpmaddpackage("gh:ArthurSonzogni/FTXUI#dd6a5d371fd7a3e2937bb579955003c54b727233") endif() if(NOT TARGET tools::tools) diff --git a/cmake/Doxygen.cmake b/cmake/Doxygen.cmake index ed90c566..259f1891 100644 --- a/cmake/Doxygen.cmake +++ b/cmake/Doxygen.cmake @@ -49,6 +49,6 @@ function(myproject_enable_doxygen DOXYGEN_THEME) # add doxygen-docs target message(STATUS "Adding `doxygen-docs` target that builds the documentation.") - doxygen_add_docs(doxygen-docs ALL ${PROJECT_SOURCE_DIR} + doxygen_add_docs(doxygen-docs EXCLUDE_FROM_ALL ${PROJECT_SOURCE_DIR} COMMENT "Generating documentation - entry file: ${CMAKE_CURRENT_BINARY_DIR}/html/index.html") endfunction() diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index e35378d4..0f92a9d6 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,4 +1,2 @@ add_subdirectory(sample_library) -if(NOT CMAKE_UNITY_BUILD) - add_subdirectory(ftxui_sample) -endif() +add_subdirectory(ftxui_sample) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 4ca63e64..f0f3c962 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -19,17 +19,15 @@ endif() include(${Catch2_SOURCE_DIR}/extras/Catch.cmake) -if(TARGET intro) - # Provide a simple smoke test to make sure that the CLI works and can display a --help message - add_test(NAME cli.has_help COMMAND intro --help) - - # Provide a test to verify that the version being reported from the application - # matches the version given to CMake. This will be important once you package - # your program. Real world shows that this is the kind of simple mistake that is easy - # to make, but also easy to test for. - add_test(NAME cli.version_matches COMMAND intro --version) - set_tests_properties(cli.version_matches PROPERTIES PASS_REGULAR_EXPRESSION "${PROJECT_VERSION}") -endif() +# Provide a simple smoke test to make sure that the CLI works and can display a --help message +add_test(NAME cli.has_help COMMAND intro --help) + +# Provide a test to verify that the version being reported from the application +# matches the version given to CMake. This will be important once you package +# your program. Real world shows that this is the kind of simple mistake that is easy +# to make, but also easy to test for. +add_test(NAME cli.version_matches COMMAND intro --version) +set_tests_properties(cli.version_matches PROPERTIES PASS_REGULAR_EXPRESSION "${PROJECT_VERSION}") add_executable(tests tests.cpp) target_link_libraries(