From cf574c407fcdbf4c999282d862024a47b7376b47 Mon Sep 17 00:00:00 2001 From: Arniiiii Date: Thu, 15 Aug 2024 05:58:45 +0000 Subject: [PATCH] add gh workflow for checking of working installed version microfix add gh workflow part for pkgconfig uncomment that should not be commented move some add_subdirectory to logically correct place --- .cmake-format | 58 +++++++ .../ubuntu_test_installed_version.yml | 59 +++++++ .gitignore | 4 +- CMakeLists.txt | 152 +++++++++++------- test/CMakeLists.txt | 124 ++++++++------ 5 files changed, 287 insertions(+), 110 deletions(-) create mode 100644 .cmake-format create mode 100644 .github/workflows/ubuntu_test_installed_version.yml diff --git a/.cmake-format b/.cmake-format new file mode 100644 index 0000000..c9b4e3e --- /dev/null +++ b/.cmake-format @@ -0,0 +1,58 @@ +format: + tab_size: 2 + line_width: 100 + dangle_parens: true + +parse: + additional_commands: + cpmaddpackage: + pargs: + nargs: '*' + flags: [] + spelling: CPMAddPackage + kwargs: &cpmaddpackagekwargs + NAME: 1 + FORCE: 1 + VERSION: 1 + GIT_TAG: 1 + DOWNLOAD_ONLY: 1 + GITHUB_REPOSITORY: 1 + GITLAB_REPOSITORY: 1 + GIT_REPOSITORY: 1 + SVN_REPOSITORY: 1 + SVN_REVISION: 1 + SOURCE_DIR: 1 + DOWNLOAD_COMMAND: 1 + FIND_PACKAGE_ARGUMENTS: 1 + NO_CACHE: 1 + GIT_SHALLOW: 1 + URL: 1 + URL_HASH: 1 + URL_MD5: 1 + DOWNLOAD_NAME: 1 + DOWNLOAD_NO_EXTRACT: 1 + HTTP_USERNAME: 1 + HTTP_PASSWORD: 1 + OPTIONS: + + cpmfindpackage: + pargs: + nargs: '*' + flags: [] + spelling: CPMFindPackage + kwargs: *cpmaddpackagekwargs + packageproject: + pargs: + nargs: '*' + flags: [] + spelling: packageProject + kwargs: + NAME: 1 + VERSION: 1 + NAMESPACE: 1 + INCLUDE_DIR: 1 + INCLUDE_DESTINATION: 1 + BINARY_DIR: 1 + COMPATIBILITY: 1 + VERSION_HEADER: 1 + DEPENDENCIES: + + diff --git a/.github/workflows/ubuntu_test_installed_version.yml b/.github/workflows/ubuntu_test_installed_version.yml new file mode 100644 index 0000000..1bfd46e --- /dev/null +++ b/.github/workflows/ubuntu_test_installed_version.yml @@ -0,0 +1,59 @@ +name: ubuntu_test_installed_version.yml + + +on: + push: + branches: + - master + - main + pull_request: + branches: + - master + - main + +env: + CTEST_OUTPUT_ON_FAILURE: 1 + CPM_SOURCE_CACHE: ${{ github.workspace }}/cpm_modules + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + + - uses: actions/cache@v3 + with: + path: "**/cpm_modules" + key: ${{ github.workflow }}-cpm-modules-${{ hashFiles('**/CMakeLists.txt', '**/*.cmake') }} + + - name: install library + run: | + cmake -S. -Bbuild -DCMAKE_BUILD_TYPE=Release --log-level=DEBUG -DCMAKE_INSTALL_PREFIX=./install_dir + cmake --install ./build --prefix ./install_dir + rm -rf build + + - name: configure with installed version via cmake + run: CMAKE_PREFIX_PATH="./install_dir" cmake -S. -Bbuild2 -DMAGIC_ENUM_OPT_TEST_INSTALLED_VERSION=1 --log-level=DEBUG + + - name: build with installed version via cmake + run: cmake --build build2 --config Debug -j4 --verbose + + - name: test + run: | + cd build2 + ctest --build-config Debug -j4 + + - name: clear + run: rm -rf build2 + + - name: configure with installed version via pkgconfig + run: CMAKE_PREFIX_PATH="./install_dir" cmake -S. -Bbuild3 -DMAGIC_ENUM_OPT_TEST_INSTALLED_VERSION_PKGCONFIG=1 -DPKG_CONFIG_USE_CMAKE_PREFIX_PATH=1 --log-level=DEBUG + + - name: build with installed version via pkgconfig + run: cmake --build build3 --config Debug -j4 --verbose + + - name: test + run: | + cd build3 + ctest --build-config Debug -j4 diff --git a/.gitignore b/.gitignore index 9a7b48c..3e67509 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,6 @@ -build/ +build*/ +cmake_build*/ +install_dir/ .vscode/ .vs/ diff --git a/CMakeLists.txt b/CMakeLists.txt index 57484a6..2497583 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,10 +1,12 @@ cmake_minimum_required(VERSION 3.14) -project(magic_enum - VERSION "0.9.6" - HOMEPAGE_URL "https://github.com/Neargye/magic_enum" - DESCRIPTION "A library that provides static reflection for enums, work with any enum type without any macro or boilerplate code." - LANGUAGES CXX +project( + magic_enum + VERSION "0.9.6" + HOMEPAGE_URL "https://github.com/Neargye/magic_enum" + DESCRIPTION + "A library that provides static reflection for enums, work with any enum type without any macro or boilerplate code." + LANGUAGES CXX ) set(CPACK_PACKAGE_VENDOR "Daniil Goncharov") @@ -14,57 +16,73 @@ set(ADDITIONAL_MODULES_DIR "${CMAKE_CURRENT_LIST_DIR}/cmake") list(APPEND CMAKE_MODULE_PATH "${ADDITIONAL_MODULES_DIR}") if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME) - set(IS_TOPLEVEL_PROJECT TRUE) + set(IS_TOPLEVEL_PROJECT TRUE) else() - set(IS_TOPLEVEL_PROJECT FALSE) + set(IS_TOPLEVEL_PROJECT FALSE) endif() option(MAGIC_ENUM_OPT_BUILD_EXAMPLES "Build magic_enum examples" ${IS_TOPLEVEL_PROJECT}) option(MAGIC_ENUM_OPT_BUILD_TESTS "Build and perform magic_enum tests" ${IS_TOPLEVEL_PROJECT}) option(MAGIC_ENUM_OPT_INSTALL "Generate and install magic_enum target" ${IS_TOPLEVEL_PROJECT}) -option(MAGIC_ENUM_OPT_INSTALL_PACKAGE_XML "Include package.xml when installing" ${MAGIC_ENUM_OPT_INSTALL}) +option(MAGIC_ENUM_OPT_INSTALL_PACKAGE_XML "Include package.xml when installing" + ${MAGIC_ENUM_OPT_INSTALL} +) +option(MAGIC_ENUM_OPT_TEST_INSTALLED_VERSION "When configuring tests, try use +a local magic_enum." NO +) +option(MAGIC_ENUM_OPT_TEST_INSTALLED_VERSION_PKGCONFIG "When configuring tests, try use +a local magic_enum via pkgconfig" NO +) -if(MAGIC_ENUM_OPT_BUILD_EXAMPLES) +if(${MAGIC_ENUM_OPT_TEST_INSTALLED_VERSION} OR ${MAGIC_ENUM_OPT_TEST_INSTALLED_VERSION_PKGCONFIG}) + add_subdirectory(test) +else() + + + set(INCLUDES "${CMAKE_CURRENT_SOURCE_DIR}/include/magic_enum") + set(EXPORT_NAMESPACE "${PROJECT_NAME}::") + + add_library(${PROJECT_NAME} INTERFACE) + add_library(${EXPORT_NAMESPACE}${PROJECT_NAME} ALIAS ${PROJECT_NAME}) + target_include_directories( + ${PROJECT_NAME} INTERFACE $ + $ + ) + + if(MAGIC_ENUM_OPT_BUILD_EXAMPLES) add_subdirectory(example) -endif() + endif() -if(MAGIC_ENUM_OPT_BUILD_TESTS) + if(MAGIC_ENUM_OPT_BUILD_TESTS) enable_testing() add_subdirectory(test) -endif() + endif() -set(INCLUDES "${CMAKE_CURRENT_SOURCE_DIR}/include/magic_enum") -set(EXPORT_NAMESPACE "${PROJECT_NAME}::") - -add_library(${PROJECT_NAME} INTERFACE) -add_library(${EXPORT_NAMESPACE}${PROJECT_NAME} ALIAS ${PROJECT_NAME}) -target_include_directories(${PROJECT_NAME} - INTERFACE - $ - $) - -if(MAGIC_ENUM_OPT_INSTALL) + if(MAGIC_ENUM_OPT_INSTALL) list(APPEND CMAKE_MODULE_PATH "${ADDITIONAL_MODULES_DIR}/GenPkgConfig") include(GenPkgConfig) include(CPackComponent) include(CMakePackageConfigHelpers) - install(TARGETS "${PROJECT_NAME}" - EXPORT ${PROJECT_NAME} - INCLUDES - DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" - # COMPONENT "${SDK_COMPONENT_NAME}" # component is not allowed for includes! Headers are installed separately! Includes only marks the headers for export + install( + TARGETS "${PROJECT_NAME}" + EXPORT ${PROJECT_NAME} + INCLUDES + DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" + # COMPONENT "${SDK_COMPONENT_NAME}" # component is not allowed for + # includes! + # Headers are installed separately! Includes only marks the headers for + # export ) file(GLOB_RECURSE HEADERS "${INCLUDES}/*.h" "${INCLUDES}/*.hxx" "${INCLUDES}/*.hpp") - string(REPLACE "/${CMAKE_LIBRARY_ARCHITECTURE}" "" CMAKE_INSTALL_LIBDIR_ARCHIND "${CMAKE_INSTALL_LIBDIR}") foreach(headerFile ${HEADERS}) - get_filename_component(headerFileParentDir "${headerFile}" DIRECTORY) - file(RELATIVE_PATH headerFileRelParentDir "${INCLUDES}" "${headerFileParentDir}") + get_filename_component(headerFileParentDir "${headerFile}" DIRECTORY) + file(RELATIVE_PATH headerFileRelParentDir "${INCLUDES}" "${headerFileParentDir}") - install(FILES "${headerFile}" - DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/${headerFileRelParentDir}" - ) + install(FILES "${headerFile}" + DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/${headerFileRelParentDir}" + ) endforeach() set(CPACK_PACKAGE_NAME "${PROJECT_NAME}") @@ -88,44 +106,58 @@ if(MAGIC_ENUM_OPT_INSTALL) set(CMAKE_CONFIG_FILE_BASENAME "${PROJECT_NAME}Config.cmake") set(CMAKE_EXPORT_FILE_BASENAME "${PROJECT_NAME}Export.cmake") set(CMAKE_CONFIG_VERSION_FILE_BASENAME "${PROJECT_NAME}ConfigVersion.cmake") - set(CMAKE_CONFIG_VERSION_FILE_NAME "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CONFIG_VERSION_FILE_BASENAME}") - - export(TARGETS "${PROJECT_NAME}" - NAMESPACE "${EXPORT_NAMESPACE}" - FILE "${CMAKE_EXPORT_FILE_BASENAME}" - EXPORT_LINK_INTERFACE_LIBRARIES + set(CMAKE_CONFIG_VERSION_FILE_NAME + "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CONFIG_VERSION_FILE_BASENAME}" ) - install(EXPORT "${PROJECT_NAME}" - FILE "${CMAKE_CONFIG_FILE_BASENAME}" - NAMESPACE "${EXPORT_NAMESPACE}" - DESTINATION "${CMAKE_INSTALL_LIBDIR_ARCHIND}/cmake/${PROJECT_NAME}" + export( + TARGETS "${PROJECT_NAME}" + NAMESPACE "${EXPORT_NAMESPACE}" + FILE "${CMAKE_EXPORT_FILE_BASENAME}" + EXPORT_LINK_INTERFACE_LIBRARIES + ) + + install( + EXPORT "${PROJECT_NAME}" + FILE "${CMAKE_CONFIG_FILE_BASENAME}" + NAMESPACE "${EXPORT_NAMESPACE}" + DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/cmake/${PROJECT_NAME}" ) write_basic_package_version_file( - "${CMAKE_CONFIG_VERSION_FILE_NAME}" - #VERSION "100500.100500.100500" # any version of same bitness suits. CMake cannot compare to infinity, so use a large number we expect to be greater than any future version - VERSION ${_VERSION} - COMPATIBILITY AnyNewerVersion - ARCH_INDEPENDENT + "${CMAKE_CONFIG_VERSION_FILE_NAME}" + # VERSION "100500.100500.100500" # any version of same bitness suits. CMake cannot compare to + # infinity, so use a large number we expect to be greater than any future version + VERSION ${_VERSION} + COMPATIBILITY AnyNewerVersion ARCH_INDEPENDENT ) install(FILES "${CMAKE_CONFIG_VERSION_FILE_NAME}" - DESTINATION "${CMAKE_INSTALL_LIBDIR_ARCHIND}/cmake/${PROJECT_NAME}" + DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/cmake/${PROJECT_NAME}" ) - configure_pkg_config_file("${PROJECT_NAME}" - NAME "${PROJECT_NAME}" - VERSION "${PROJECT_VERSION}" - DESCRIPTION "${CPACK_PACKAGE_DESCRIPTION}" - URL "${CPACK_PACKAGE_HOMEPAGE_URL}" - INSTALL_LIB_DIR "${CMAKE_INSTALL_LIBDIR_ARCHIND}" - INSTALL_INCLUDE_DIR "${CMAKE_INSTALL_INCLUDEDIR}" + configure_pkg_config_file( + "${PROJECT_NAME}" + NAME + "${PROJECT_NAME}" + VERSION + "${PROJECT_VERSION}" + DESCRIPTION + "${CPACK_PACKAGE_DESCRIPTION}" + URL + "${CPACK_PACKAGE_HOMEPAGE_URL}" + INSTALL_LIB_DIR + "${CMAKE_INSTALL_DATAROOTDIR}" + INSTALL_INCLUDE_DIR + "${CMAKE_INSTALL_INCLUDEDIR}" ) - if (MAGIC_ENUM_OPT_INSTALL_PACKAGE_XML) - install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/package.xml - DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/${PROJECT_NAME}) + if(MAGIC_ENUM_OPT_INSTALL_PACKAGE_XML) + install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/package.xml + DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/${PROJECT_NAME} + ) endif() include(CPack) + endif() + endif() diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index d74755c..8fe6bf5 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -1,37 +1,63 @@ include(CheckCXXCompilerFlag) +if(${MAGIC_ENUM_OPT_TEST_INSTALLED_VERSION}) + find_package(magic_enum REQUIRED magic_enum) +endif() + +if(${MAGIC_ENUM_OPT_TEST_INSTALLED_VERSION_PKGCONFIG}) + find_package(PkgConfig) + pkg_check_modules(magic_enum REQUIRED magic_enum) + message(DEBUG "magic_enum_FOUND : ${magic_enum_FOUND}") + message(DEBUG "magic_enum_LIBRARIES: ${magic_enum_LIBRARIES}") + message(DEBUG "magic_enum_LINK_LIBRARIES: ${magic_enum_LINK_LIBRARIES}") + message(DEBUG "magic_enum_LIBRARY_DIRS: ${magic_enum_LIBRARY_DIRS}") + message(DEBUG "magic_enum_INCLUDE_DIRS: ${magic_enum_INCLUDE_DIRS}") + message(DEBUG "magic_enum_INCLUDE_DIR: ${magic_enum_INCLUDE_DIR}") + message(DEBUG "magic_enum_LDFLAGS: ${magic_enum_LDFLAGS}") + message(DEBUG "magic_enum_LDFLAGS_OTHER: ${magic_enum_LDFLAGS_OTHER}") + message(DEBUG "magic_enum_CFLAGS: ${magic_enum_CFLAGS}") + message(DEBUG "magic_enum_CFLAGS_OTHER: ${magic_enum_CFLAGS_OTHER}") + message(DEBUG "magic_enum_INCLUDEDIR: ${magic_enum_INCLUDEDIR}") + message(DEBUG "magic_enum_LIBDIR: ${magic_enum_LIBDIR}") + message(DEBUG "magic_enum_PREFIX: ${magic_enum_PREFIX}") +endif() + if(CMAKE_CXX_COMPILER_ID MATCHES "MSVC") - set(OPTIONS /W4 /WX) - check_cxx_compiler_flag(/permissive HAS_PERMISSIVE_FLAG) - if(HAS_PERMISSIVE_FLAG) - set(OPTIONS ${OPTIONS} /permissive-) - endif() + set(OPTIONS /W4 /WX) + check_cxx_compiler_flag(/permissive HAS_PERMISSIVE_FLAG) + if(HAS_PERMISSIVE_FLAG) + set(OPTIONS ${OPTIONS} /permissive-) + endif() - check_cxx_compiler_flag(/std:c++20 HAS_CPP20_FLAG) - check_cxx_compiler_flag(/std:c++23 HAS_CPP23_FLAG) - check_cxx_compiler_flag(/std:c++latest HAS_CPPLATEST_FLAG) + check_cxx_compiler_flag(/std:c++20 HAS_CPP20_FLAG) + check_cxx_compiler_flag(/std:c++23 HAS_CPP23_FLAG) + check_cxx_compiler_flag(/std:c++latest HAS_CPPLATEST_FLAG) elseif(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang") - set(CMAKE_VERBOSE_MAKEFILE ON) - set(OPTIONS -Wall -Wextra -Wshadow -pedantic-errors -Werror) + set(CMAKE_VERBOSE_MAKEFILE ON) + set(OPTIONS -Wall -Wextra -Wshadow -pedantic-errors -Werror) - check_cxx_compiler_flag(-std=c++20 HAS_CPP20_FLAG) - check_cxx_compiler_flag(-std=c++23 HAS_CPP23_FLAG) + check_cxx_compiler_flag(-std=c++20 HAS_CPP20_FLAG) + check_cxx_compiler_flag(-std=c++23 HAS_CPP23_FLAG) endif() function(make_test src target std) - add_executable(${target} ${src}) - target_compile_options(${target} PRIVATE ${OPTIONS}) - target_include_directories(${target} PRIVATE 3rdparty/Catch2/include) - target_link_libraries(${target} PRIVATE ${CMAKE_PROJECT_NAME}) - set_target_properties(${target} PROPERTIES CXX_EXTENSIONS OFF) - if(std) - if(CMAKE_CXX_COMPILER_ID MATCHES "MSVC") - target_compile_options(${target} PRIVATE /std:${std}) - else() - target_compile_options(${target} PRIVATE -std=${std}) - endif() + add_executable(${target} ${src}) + target_compile_options(${target} PRIVATE ${OPTIONS}) + target_include_directories(${target} PRIVATE 3rdparty/Catch2/include) + if(${MAGIC_ENUM_OPT_TEST_INSTALLED_VERSION_PKGCONFIG}) + target_include_directories(${target} PRIVATE ${magic_enum_INCLUDE_DIRS}) + else() + target_link_libraries(${target} PRIVATE magic_enum::magic_enum) + endif() + set_target_properties(${target} PROPERTIES CXX_EXTENSIONS OFF) + if(std) + if(CMAKE_CXX_COMPILER_ID MATCHES "MSVC") + target_compile_options(${target} PRIVATE /std:${std}) + else() + target_compile_options(${target} PRIVATE -std=${std}) endif() - add_test(NAME ${target} COMMAND ${target}) + endif() + add_test(NAME ${target} COMMAND ${target}) endfunction() make_test(test.cpp test-cpp17 c++17) @@ -41,38 +67,38 @@ make_test(test_containers.cpp test_containers-cpp17 c++17) make_test(test_wchar_t.cpp test_wchar_t-cpp17 c++17) if(MAGIC_ENUM_OPT_ENABLE_NONASCII) - make_test(test_nonascii.cpp test_nonascii-cpp17 c++17) + make_test(test_nonascii.cpp test_nonascii-cpp17 c++17) endif() if(HAS_CPP20_FLAG) - make_test(test.cpp test-cpp20 c++20) - make_test(test_flags.cpp test_flags-cpp20 c++20) - make_test(test_aliases.cpp test_aliases-cpp20 c++20) - make_test(test_containers.cpp test_containers-cpp20 c++20) - make_test(test_wchar_t.cpp test_wchar_t-cpp20 c++20) - if(MAGIC_ENUM_OPT_ENABLE_NONASCII) - make_test(test_nonascii.cpp test_nonascii-cpp20 c++20) - endif() + make_test(test.cpp test-cpp20 c++20) + make_test(test_flags.cpp test_flags-cpp20 c++20) + make_test(test_aliases.cpp test_aliases-cpp20 c++20) + make_test(test_containers.cpp test_containers-cpp20 c++20) + make_test(test_wchar_t.cpp test_wchar_t-cpp20 c++20) + if(MAGIC_ENUM_OPT_ENABLE_NONASCII) + make_test(test_nonascii.cpp test_nonascii-cpp20 c++20) + endif() endif() if(HAS_CPP23_FLAG) - make_test(test.cpp test-cpp23 c++23) - make_test(test_flags.cpp test_flags-cpp23 c++23) - make_test(test_aliases.cpp test_aliases-cpp23 c++23) - make_test(test_containers.cpp test_containers-cpp23 c++23) - make_test(test_wchar_t.cpp test_wchar_t-cpp23 c++23) - if(MAGIC_ENUM_OPT_ENABLE_NONASCII) - make_test(test_nonascii.cpp test_nonascii-cpp23 c++23) - endif() + make_test(test.cpp test-cpp23 c++23) + make_test(test_flags.cpp test_flags-cpp23 c++23) + make_test(test_aliases.cpp test_aliases-cpp23 c++23) + make_test(test_containers.cpp test_containers-cpp23 c++23) + make_test(test_wchar_t.cpp test_wchar_t-cpp23 c++23) + if(MAGIC_ENUM_OPT_ENABLE_NONASCII) + make_test(test_nonascii.cpp test_nonascii-cpp23 c++23) + endif() endif() if(HAS_CPPLATEST_FLAG) - make_test(test.cpp test-cpplatest c++latest) - make_test(test_flags.cpp test_flags-cpplatest c++latest) - make_test(test_aliases.cpp test_aliases-cpplatest c++latest) - make_test(test_containers.cpp test_containers-cpplatest c++latest) - make_test(test_wchar_t.cpp test_wchar_t-cpplatest c++latest) - if(MAGIC_ENUM_OPT_ENABLE_NONASCII) - make_test(test_nonascii.cpp test_nonascii-cpplatest c++latest) - endif() + make_test(test.cpp test-cpplatest c++latest) + make_test(test_flags.cpp test_flags-cpplatest c++latest) + make_test(test_aliases.cpp test_aliases-cpplatest c++latest) + make_test(test_containers.cpp test_containers-cpplatest c++latest) + make_test(test_wchar_t.cpp test_wchar_t-cpplatest c++latest) + if(MAGIC_ENUM_OPT_ENABLE_NONASCII) + make_test(test_nonascii.cpp test_nonascii-cpplatest c++latest) + endif() endif()