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..d94e700 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,47 +1,128 @@ -# 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 AND BOOST_USE_MODULES) + 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() -target_link_libraries(boost_type_index - ${__scope} - Boost::config - Boost::container_hash - Boost::throw_exception -) +# ----------------------------------------------------------------------------- +# 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() + +# 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..0d8e0b4 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -4,7 +4,7 @@ # See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt if(NOT TARGET tests) - add_custom_target(tests) + add_custom_target(tests) endif() if(MSVC) @@ -25,40 +25,40 @@ 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() function(boost_type_index_add_target target) - if(BOOST_USE_MODULES) - # C++ modules with different compile flags and definitions must be built separately - add_library(${target}) - target_sources(${target} - PUBLIC - FILE_SET CXX_MODULES - BASE_DIRS "${CMAKE_CURRENT_SOURCE_DIR}/../" - FILES "${CMAKE_CURRENT_SOURCE_DIR}/../modules/boost_type_index.cppm" - ) - target_compile_features(${target} PUBLIC cxx_std_20) - else() - add_library(${target} INTERFACE) - target_link_libraries(${target} INTERFACE Boost::type_index) - endif() - - target_include_directories(${target} ${__scope} ../include) - target_link_libraries(${target} - ${__scope} - Boost::config - Boost::container_hash - Boost::throw_exception - ) + if(BOOST_USE_MODULES) + # C++ modules with different compile flags and definitions must be built separately + add_library(${target}) + target_sources( + ${target} + PUBLIC + FILE_SET CXX_MODULES + BASE_DIRS "${CMAKE_CURRENT_SOURCE_DIR}/../" + FILES "${CMAKE_CURRENT_SOURCE_DIR}/../modules/boost_type_index.cppm" + ) + target_compile_features(${target} PUBLIC cxx_std_20) + else() + add_library(${target} INTERFACE) + target_link_libraries(${target} INTERFACE Boost::type_index) + endif() + + target_include_directories(${target} ${__scope} ../include) + if(PROJECT_IS_TOP_LEVEL AND TARGET Boost::headers) + target_link_libraries(${target} ${__scope} Boost::headers) + else() + target_link_libraries(${target} ${__scope} Boost::config Boost::container_hash Boost::throw_exception) + endif() 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) @@ -70,94 +70,107 @@ boost_type_index_test(type_index_ctti_alignment_test type_index_test_ctti_alignm get_target_property(_use_import_std boost_type_index CXX_MODULE_STD) +######################################### +if(PROJECT_IS_TOP_LEVEL AND TARGET Boost::headers) + return() +endif() +######################################### + file(GLOB EXAMPLE_FILES "../examples/*.cpp") -foreach (testsourcefile ${EXAMPLE_FILES}) +foreach(testsourcefile ${EXAMPLE_FILES}) get_filename_component(testname ${testsourcefile} NAME_WE) if(testname STREQUAL "user_defined_typeinfo") - continue() + 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) - continue() + if(_use_import_std) + continue() endif() if(testname STREQUAL "table_of_names") - continue() + 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() boost_type_index_add_target(boost_type_index_user_defined_typeinfo) if(BOOST_USE_MODULES) - target_compile_definitions(boost_type_index_user_defined_typeinfo PRIVATE "BOOST_TYPE_INDEX_USER_TYPEINDEX=<../examples/user_defined_typeinfo.hpp>") + target_compile_definitions( + boost_type_index_user_defined_typeinfo + PRIVATE "BOOST_TYPE_INDEX_USER_TYPEINDEX=<../examples/user_defined_typeinfo.hpp>" + ) endif() boost_type_index_test(type_index_user_defined_typeinfo_example ../examples/user_defined_typeinfo.cpp boost_type_index_user_defined_typeinfo) target_include_directories(type_index_user_defined_typeinfo_example PRIVATE ../examples) # CMake currently does not support standard stl module with different compile flags -if (NOT _use_import_std) - -boost_type_index_add_target(boost_type_index_user_defined_typeinfo_no_rtti) -if(BOOST_USE_MODULES) - target_compile_definitions(boost_type_index_user_defined_typeinfo_no_rtti PRIVATE "BOOST_TYPE_INDEX_USER_TYPEINDEX=<../examples/user_defined_typeinfo.hpp>") -endif() -target_compile_options(boost_type_index_user_defined_typeinfo_no_rtti ${__scope} ${BOOST_TYPEINDEX_DETAIL_NO_RTTI}) - -boost_type_index_test(type_index_user_defined_typeinfo_no_rtti_example ../examples/user_defined_typeinfo.cpp boost_type_index_user_defined_typeinfo_no_rtti) -target_include_directories(type_index_user_defined_typeinfo_no_rtti_example PRIVATE ../examples) - -foreach(target IN ITEMS - boost_type_index_no_rtti - boost_type_index_rtti_no_compat - boost_type_index_no_rtti_no_compat -) - boost_type_index_add_target(${target}) -endforeach() - -target_compile_options(boost_type_index_no_rtti ${__scope} ${BOOST_TYPEINDEX_DETAIL_NO_RTTI}) -target_compile_options(boost_type_index_no_rtti_no_compat ${__scope} ${BOOST_TYPEINDEX_DETAIL_NO_RTTI}) -target_compile_definitions(boost_type_index_rtti_no_compat ${__scope} BOOST_TYPE_INDEX_FORCE_NO_RTTI_COMPATIBILITY=1) -target_compile_definitions(boost_type_index_no_rtti_no_compat ${__scope} BOOST_TYPE_INDEX_FORCE_NO_RTTI_COMPATIBILITY=1) - -add_library(Boost::type_index_no_rtti ALIAS boost_type_index_no_rtti) -add_library(Boost::type_index_rtti_no_compat ALIAS boost_type_index_rtti_no_compat) -add_library(Boost::type_index_no_rtti_no_compat ALIAS boost_type_index_no_rtti_no_compat) - -# Making libraries that CANNOT work between rtti-on/rtti-off modules -add_library(boost_type_index_test_lib_nortti SHARED test_lib.cpp) -target_compile_options(boost_type_index_test_lib_nortti PRIVATE ${BOOST_TYPEINDEX_DETAIL_NO_RTTI}) -target_link_libraries(boost_type_index_test_lib_nortti PRIVATE Boost::type_index_no_rtti) - -add_library(boost_type_index_test_lib_anonymous_nortti SHARED test_lib_anonymous.cpp) -target_compile_options(boost_type_index_test_lib_anonymous_nortti PRIVATE ${BOOST_TYPEINDEX_DETAIL_NO_RTTI}) -target_link_libraries(boost_type_index_test_lib_anonymous_nortti PRIVATE Boost::type_index_no_rtti) - -# Making libraries that can work between rtti-on/rtti-off modules -add_library(boost_type_index_test_lib_nortti_compat SHARED test_lib.cpp) -target_compile_options(boost_type_index_test_lib_nortti_compat PRIVATE ${BOOST_TYPEINDEX_DETAIL_NO_RTTI}) -target_compile_definitions(boost_type_index_test_lib_nortti_compat PUBLIC BOOST_TYPE_INDEX_FORCE_NO_RTTI_COMPATIBILITY=1) -target_link_libraries(boost_type_index_test_lib_nortti_compat PUBLIC Boost::type_index_no_rtti_no_compat) +if(NOT _use_import_std) + boost_type_index_add_target(boost_type_index_user_defined_typeinfo_no_rtti) + if(BOOST_USE_MODULES) + target_compile_definitions( + boost_type_index_user_defined_typeinfo_no_rtti + PRIVATE "BOOST_TYPE_INDEX_USER_TYPEINDEX=<../examples/user_defined_typeinfo.hpp>" + ) + endif() + target_compile_options(boost_type_index_user_defined_typeinfo_no_rtti ${__scope} ${BOOST_TYPEINDEX_DETAIL_NO_RTTI}) + + boost_type_index_test(type_index_user_defined_typeinfo_no_rtti_example ../examples/user_defined_typeinfo.cpp boost_type_index_user_defined_typeinfo_no_rtti) + target_include_directories(type_index_user_defined_typeinfo_no_rtti_example PRIVATE ../examples) + + foreach(target IN ITEMS boost_type_index_no_rtti boost_type_index_rtti_no_compat boost_type_index_no_rtti_no_compat) + boost_type_index_add_target(${target}) + endforeach() + + target_compile_options(boost_type_index_no_rtti ${__scope} ${BOOST_TYPEINDEX_DETAIL_NO_RTTI}) + target_compile_options(boost_type_index_no_rtti_no_compat ${__scope} ${BOOST_TYPEINDEX_DETAIL_NO_RTTI}) + target_compile_definitions(boost_type_index_rtti_no_compat ${__scope} BOOST_TYPE_INDEX_FORCE_NO_RTTI_COMPATIBILITY=1) + target_compile_definitions( + boost_type_index_no_rtti_no_compat + ${__scope} + BOOST_TYPE_INDEX_FORCE_NO_RTTI_COMPATIBILITY=1 + ) -add_library(boost_type_index_test_lib_rtti_compat SHARED test_lib.cpp) -target_compile_options(boost_type_index_test_lib_rtti_compat PRIVATE ${BOOST_TYPEINDEX_DETAIL_RTTI}) -target_compile_definitions(boost_type_index_test_lib_rtti_compat PUBLIC BOOST_TYPE_INDEX_FORCE_NO_RTTI_COMPATIBILITY=1) -target_link_libraries(boost_type_index_test_lib_rtti_compat PUBLIC Boost::type_index_rtti_no_compat) + add_library(Boost::type_index_no_rtti ALIAS boost_type_index_no_rtti) + add_library(Boost::type_index_rtti_no_compat ALIAS boost_type_index_rtti_no_compat) + add_library(Boost::type_index_no_rtti_no_compat ALIAS boost_type_index_no_rtti_no_compat) + + # Making libraries that CANNOT work between rtti-on/rtti-off modules + add_library(boost_type_index_test_lib_nortti SHARED test_lib.cpp) + target_compile_options(boost_type_index_test_lib_nortti PRIVATE ${BOOST_TYPEINDEX_DETAIL_NO_RTTI}) + target_link_libraries(boost_type_index_test_lib_nortti PRIVATE Boost::type_index_no_rtti) + + add_library(boost_type_index_test_lib_anonymous_nortti SHARED test_lib_anonymous.cpp) + target_compile_options(boost_type_index_test_lib_anonymous_nortti PRIVATE ${BOOST_TYPEINDEX_DETAIL_NO_RTTI}) + target_link_libraries(boost_type_index_test_lib_anonymous_nortti PRIVATE Boost::type_index_no_rtti) + + # Making libraries that can work between rtti-on/rtti-off modules + add_library(boost_type_index_test_lib_nortti_compat SHARED test_lib.cpp) + target_compile_options(boost_type_index_test_lib_nortti_compat PRIVATE ${BOOST_TYPEINDEX_DETAIL_NO_RTTI}) + target_compile_definitions( + boost_type_index_test_lib_nortti_compat + PUBLIC BOOST_TYPE_INDEX_FORCE_NO_RTTI_COMPATIBILITY=1 + ) + target_link_libraries(boost_type_index_test_lib_nortti_compat PUBLIC Boost::type_index_no_rtti_no_compat) -boost_type_index_test(type_index_test_no_rtti type_index_test.cpp Boost::type_index_no_rtti) + add_library(boost_type_index_test_lib_rtti_compat SHARED test_lib.cpp) + target_compile_options(boost_type_index_test_lib_rtti_compat PRIVATE ${BOOST_TYPEINDEX_DETAIL_RTTI}) + target_compile_definitions(boost_type_index_test_lib_rtti_compat PUBLIC BOOST_TYPE_INDEX_FORCE_NO_RTTI_COMPATIBILITY=1) + target_link_libraries(boost_type_index_test_lib_rtti_compat PUBLIC Boost::type_index_rtti_no_compat) -boost_type_index_test(type_index_crossmodule_no_rtti_test testing_crossmodule.cpp Boost::type_index_no_rtti boost_type_index_test_lib_nortti) + boost_type_index_test(type_index_test_no_rtti type_index_test.cpp Boost::type_index_no_rtti) -# # Mixing RTTI on and off -if(NOT MSVC) # MSVC sometimes overrides the /GR- and the tests link - boost_type_index_test(type_index_crossmodule_no_rtti_rtti_compat_test testing_crossmodule.cpp boost_type_index_test_lib_rtti_compat) - boost_type_index_test(type_index_crossmodule_rtti_nortti_compat_test testing_crossmodule.cpp boost_type_index_test_lib_nortti_compat) -endif() + boost_type_index_test(type_index_crossmodule_no_rtti_test testing_crossmodule.cpp Boost::type_index_no_rtti boost_type_index_test_lib_nortti) + # Mixing RTTI on and off + if(NOT MSVC) # MSVC sometimes overrides the /GR- and the tests link + boost_type_index_test(type_index_crossmodule_no_rtti_rtti_compat_test testing_crossmodule.cpp boost_type_index_test_lib_rtti_compat) + boost_type_index_test(type_index_crossmodule_rtti_nortti_compat_test testing_crossmodule.cpp boost_type_index_test_lib_nortti_compat) + endif() endif() diff --git a/test/cmake_subdir_test/CMakeLists.txt b/test/cmake_subdir_test/CMakeLists.txt index e10cdb4..363a172 100644 --- a/test/cmake_subdir_test/CMakeLists.txt +++ b/test/cmake_subdir_test/CMakeLists.txt @@ -2,28 +2,28 @@ # 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) + +if(CMAKE_VERSION VERSION_GREATER_EQUAL "4.4.0") + set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD "f35a9ac6-8463-4d38-8eec-5d6008153e7d") +else() + set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD "451f2fe2-a8a2-47c3-bc32-94786d8fc91b") +endif() project(type_index_subdir_test LANGUAGES CXX) -foreach(dep IN ITEMS - assert - config - core - container_hash - describe - mp11 - smart_ptr - throw_exception - unordered - predef) +foreach( + dep + IN + ITEMS 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 +32,20 @@ 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()