From 3a628a5f80d6015b4b14c7e09e479789646339a0 Mon Sep 17 00:00:00 2001 From: BlackMATov Date: Thu, 5 Jan 2023 09:45:47 +0700 Subject: [PATCH] add cmake install targets --- .clang-tidy | 2 + .gitignore | 2 +- .vscode/launch.json | 11 +++ .vscode/settings.json | 29 ++++++++ CMakeLists.txt | 105 ++++++++++++++++++++++------- CMakePresets.json | 2 +- LICENSE.md | 2 +- cmake/Config.cmake.in | 3 + cmake/EnableASan.cmake | 7 +- cmake/EnableGCov.cmake | 7 +- cmake/EnableUBSan.cmake | 7 +- headers/enum.hpp/enum.hpp | 2 +- headers/enum.hpp/enum_bitflags.hpp | 2 +- untests/.clang-tidy | 11 +-- untests/CMakeLists.txt | 8 +-- untests/enum_bitflags_examples.cpp | 2 +- untests/enum_bitflags_tests.cpp | 2 +- untests/enum_examples.cpp | 2 +- untests/enum_tests.cpp | 2 +- vendors/CMakeLists.txt | 4 +- 20 files changed, 160 insertions(+), 52 deletions(-) create mode 100644 .vscode/launch.json create mode 100644 .vscode/settings.json create mode 100644 cmake/Config.cmake.in diff --git a/.clang-tidy b/.clang-tidy index 747cb57..c1bd18e 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -10,6 +10,7 @@ Checks: '-*, -cppcoreguidelines-pro-bounds-constant-array-index, modernize-*, + -modernize-macro-to-enum, -modernize-use-trailing-return-type, performance-*, @@ -17,5 +18,6 @@ Checks: '-*, portability-*, readability-*, + -readability-identifier-length, ' ... diff --git a/.gitignore b/.gitignore index c57c218..94e5b13 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ build/* +install/* .clangd/* -.vscode/* CMakeLists.txt.user diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..f432300 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,11 @@ +{ + "version": "0.2.0", + "configurations": [{ + "name": "LLDB Debug", + "type": "lldb", + "request": "launch", + "program": "${command:cmake.launchTargetPath}", + "args": [], + "cwd": "${workspaceFolder}" + }] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..966d80c --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,29 @@ +{ + "[cpp]": { + "files.encoding": "utf8", + "files.insertFinalNewline": true, + "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", + "--clang-tidy", + "--compile-commands-dir=${workspaceFolder}/.clangd", + "--completion-style=detailed", + "--header-insertion=never" + ], + "cmake.copyCompileCommands": "${workspaceFolder}/.clangd/compile_commands.json" +} diff --git a/CMakeLists.txt b/CMakeLists.txt index 7f25d7f..5f145c7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,36 +1,95 @@ -cmake_minimum_required(VERSION 3.15 FATAL_ERROR) +cmake_minimum_required(VERSION 3.21 FATAL_ERROR) -if(NOT DEFINED PROJECT_NAME) - set(BUILD_AS_STANDALONE ON) -else() - set(BUILD_AS_STANDALONE OFF) -endif() +project(enum.hpp + VERSION "0.0.1" + DESCRIPTION "C++17 compile-time enum reflection library" + HOMEPAGE_URL "https://github.com/blackmatov/enum.hpp") -project(enum.hpp) +# +# LIBRARY +# add_library(${PROJECT_NAME} INTERFACE) -target_compile_features(${PROJECT_NAME} INTERFACE cxx_std_17) -target_include_directories(${PROJECT_NAME} INTERFACE headers) +add_library(enum.hpp::enum.hpp ALIAS ${PROJECT_NAME}) + +target_compile_features(${PROJECT_NAME} INTERFACE + cxx_std_17) + +target_include_directories(${PROJECT_NAME} INTERFACE + $ + $) # -# BUILD_AS_STANDALONE +# INSTALL # -if(NOT ${BUILD_AS_STANDALONE}) - return() +if(PROJECT_IS_TOP_LEVEL) + include(CMakePackageConfigHelpers) + include(GNUInstallDirs) + + set(ENUM_HPP_INSTALL_CONFIG_DIR + "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}") + + set(ENUM_HPP_INSTALL_CONFIG_INPUT + "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Config.cmake.in") + + set(ENUM_HPP_INSTALL_GENERATED_CONFIG_CMAKE + "${CMAKE_CURRENT_BINARY_DIR}/generated/${PROJECT_NAME}-config.cmake") + + set(ENUM_HPP_INSTALL_GENERATED_CONFIG_VERSION_CMAKE + "${CMAKE_CURRENT_BINARY_DIR}/generated/${PROJECT_NAME}-config-version.cmake") + + configure_package_config_file( + "${ENUM_HPP_INSTALL_CONFIG_INPUT}" + "${ENUM_HPP_INSTALL_GENERATED_CONFIG_CMAKE}" + INSTALL_DESTINATION "${ENUM_HPP_INSTALL_CONFIG_DIR}" + NO_SET_AND_CHECK_MACRO + NO_CHECK_REQUIRED_COMPONENTS_MACRO) + + write_basic_package_version_file( + "${ENUM_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 "${ENUM_HPP_INSTALL_CONFIG_DIR}") + + install( + FILES "${ENUM_HPP_INSTALL_GENERATED_CONFIG_CMAKE}" + "${ENUM_HPP_INSTALL_GENERATED_CONFIG_VERSION_CMAKE}" + DESTINATION "${ENUM_HPP_INSTALL_CONFIG_DIR}") endif() -option(BUILD_WITH_COVERAGE "Build with coverage" OFF) -option(BUILD_WITH_SANITIZERS "Build with sanitizers" OFF) +# +# DEVELOPER +# -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") +if(PROJECT_IS_TOP_LEVEL) + option(BUILD_WITH_COVERAGE "Build with coverage" OFF) + option(BUILD_WITH_SANITIZERS "Build with sanitizers" OFF) -include(EnableASan) -include(EnableGCov) -include(EnableUBSan) + 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") -add_subdirectory(vendors) -add_subdirectory(untests) + include(EnableASan) + include(EnableGCov) + include(EnableUBSan) + + add_subdirectory(vendors) + add_subdirectory(untests) +endif() diff --git a/CMakePresets.json b/CMakePresets.json index 8f0ec5d..0602c52 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -3,7 +3,7 @@ "cmakeMinimumRequired": { "major": 3, - "minor": 20, + "minor": 21, "patch": 0 }, diff --git a/LICENSE.md b/LICENSE.md index 33252ab..80d0414 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,6 +1,6 @@ MIT License -Copyright (C) 2019-2022, by Matvey Cherevko (blackmatov@gmail.com) +Copyright (C) 2019-2023, by Matvey Cherevko (blackmatov@gmail.com) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/cmake/Config.cmake.in b/cmake/Config.cmake.in new file mode 100644 index 0000000..ac863a3 --- /dev/null +++ b/cmake/Config.cmake.in @@ -0,0 +1,3 @@ +@PACKAGE_INIT@ + +include("${CMAKE_CURRENT_LIST_DIR}/enum.hpp-targets.cmake") diff --git a/cmake/EnableASan.cmake b/cmake/EnableASan.cmake index 83a9be5..1af49c9 100644 --- a/cmake/EnableASan.cmake +++ b/cmake/EnableASan.cmake @@ -1,14 +1,15 @@ # https://clang.llvm.org/docs/AddressSanitizer.html -add_library(enable_asan INTERFACE) +add_library(${PROJECT_NAME}.enable_asan INTERFACE) +add_library(${PROJECT_NAME}::enable_asan ALIAS ${PROJECT_NAME}.enable_asan) -target_compile_options(enable_asan INTERFACE +target_compile_options(${PROJECT_NAME}.enable_asan INTERFACE -fsanitize=address -fno-omit-frame-pointer -fsanitize-address-use-after-scope -fsanitize-address-use-after-return=always) -target_link_options(enable_asan INTERFACE +target_link_options(${PROJECT_NAME}.enable_asan INTERFACE -fsanitize=address -fno-omit-frame-pointer -fsanitize-address-use-after-scope diff --git a/cmake/EnableGCov.cmake b/cmake/EnableGCov.cmake index f390dd4..e98ea88 100644 --- a/cmake/EnableGCov.cmake +++ b/cmake/EnableGCov.cmake @@ -1,9 +1,10 @@ # https://clang.llvm.org/docs/SourceBasedCodeCoverage.html -add_library(enable_gcov INTERFACE) +add_library(${PROJECT_NAME}.enable_gcov INTERFACE) +add_library(${PROJECT_NAME}::enable_gcov ALIAS ${PROJECT_NAME}.enable_gcov) -target_compile_options(enable_gcov INTERFACE +target_compile_options(${PROJECT_NAME}.enable_gcov INTERFACE --coverage) -target_link_options(enable_gcov INTERFACE +target_link_options(${PROJECT_NAME}.enable_gcov INTERFACE --coverage) diff --git a/cmake/EnableUBSan.cmake b/cmake/EnableUBSan.cmake index ee954ff..358b14d 100644 --- a/cmake/EnableUBSan.cmake +++ b/cmake/EnableUBSan.cmake @@ -1,11 +1,12 @@ # https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html -add_library(enable_ubsan INTERFACE) +add_library(${PROJECT_NAME}.enable_ubsan INTERFACE) +add_library(${PROJECT_NAME}::enable_ubsan ALIAS ${PROJECT_NAME}.enable_ubsan) -target_compile_options(enable_ubsan INTERFACE +target_compile_options(${PROJECT_NAME}.enable_ubsan INTERFACE -fsanitize=undefined -fno-omit-frame-pointer) -target_link_options(enable_ubsan INTERFACE +target_link_options(${PROJECT_NAME}.enable_ubsan INTERFACE -fsanitize=undefined -fno-omit-frame-pointer) diff --git a/headers/enum.hpp/enum.hpp b/headers/enum.hpp/enum.hpp index 6cbe035..cb1e7ab 100644 --- a/headers/enum.hpp/enum.hpp +++ b/headers/enum.hpp/enum.hpp @@ -1,7 +1,7 @@ /******************************************************************************* * This file is part of the "https://github.com/blackmatov/enum.hpp" * For conditions of distribution and use, see copyright notice in LICENSE.md - * Copyright (C) 2019-2022, by Matvey Cherevko (blackmatov@gmail.com) + * Copyright (C) 2019-2023, by Matvey Cherevko (blackmatov@gmail.com) ******************************************************************************/ #pragma once diff --git a/headers/enum.hpp/enum_bitflags.hpp b/headers/enum.hpp/enum_bitflags.hpp index 32cc0c7..d3558ed 100644 --- a/headers/enum.hpp/enum_bitflags.hpp +++ b/headers/enum.hpp/enum_bitflags.hpp @@ -1,7 +1,7 @@ /******************************************************************************* * This file is part of the "https://github.com/blackmatov/enum.hpp" * For conditions of distribution and use, see copyright notice in LICENSE.md - * Copyright (C) 2019-2022, by Matvey Cherevko (blackmatov@gmail.com) + * Copyright (C) 2019-2023, by Matvey Cherevko (blackmatov@gmail.com) ******************************************************************************/ #pragma once diff --git a/untests/.clang-tidy b/untests/.clang-tidy index d487769..34f930f 100644 --- a/untests/.clang-tidy +++ b/untests/.clang-tidy @@ -1,16 +1,17 @@ --- Checks: '-*, + bugprone-*, + -bugprone-easily-swappable-parameters, + clang-analyzer-*, concurrency-*, - cppcoreguidelines-*, - -cppcoreguidelines-avoid-magic-numbers, - -cppcoreguidelines-macro-usage, - -cppcoreguidelines-pro-bounds-constant-array-index, - modernize-*, + -modernize-avoid-c-arrays, + -modernize-use-auto, + -modernize-use-nodiscard, -modernize-use-trailing-return-type, portability-*, diff --git a/untests/CMakeLists.txt b/untests/CMakeLists.txt index b951cea..6ad0fcb 100644 --- a/untests/CMakeLists.txt +++ b/untests/CMakeLists.txt @@ -4,7 +4,7 @@ file(GLOB_RECURSE UNTESTS_SOURCES "*.cpp" "*.hpp") source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${UNTESTS_SOURCES}) add_executable(${PROJECT_NAME} ${UNTESTS_SOURCES}) -target_link_libraries(${PROJECT_NAME} PRIVATE enum.hpp) +target_link_libraries(${PROJECT_NAME} PRIVATE enum.hpp::enum.hpp) # # setup defines @@ -23,14 +23,14 @@ setup_defines_for_target(${PROJECT_NAME}) # function(setup_libraries_for_target TARGET) - target_link_libraries(${TARGET} PRIVATE doctest_with_main) + target_link_libraries(${TARGET} PRIVATE doctest::doctest_with_main) if(${BUILD_WITH_COVERAGE}) - target_link_libraries(${TARGET} PRIVATE enable_gcov) + target_link_libraries(${TARGET} PRIVATE enum.hpp::enable_gcov) endif() if(${BUILD_WITH_SANITIZERS}) - target_link_libraries(${TARGET} PRIVATE enable_asan enable_ubsan) + target_link_libraries(${TARGET} PRIVATE enum.hpp::enable_asan enum.hpp::enable_ubsan) endif() endfunction() diff --git a/untests/enum_bitflags_examples.cpp b/untests/enum_bitflags_examples.cpp index 8f05466..63a9119 100644 --- a/untests/enum_bitflags_examples.cpp +++ b/untests/enum_bitflags_examples.cpp @@ -1,7 +1,7 @@ /******************************************************************************* * This file is part of the "https://github.com/blackmatov/enum.hpp" * For conditions of distribution and use, see copyright notice in LICENSE.md - * Copyright (C) 2019-2022, by Matvey Cherevko (blackmatov@gmail.com) + * Copyright (C) 2019-2023, by Matvey Cherevko (blackmatov@gmail.com) ******************************************************************************/ #include diff --git a/untests/enum_bitflags_tests.cpp b/untests/enum_bitflags_tests.cpp index c59e235..54c5d50 100644 --- a/untests/enum_bitflags_tests.cpp +++ b/untests/enum_bitflags_tests.cpp @@ -1,7 +1,7 @@ /******************************************************************************* * This file is part of the "https://github.com/blackmatov/enum.hpp" * For conditions of distribution and use, see copyright notice in LICENSE.md - * Copyright (C) 2019-2022, by Matvey Cherevko (blackmatov@gmail.com) + * Copyright (C) 2019-2023, by Matvey Cherevko (blackmatov@gmail.com) ******************************************************************************/ #include diff --git a/untests/enum_examples.cpp b/untests/enum_examples.cpp index d86f57d..fb3e032 100644 --- a/untests/enum_examples.cpp +++ b/untests/enum_examples.cpp @@ -1,7 +1,7 @@ /******************************************************************************* * This file is part of the "https://github.com/blackmatov/enum.hpp" * For conditions of distribution and use, see copyright notice in LICENSE.md - * Copyright (C) 2019-2022, by Matvey Cherevko (blackmatov@gmail.com) + * Copyright (C) 2019-2023, by Matvey Cherevko (blackmatov@gmail.com) ******************************************************************************/ #include diff --git a/untests/enum_tests.cpp b/untests/enum_tests.cpp index 026f6c1..26ca144 100644 --- a/untests/enum_tests.cpp +++ b/untests/enum_tests.cpp @@ -1,7 +1,7 @@ /******************************************************************************* * This file is part of the "https://github.com/blackmatov/enum.hpp" * For conditions of distribution and use, see copyright notice in LICENSE.md - * Copyright (C) 2019-2022, by Matvey Cherevko (blackmatov@gmail.com) + * Copyright (C) 2019-2023, by Matvey Cherevko (blackmatov@gmail.com) ******************************************************************************/ #include diff --git a/vendors/CMakeLists.txt b/vendors/CMakeLists.txt index 0e61790..e971b33 100644 --- a/vendors/CMakeLists.txt +++ b/vendors/CMakeLists.txt @@ -1,5 +1,5 @@ -project(vmath.hpp.vendors) +project(enum.hpp.vendors) set(DOCTEST_NO_INSTALL ON CACHE INTERNAL "") add_subdirectory(doctest) -set_target_properties(doctest_with_main PROPERTIES FOLDER vmath.hpp.vendors) +set_target_properties(doctest_with_main PROPERTIES FOLDER enum.hpp.vendors)