From cdf074e34cad6c3b6245d30c75a6e8497cd43af9 Mon Sep 17 00:00:00 2001 From: BlackMATov Date: Sun, 1 Jan 2023 12:15:59 +0700 Subject: [PATCH] add cmake install targets --- .gitignore | 1 + .vscode/settings.json | 12 +++ CMakeLists.txt | 125 +++++++++++++++++--------- cmake/Config.cmake.in | 6 ++ headers/meta.hpp/meta_base/base.hpp | 4 - manuals/CMakeLists.txt | 4 +- singles/headers/meta.hpp/meta_all.hpp | 4 - singles/scripts/build_singles.py | 10 +-- untests/CMakeLists.txt | 4 +- 9 files changed, 110 insertions(+), 60 deletions(-) create mode 100644 cmake/Config.cmake.in diff --git a/.gitignore b/.gitignore index 9dc5f94..94e5b13 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ build/* +install/* .clangd/* CMakeLists.txt.user diff --git a/.vscode/settings.json b/.vscode/settings.json index dbf82d7..966d80c 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -5,6 +5,18 @@ "files.trimFinalNewlines": true, "files.trimTrailingWhitespace": true }, + "[cmake]": { + "files.encoding": "utf8", + "files.insertFinalNewline": true, + "files.trimFinalNewlines": true, + "files.trimTrailingWhitespace": true + }, + "[python]": { + "files.encoding": "utf8", + "files.insertFinalNewline": true, + "files.trimFinalNewlines": true, + "files.trimTrailingWhitespace": true + }, "clangd.arguments": [ "--all-scopes-completion", "--background-index", diff --git a/CMakeLists.txt b/CMakeLists.txt index fb5b869..802deba 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,61 +1,100 @@ cmake_minimum_required(VERSION 3.21 FATAL_ERROR) -# -# VERSION -# - -file(READ headers/meta.hpp/meta_base/base.hpp META_HPP_BASE_FILE) - -string(REGEX MATCH "#define[ ]+META_HPP_VERSION_MAJOR[ ]+([0-9]+)" _ ${META_HPP_BASE_FILE}) -set(META_HPP_VERSION_MAJOR "${CMAKE_MATCH_1}") - -string(REGEX MATCH "#define[ ]+META_HPP_VERSION_MINOR[ ]+([0-9]+)" _ ${META_HPP_BASE_FILE}) -set(META_HPP_VERSION_MINOR "${CMAKE_MATCH_1}") - -string(REGEX MATCH "#define[ ]+META_HPP_VERSION_PATCH[ ]+([0-9]+)" _ ${META_HPP_BASE_FILE}) -set(META_HPP_VERSION_PATCH "${CMAKE_MATCH_1}") - -set(META_HPP_VERSION ${META_HPP_VERSION_MAJOR}.${META_HPP_VERSION_MINOR}.${META_HPP_VERSION_PATCH}) - -# -# PROJECT -# - project(meta.hpp - VERSION ${META_HPP_VERSION} + VERSION "0.0.1" DESCRIPTION "C++20 tiny dynamic reflection library" HOMEPAGE_URL "https://github.com/blackmatov/meta.hpp") +# +# LIBRARY +# + add_library(${PROJECT_NAME} INTERFACE) add_library(meta.hpp::meta.hpp ALIAS ${PROJECT_NAME}) -target_compile_features(${PROJECT_NAME} INTERFACE cxx_std_20) -target_include_directories(${PROJECT_NAME} INTERFACE headers) +target_compile_features(${PROJECT_NAME} INTERFACE + cxx_std_20) + +target_include_directories(${PROJECT_NAME} INTERFACE + $ + $) find_package(Threads REQUIRED) target_link_libraries(${PROJECT_NAME} INTERFACE Threads::Threads) +# +# INSTALL +# + +if(PROJECT_IS_TOP_LEVEL) + include(CMakePackageConfigHelpers) + include(GNUInstallDirs) + + set(META_HPP_INSTALL_CONFIG_DIR + "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}") + + set(META_HPP_INSTALL_CONFIG_INPUT + "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Config.cmake.in") + + set(META_HPP_INSTALL_GENERATED_CONFIG_CMAKE + "${CMAKE_CURRENT_BINARY_DIR}/generated/${PROJECT_NAME}-config.cmake") + + set(META_HPP_INSTALL_GENERATED_CONFIG_VERSION_CMAKE + "${CMAKE_CURRENT_BINARY_DIR}/generated/${PROJECT_NAME}-config-version.cmake") + + configure_package_config_file( + "${META_HPP_INSTALL_CONFIG_INPUT}" + "${META_HPP_INSTALL_GENERATED_CONFIG_CMAKE}" + INSTALL_DESTINATION "${META_HPP_INSTALL_CONFIG_DIR}" + NO_SET_AND_CHECK_MACRO + NO_CHECK_REQUIRED_COMPONENTS_MACRO) + + write_basic_package_version_file( + "${META_HPP_INSTALL_GENERATED_CONFIG_VERSION_CMAKE}" + VERSION ${PROJECT_VERSION} + COMPATIBILITY AnyNewerVersion + ARCH_INDEPENDENT) + + install( + TARGETS ${PROJECT_NAME} + EXPORT ${PROJECT_NAME}-targets + INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}") + + install( + DIRECTORY headers/${PROJECT_NAME} + DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}") + + install( + EXPORT ${PROJECT_NAME}-targets + FILE ${PROJECT_NAME}-targets.cmake + NAMESPACE ${PROJECT_NAME}:: + DESTINATION "${META_HPP_INSTALL_CONFIG_DIR}") + + install( + FILES "${META_HPP_INSTALL_GENERATED_CONFIG_CMAKE}" + "${META_HPP_INSTALL_GENERATED_CONFIG_VERSION_CMAKE}" + DESTINATION "${META_HPP_INSTALL_CONFIG_DIR}") +endif() + # # DEVELOPER # -if(NOT PROJECT_IS_TOP_LEVEL) - return() +if(PROJECT_IS_TOP_LEVEL) + option(BUILD_WITH_COVERAGE "Build with coverage" OFF) + option(BUILD_WITH_SANITIZERS "Build with sanitizers" OFF) + + enable_testing() + set_property(GLOBAL PROPERTY USE_FOLDERS ON) + set_property(GLOBAL PROPERTY PREDEFINED_TARGETS_FOLDER "CMake") + list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") + + include(EnableASan) + include(EnableGCov) + include(EnableUBSan) + + add_subdirectory(manuals) + add_subdirectory(singles) + add_subdirectory(vendors) + add_subdirectory(untests) endif() - -option(BUILD_WITH_COVERAGE "Build with coverage" OFF) -option(BUILD_WITH_SANITIZERS "Build with sanitizers" OFF) - -enable_testing() -set_property(GLOBAL PROPERTY USE_FOLDERS ON) -set_property(GLOBAL PROPERTY PREDEFINED_TARGETS_FOLDER "CMake") -list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") - -include(EnableASan) -include(EnableGCov) -include(EnableUBSan) - -add_subdirectory(manuals) -add_subdirectory(singles) -add_subdirectory(vendors) -add_subdirectory(untests) diff --git a/cmake/Config.cmake.in b/cmake/Config.cmake.in new file mode 100644 index 0000000..8973156 --- /dev/null +++ b/cmake/Config.cmake.in @@ -0,0 +1,6 @@ +@PACKAGE_INIT@ + +include(CMakeFindDependencyMacro) +find_dependency(Threads REQUIRED) + +include("${CMAKE_CURRENT_LIST_DIR}/meta.hpp-targets.cmake") diff --git a/headers/meta.hpp/meta_base/base.hpp b/headers/meta.hpp/meta_base/base.hpp index 47e96a5..253abb0 100644 --- a/headers/meta.hpp/meta_base/base.hpp +++ b/headers/meta.hpp/meta_base/base.hpp @@ -34,10 +34,6 @@ #include #include -#define META_HPP_VERSION_MAJOR 0 -#define META_HPP_VERSION_MINOR 0 -#define META_HPP_VERSION_PATCH 1 - #if !defined(__cpp_exceptions) # define META_HPP_NO_EXCEPTIONS #endif diff --git a/manuals/CMakeLists.txt b/manuals/CMakeLists.txt index 9a959a7..b96a455 100644 --- a/manuals/CMakeLists.txt +++ b/manuals/CMakeLists.txt @@ -29,11 +29,11 @@ setup_defines_for_target(${PROJECT_NAME}.singles) function(setup_libraries_for_target TARGET) target_link_libraries(${TARGET} PRIVATE doctest::doctest_with_main) - if(${BUILD_WITH_COVERAGE}) + if(BUILD_WITH_COVERAGE) target_link_libraries(${TARGET} PRIVATE meta.hpp::enable_gcov) endif() - if(${BUILD_WITH_SANITIZERS}) + if(BUILD_WITH_SANITIZERS) target_link_libraries(${TARGET} PRIVATE meta.hpp::enable_asan meta.hpp::enable_ubsan) endif() endfunction() diff --git a/singles/headers/meta.hpp/meta_all.hpp b/singles/headers/meta.hpp/meta_all.hpp index 0657eee..f15c388 100644 --- a/singles/headers/meta.hpp/meta_all.hpp +++ b/singles/headers/meta.hpp/meta_all.hpp @@ -31,10 +31,6 @@ #include #include -#define META_HPP_VERSION_MAJOR 0 -#define META_HPP_VERSION_MINOR 0 -#define META_HPP_VERSION_PATCH 1 - #if !defined(__cpp_exceptions) # define META_HPP_NO_EXCEPTIONS #endif diff --git a/singles/scripts/build_singles.py b/singles/scripts/build_singles.py index e37d34a..e406e66 100755 --- a/singles/scripts/build_singles.py +++ b/singles/scripts/build_singles.py @@ -34,7 +34,7 @@ def CollectSystemIncludes(headerPath, parsedHeaders = set()): return set() headerIncludes = set() - + parsedHeaders.add(headerPath) headerLines = headerContent.split('\n') @@ -56,7 +56,7 @@ def ParseHeader(headerPath, parsedHeaders = set()): if PRAGMA_ONCE_MATCHER.search(headerContent) and headerPath in parsedHeaders: return "" - + parsedHeaders.add(headerPath) headerLines = headerContent.split('\n') @@ -70,7 +70,7 @@ def ParseHeader(headerPath, parsedHeaders = set()): if PRAGMA_ONCE_MATCHER.match(headerLine): shouldSkipNextEmptyLines = True continue - + includeMatch = USER_INCLUDE_MATCHER.findall(headerLine) if includeMatch: internalHeaderPath = os.path.abspath(os.path.join(os.path.dirname(headerPath), includeMatch[0])) @@ -79,7 +79,7 @@ def ParseHeader(headerPath, parsedHeaders = set()): outputContent += internalHeaderContent shouldSkipNextEmptyLines = True continue - + includeMatch = SYSTEM_INCLUDE_MATCHER.findall(headerLine) if includeMatch: shouldSkipNextEmptyLines = True @@ -105,7 +105,7 @@ with open(outputHeaderPath, "w") as outputHeaderStream: outputHeaderStream.write("{}\n".format(licenseComment)) outputHeaderStream.write("\n") - + for systemInclude in sorted(systemIncludes): outputHeaderStream.write("#include <{}>\n".format(systemInclude)) outputHeaderStream.write("\n") diff --git a/untests/CMakeLists.txt b/untests/CMakeLists.txt index 8cec3ff..bf1dbcd 100644 --- a/untests/CMakeLists.txt +++ b/untests/CMakeLists.txt @@ -29,11 +29,11 @@ setup_defines_for_target(${PROJECT_NAME}.singles) function(setup_libraries_for_target TARGET) target_link_libraries(${TARGET} PRIVATE doctest::doctest_with_main) - if(${BUILD_WITH_COVERAGE}) + if(BUILD_WITH_COVERAGE) target_link_libraries(${TARGET} PRIVATE meta.hpp::enable_gcov) endif() - if(${BUILD_WITH_SANITIZERS}) + if(BUILD_WITH_SANITIZERS) target_link_libraries(${TARGET} PRIVATE meta.hpp::enable_asan meta.hpp::enable_ubsan) endif() endfunction()