diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4baac31..efc7f6f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -259,8 +259,8 @@ jobs: needs: posix runs-on: ubuntu-latest steps: - - name: Coveralls Finished - uses: coverallsapp/github-action@master - with: - github-token: ${{ secrets.github_token }} - parallel-finished: true + - name: Coveralls Finished + uses: coverallsapp/github-action@master + with: + github-token: ${{ secrets.github_token }} + parallel-finished: true diff --git a/.gitignore b/.gitignore index dbcd323..2a06130 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,5 @@ doc/html build* .cache .vscode +compile_commands.json +GNUmakefile diff --git a/CMakeLists.txt b/CMakeLists.txt index 2275d3b..6bdabf0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,47 +1,135 @@ -# Generated by `boostdep --cmake type_index` +# ----------------------------------------------------------------------------- +# Boost.type_index CMake +# Handles: no modules, modules, modules + import std; +# ----------------------------------------------------------------------------- # Copyright 2020, 2021 Peter Dimov # Copyright 2026 Fedor Osetrov # Distributed under the Boost Software License, Version 1.0. # https://www.boost.org/LICENSE_1_0.txt -cmake_minimum_required(VERSION 3.5...4.20) +cmake_minimum_required(VERSION 3.28...4.4) project(boost_type_index VERSION "${BOOST_SUPERPROJECT_VERSION}" LANGUAGES CXX) -if (BOOST_USE_MODULES) +if(PROJECT_IS_TOP_LEVEL) + set(BUILD_TESTING ON) + enable_testing() + find_package(Threads) + find_package(Boost 1.91.0 CONFIG REQUIRED) +endif() + +# ----------------------------------------------------------------------------- +# User option: enable C++ modules +# ----------------------------------------------------------------------------- +option(BOOST_USE_MODULES "Build Boost using C++ modules" OFF) + +# ----------------------------------------------------------------------------- +# Determine target type and sources +# ----------------------------------------------------------------------------- +if(BOOST_USE_MODULES) + + # Ensure CMAKE_CXX_STANDARD is set for module detection + if(NOT DEFINED CMAKE_CXX_STANDARD) + set(CMAKE_CXX_STANDARD 20) + endif() + add_library(boost_type_index) - target_sources(boost_type_index - PUBLIC - FILE_SET CXX_MODULES - BASE_DIRS "${CMAKE_CURRENT_SOURCE_DIR}" - FILES "${CMAKE_CURRENT_SOURCE_DIR}/modules/boost_type_index.cppm" + target_sources( + boost_type_index + PUBLIC + FILE_SET modules_public + TYPE CXX_MODULES + FILES modules/boost_type_index.cppm ) - target_compile_features(boost_type_index PUBLIC cxx_std_20) + # Require C++20 for modules + target_compile_features(boost_type_index PUBLIC cxx_std_${CMAKE_CXX_STANDARD}) + # Define macro indicating modules usage target_compile_definitions(boost_type_index PUBLIC BOOST_USE_MODULES) - if ((CMAKE_CXX_STANDARD IN_LIST CMAKE_CXX_COMPILER_IMPORT_STD) AND CMAKE_CXX_MODULE_STD) - target_compile_features(boost_type_index PRIVATE cxx_std_23) - target_compile_definitions(boost_type_index PRIVATE BOOST_TYPE_INDEX_USE_STD_MODULE) - message(STATUS "Using `import std;`") + + # Check if import std; is available for the current standard + if(${CMAKE_CXX_STANDARD} IN_LIST CMAKE_CXX_COMPILER_IMPORT_STD) + target_compile_definitions(boost_type_index PUBLIC BOOST_TYPE_INDEX_USE_STD_MODULE) + set_property(TARGET boost_type_index PROPERTY CXX_MODULE_STD ON) + message(STATUS "Boost.type_index: Using `import std;`") else() - message(STATUS "`import std;` is not available") + message(WARNING "Boost.type_index: `import std;` is not available for C++${CMAKE_CXX_STANDARD}") endif() + set(__scope PUBLIC) + else() + + # Verify interface headers only at top level + if(PROJECT_IS_TOP_LEVEL) + set(CMAKE_VERIFY_INTERFACE_HEADER_SETS ON) + endif() + + # Modules disabled -> INTERFACE library add_library(boost_type_index INTERFACE) + + # If modules are disabled, require C++17 for headers + target_compile_features(boost_type_index INTERFACE cxx_std_17) + set(__scope INTERFACE) + endif() -target_include_directories(boost_type_index ${__scope} include) -add_library(Boost::type_index ALIAS boost_type_index) +# ----------------------------------------------------------------------------- +# Include headers +# ----------------------------------------------------------------------------- +# Note: usable starting with cmake v3.23 +if(NOT CMAKE_VERSION VERSION_LESS 3.23) + target_sources( + boost_type_index + PUBLIC + FILE_SET headers_public + TYPE HEADERS + BASE_DIRS include + FILES + include/boost/type_index.hpp + include/boost/type_index/runtime_cast.hpp + include/boost/type_index/stl_type_index.hpp + include/boost/type_index/detail/compile_time_type_info.hpp + include/boost/type_index/detail/stl_register_class.hpp + include/boost/type_index/detail/config.hpp + include/boost/type_index/detail/ctti_register_class.hpp + include/boost/type_index/ctti_type_index.hpp + include/boost/type_index/runtime_cast/std_shared_ptr_cast.hpp + include/boost/type_index/runtime_cast/detail/runtime_cast_impl.hpp + include/boost/type_index/runtime_cast/register_runtime_class.hpp + include/boost/type_index/runtime_cast/pointer_cast.hpp + include/boost/type_index/runtime_cast/reference_cast.hpp + include/boost/type_index/runtime_cast/boost_shared_ptr_cast.hpp + include/boost/type_index/type_index_facade.hpp + ) +else() + target_include_directories(boost_type_index ${__scope} include) +endif() + +# ----------------------------------------------------------------------------- +# Link dependencies +# ----------------------------------------------------------------------------- +if(PROJECT_IS_TOP_LEVEL) + target_link_libraries(boost_type_index ${__scope} Boost::headers) +else() + target_link_libraries(boost_type_index + ${__scope} + Boost::config + Boost::container_hash + Boost::core + Boost::smart_ptr + Boost::throw_exception + Boost::unordered + ) +endif() -target_link_libraries(boost_type_index - ${__scope} - Boost::config - Boost::container_hash - Boost::throw_exception -) +# Alias for convenient import +add_library(Boost::type_index ALIAS boost_type_index) +# ----------------------------------------------------------------------------- +# Testing +# ----------------------------------------------------------------------------- if(BUILD_TESTING) - add_subdirectory(test) + add_subdirectory(test) endif() diff --git a/modules/boost_type_index.cppm b/modules/boost_type_index.cppm index c40a43a..e16f081 100644 --- a/modules/boost_type_index.cppm +++ b/modules/boost_type_index.cppm @@ -9,8 +9,6 @@ module; #include -#include -#include #if __has_include() # include @@ -22,6 +20,8 @@ module; #include #ifndef BOOST_TYPE_INDEX_USE_STD_MODULE +#include +#include #include #include #include diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 29cde66..eeea37c 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -25,7 +25,7 @@ target_link_libraries(boost_type_index_test_lib_anonymous_rtti PRIVATE Boost::ty function(boost_type_index_test name sources) add_executable(${name} "${sources}") - target_link_libraries(${name} PRIVATE Boost::core ${ARGN}) + target_link_libraries(${name} PRIVATE Boost::type_index ${ARGN}) add_test(NAME ${name} COMMAND ${name}) add_dependencies(tests ${name}) endfunction() @@ -49,16 +49,13 @@ function(boost_type_index_add_target target) target_include_directories(${target} ${__scope} ../include) target_link_libraries(${target} ${__scope} - Boost::config - Boost::container_hash - Boost::throw_exception ) endfunction() boost_type_index_test(type_index_test type_index_test.cpp Boost::type_index) boost_type_index_test(type_index_constexpr_test type_index_constexpr_test.cpp Boost::type_index) boost_type_index_test(type_index_ctti_print_name_test ctti_print_name.cpp Boost::type_index) -boost_type_index_test(type_index_runtime_cast_test type_index_runtime_cast_test.cpp Boost::type_index Boost::smart_ptr) +boost_type_index_test(type_index_runtime_cast_test type_index_runtime_cast_test.cpp Boost::type_index) boost_type_index_test(type_index_crossmodule_test testing_crossmodule.cpp Boost::type_index boost_type_index_test_lib_rtti) boost_type_index_test(type_index_crossmodule_anonymous_test testing_crossmodule_anonymous.cpp Boost::type_index boost_type_index_test_lib_anonymous_rtti) @@ -78,7 +75,7 @@ foreach (testsourcefile ${EXAMPLE_FILES}) continue() endif() - boost_type_index_test(type_index_${testname}_example ${testsourcefile} Boost::type_index Boost::unordered) + boost_type_index_test(type_index_${testname}_example ${testsourcefile} Boost::type_index) target_include_directories(type_index_${testname}_example PRIVATE ../examples) if (_use_import_std) @@ -89,7 +86,7 @@ foreach (testsourcefile ${EXAMPLE_FILES}) continue() endif() - boost_type_index_test(type_index_${testname}_no_rtti_example ${testsourcefile} Boost::type_index_no_rtti Boost::unordered) + boost_type_index_test(type_index_${testname}_no_rtti_example ${testsourcefile} Boost::type_index_no_rtti) target_include_directories(type_index_${testname}_no_rtti_example PRIVATE ../examples) endforeach() diff --git a/test/cmake_subdir_test/CMakeLists.txt b/test/cmake_subdir_test/CMakeLists.txt index e10cdb4..363347e 100644 --- a/test/cmake_subdir_test/CMakeLists.txt +++ b/test/cmake_subdir_test/CMakeLists.txt @@ -2,28 +2,31 @@ # Distributed under the Boost Software License, Version 1.0. # See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt -cmake_minimum_required(VERSION 3.5...4.0) +cmake_minimum_required(VERSION 3.28...4.4) + +set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD "451f2fe2-a8a2-47c3-bc32-94786d8fc91b") project(type_index_subdir_test LANGUAGES CXX) foreach(dep IN ITEMS - assert - config - core - container_hash - describe - mp11 - smart_ptr - throw_exception - unordered - predef) + assert + config + core + container_hash + describe + mp11 + smart_ptr + throw_exception + unordered + predef +) add_subdirectory(../../../${dep} boostorg/${dep}) endforeach() enable_testing() add_subdirectory(../../ boostorg/type_index) -if (BOOST_USE_MODULES) +if(BOOST_USE_MODULES) add_executable(boost_type_index_module_usage ../../modules/usage_sample.cpp) target_link_libraries(boost_type_index_module_usage PRIVATE Boost::type_index) add_test(NAME boost_type_index_module_usage COMMAND boost_type_index_module_usage) @@ -32,4 +35,19 @@ if (BOOST_USE_MODULES) add_executable(boost_type_index_module_usage_mu ../../modules/usage_test_mu1.cpp ../../modules/usage_test_mu2.cpp) target_link_libraries(boost_type_index_module_usage_mu PRIVATE Boost::type_index) add_test(NAME boost_type_index_module_usage_mu COMMAND boost_type_index_module_usage_mu) +else() + list(APPEND RUN_TESTS_SOURCES + compare_ctti_stl.cpp + ctti_print_name.cpp + track_13621.cpp + type_index_runtime_cast_test.cpp + type_index_test.cpp + ) endif() + +foreach(testsourcefile ${RUN_TESTS_SOURCES}) + get_filename_component(testname ../${testsourcefile} NAME_WLE) + add_executable(${PROJECT_NAME}_${testname} ../${testsourcefile}) + target_link_libraries(${PROJECT_NAME}_${testname} Boost::type_index) + add_test(NAME ${PROJECT_NAME}_${testname} COMMAND ${PROJECT_NAME}_${testname}) +endforeach()