diff --git a/.clang-format b/.clang-format index ffd5aa94..1a086d8e 100644 --- a/.clang-format +++ b/.clang-format @@ -1,3 +1,10 @@ +--- +BasedOnStyle: LLVM +Language: Json +IndentWidth: 4 +UseTab: Never +--- +Language: Cpp AccessModifierOffset: -2 AlignAfterOpenBracket: DontAlign AlignConsecutiveAssignments: false @@ -69,7 +76,6 @@ IndentWrappedFunctionNames: true JavaScriptQuotes: Leave JavaScriptWrapImports: true KeepEmptyLinesAtTheStartOfBlocks: true -Language: Cpp MacroBlockBegin: '' MacroBlockEnd: '' MaxEmptyLinesToKeep: 2 diff --git a/CMakeLists.txt b/CMakeLists.txt index a5ac5435..34c2945c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.21) +cmake_minimum_required(VERSION 3.21...4.1) # This template attempts to be "fetch_content"-able # so that it works well with tools like CPM or other @@ -38,7 +38,7 @@ myproject_local_options() set(CMAKE_CXX_VISIBILITY_PRESET hidden) set(GIT_SHA - "Unknown" + "0508115-dirty" CACHE STRING "SHA this build was generated from") string( SUBSTRING "${GIT_SHA}" @@ -92,7 +92,15 @@ if(MSVC) endif() # set the startup project for the "play" button in MSVC -set_property(DIRECTORY PROPERTY VS_STARTUP_PROJECT intro) +if(TARGET intro) + set_property(DIRECTORY PROPERTY VS_STARTUP_PROJECT intro) + set(VS_STARTUP_PROJECT intro) +endif() + +if(ENABLE_DOXYGEN) + include(cmake/Doxygen.cmake) + myproject_enable_doxygen("") +endif() if(CMAKE_SKIP_INSTALL_RULES) return() @@ -104,7 +112,7 @@ include(cmake/PackageProject.cmake) # we know we want to ship myproject_package_project( TARGETS - intro + ${VS_STARTUP_PROJECT} myproject_options myproject_warnings # FIXME: this does not work! CK diff --git a/CMakePresets.json b/CMakePresets.json index 5871489e..7a8f18fc 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": [ @@ -12,11 +12,24 @@ "hidden": true, "generator": "Ninja", "binaryDir": "${sourceDir}/out/build/${presetName}", - "installDir": "${sourceDir}/out/install/${presetName}" + "installDir": "${sourceDir}/out/install/${presetName}", + "cacheVariables": { + "CMAKE_PREFIX_PATH": { + "type": "path", + "value": "${sourceDir}/out/install/${presetName}" + }, + "CMAKE_CXX_EXTENSIONS": false, + "CMAKE_CXX_STANDARD": "23", + "CMAKE_CXX_STANDARD_REQUIRED": true, + "CMAKE_EXPORT_COMPILE_COMMANDS": true, + "CMAKE_MESSAGE_LOG_LEVEL": "TRACE", + "CMAKE_SKIP_TEST_ALL_DEPENDENCY": false + } }, { "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": { @@ -50,6 +63,9 @@ "Darwin" ] }, + "cacheVariables": { + "CMAKE_UNITY_BUILD": true + }, "vendor": { "microsoft.com/VisualStudioRemoteSettings/CMake/1.0": { "sourceDir": "$env{HOME}/.vs/$ms{projectDirName}" @@ -59,7 +75,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", @@ -71,7 +88,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", @@ -83,7 +101,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", @@ -95,7 +114,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", @@ -107,7 +127,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", @@ -123,7 +144,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", @@ -137,20 +159,24 @@ } }, { - "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, + "CMAKE_SKIP_INSTALL_RULES": true, "CMAKE_C_COMPILER": "gcc", "CMAKE_CXX_COMPILER": "g++", "CMAKE_BUILD_TYPE": "Debug" } }, { - "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", @@ -159,20 +185,24 @@ } }, { - "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, + "CMAKE_SKIP_INSTALL_RULES": true, "CMAKE_C_COMPILER": "clang", "CMAKE_CXX_COMPILER": "clang++", "CMAKE_BUILD_TYPE": "Debug" } }, { - "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", @@ -181,10 +211,69 @@ } } ], + "buildPresets": [ + { + "name": "build-common", + "description": "Build CMake settings that apply to all configurations", + "hidden": true, + "jobs": 4 + }, + { + "name": "build-windows-msvc-debug-developer-mode", + "inherits": "build-common", + "configurePreset": "windows-msvc-debug-developer-mode" + }, + { + "name": "build-windows-msvc-release-developer-mode", + "inherits": "build-common", + "configurePreset": "windows-msvc-release-developer-mode" + }, + { + "name": "build-windows-clang-debug", + "inherits": "build-common", + "configurePreset": "windows-clang-debug" + }, + { + "name": "build-windows-clang-release", + "inherits": "build-common", + "configurePreset": "windows-clang-release" + }, + { + "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" + } + ], "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 @@ -223,32 +312,86 @@ "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" + } + ], + "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" + } + ] } ] -} \ No newline at end of file +} diff --git a/CMakeUserPresets.json b/CMakeUserPresets.json new file mode 100644 index 00000000..3d04a857 --- /dev/null +++ b/CMakeUserPresets.json @@ -0,0 +1,178 @@ +{ + "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}" + }, + "environment": { + "CPM_USE_LOCAL_PACKAGES": "1" + } + }, + { + "name": "common-config", + "description": "Settings for all toolchains", + "hidden": true, + "inherits": ["conf-unixlike-common", "default-config"], + "binaryDir": "${sourceDir}/out/build/${presetName}", + "installDir": "${sourceDir}/out/install/${presetName}", + "cacheVariables": { + "myproject_BUILD_FTXUI": false, + "ENABLE_DOXYGEN": false, + "ENABLE_CPPCHECK": false, + "ENABLE_CLANG_TIDY": false + }, + "environment": { + "CPM_USE_LOCAL_PACKAGES": "0" + }, + "vendor": { + "microsoft.com/VisualStudioRemoteSettings/CMake/1.0": { + "sourceDir": "$env{HOME}/.vs/$ms{projectDirName}" + } + } + }, + { + "name": "debug", + "displayName": "Debug", + "description": "Debug build type", + "inherits": "common-config", + "cacheVariables": { + "CMAKE_SKIP_INSTALL_RULES": true, + "CMAKE_BUILD_TYPE": "Debug", + "myproject_ENABLE_COVERAGE": true + } + }, + { + "name": "release", + "displayName": "Release", + "description": "Release build type", + "inherits": "common-config", + "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 e5008c4a..d2a36221 100644 --- a/Dependencies.cmake +++ b/Dependencies.cmake @@ -9,7 +9,7 @@ function(myproject_setup_dependencies) # already been provided to us by a parent project if(NOT TARGET fmtlib::fmtlib) - cpmaddpackage("gh:fmtlib/fmt#11.1.4") + cpmaddpackage("gh:fmtlib/fmt#11.2.0") endif() if(NOT TARGET spdlog::spdlog) @@ -17,7 +17,7 @@ function(myproject_setup_dependencies) NAME spdlog VERSION - 1.15.2 + 1.15.3 GITHUB_REPOSITORY "gabime/spdlog" OPTIONS @@ -28,12 +28,14 @@ function(myproject_setup_dependencies) cpmaddpackage("gh:catchorg/Catch2@3.8.1") endif() - if(NOT TARGET CLI11::CLI11) - cpmaddpackage("gh:CLIUtils/CLI11@2.5.0") - endif() + if(myproject_BUILD_FTXUI) + if(NOT TARGET CLI11::CLI11) + cpmaddpackage("gh:CLIUtils/CLI11@2.5.0") + endif() - if(NOT TARGET ftxui::screen) - cpmaddpackage("gh:ArthurSonzogni/FTXUI@6.0.2") + if(NOT TARGET ftxui::screen) + cpmaddpackage("gh:ArthurSonzogni/FTXUI@6.1.9") + endif() endif() if(NOT TARGET tools::tools) diff --git a/ProjectOptions.cmake b/ProjectOptions.cmake index 3d260944..fa57c522 100644 --- a/ProjectOptions.cmake +++ b/ProjectOptions.cmake @@ -89,9 +89,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() @@ -122,6 +122,7 @@ macro(myproject_setup_options) endif() option(myproject_BUILD_FUZZ_TESTS "Enable fuzz testing executable" ${DEFAULT_FUZZER}) + option(myproject_BUILD_FTXUI "Build FTXUI sample too" ON) endmacro() @@ -135,7 +136,7 @@ macro(myproject_global_options) if(myproject_ENABLE_HARDENING AND myproject_ENABLE_GLOBAL_HARDENING) include(cmake/Hardening.cmake) - if(NOT SUPPORTS_UBSAN + if(NOT SUPPORTS_UBSAN OR myproject_ENABLE_SANITIZER_UNDEFINED OR myproject_ENABLE_SANITIZER_ADDRESS OR myproject_ENABLE_SANITIZER_THREAD @@ -221,7 +222,7 @@ macro(myproject_local_options) if(myproject_ENABLE_HARDENING AND NOT myproject_ENABLE_GLOBAL_HARDENING) include(cmake/Hardening.cmake) - if(NOT SUPPORTS_UBSAN + if(NOT SUPPORTS_UBSAN OR myproject_ENABLE_SANITIZER_UNDEFINED OR myproject_ENABLE_SANITIZER_ADDRESS OR myproject_ENABLE_SANITIZER_THREAD diff --git a/cmake/CPM.cmake b/cmake/CPM.cmake index 9c27c51c..84748734 100644 --- a/cmake/CPM.cmake +++ b/cmake/CPM.cmake @@ -2,8 +2,8 @@ # # SPDX-FileCopyrightText: Copyright (c) 2019-2023 Lars Melchior and contributors -set(CPM_DOWNLOAD_VERSION 0.40.8) -set(CPM_HASH_SUM "78ba32abdf798bc616bab7c73aac32a17bbd7b06ad9e26a6add69de8f3ae4791") +set(CPM_DOWNLOAD_VERSION 0.42.0) +set(CPM_HASH_SUM "2020b4fc42dba44817983e06342e682ecfc3d2f484a581f11cc5731fbe4dce8a") if(CPM_SOURCE_CACHE) set(CPM_DOWNLOAD_LOCATION "${CPM_SOURCE_CACHE}/cpm/CPM_${CPM_DOWNLOAD_VERSION}.cmake") 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 0f92a9d6..b1a4cadc 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,2 +1,5 @@ add_subdirectory(sample_library) -add_subdirectory(ftxui_sample) + +if(myproject_BUILD_FTXUI) + add_subdirectory(ftxui_sample) +endif() diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 50f8e633..34c9ffa4 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...4.1) project(CmakeConfigPackageTests LANGUAGES CXX) @@ -17,17 +17,23 @@ endif() # ---- Dependencies ---- -include(${Catch2_SOURCE_DIR}/extras/Catch.cmake) +if(Catch2_DIR) + include(${Catch2_DIR}/Catch.cmake) +else() + include(${Catch2_SOURCE_DIR}/extras/Catch.cmake) +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}") +if(TARGET intro) + 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() add_executable(tests tests.cpp) target_link_libraries(