From 85e1281e004cc7272b4d4342921065adf0e1cf82 Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Fri, 1 Mar 2024 23:36:20 -0500 Subject: Tests/CXXModules: add tests for exporting `CXX_MODULE_STD` --- Tests/RunCMake/CXXModules/RunCMakeTest.cmake | 4 ++ .../import-std-export-no-std-build/CMakeLists.txt | 56 +++++++++++++++++++++ .../impl-uses-std.cxx | 3 ++ .../import-std-export-no-std-build/main.cxx | 6 +++ .../test/CMakeLists.txt | 45 +++++++++++++++++ .../import-std-export-no-std-build/uses-std.cxx | 8 +++ .../CMakeLists.txt | 58 ++++++++++++++++++++++ .../impl-uses-std.cxx | 3 ++ .../import-std-export-no-std-install/main.cxx | 6 +++ .../test/CMakeLists.txt | 45 +++++++++++++++++ .../import-std-export-no-std-install/uses-std.cxx | 9 ++++ 11 files changed, 243 insertions(+) create mode 100644 Tests/RunCMake/CXXModules/examples/import-std-export-no-std-build/CMakeLists.txt create mode 100644 Tests/RunCMake/CXXModules/examples/import-std-export-no-std-build/impl-uses-std.cxx create mode 100644 Tests/RunCMake/CXXModules/examples/import-std-export-no-std-build/main.cxx create mode 100644 Tests/RunCMake/CXXModules/examples/import-std-export-no-std-build/test/CMakeLists.txt create mode 100644 Tests/RunCMake/CXXModules/examples/import-std-export-no-std-build/uses-std.cxx create mode 100644 Tests/RunCMake/CXXModules/examples/import-std-export-no-std-install/CMakeLists.txt create mode 100644 Tests/RunCMake/CXXModules/examples/import-std-export-no-std-install/impl-uses-std.cxx create mode 100644 Tests/RunCMake/CXXModules/examples/import-std-export-no-std-install/main.cxx create mode 100644 Tests/RunCMake/CXXModules/examples/import-std-export-no-std-install/test/CMakeLists.txt create mode 100644 Tests/RunCMake/CXXModules/examples/import-std-export-no-std-install/uses-std.cxx diff --git a/Tests/RunCMake/CXXModules/RunCMakeTest.cmake b/Tests/RunCMake/CXXModules/RunCMakeTest.cmake index 84e2085..725ff2f 100644 --- a/Tests/RunCMake/CXXModules/RunCMakeTest.cmake +++ b/Tests/RunCMake/CXXModules/RunCMakeTest.cmake @@ -243,6 +243,10 @@ if ("named" IN_LIST CMake_TEST_MODULE_COMPILATION) set(RunCMake_CXXModules_NO_TEST 1) run_cxx_module_test(import-std-no-std-property) unset(RunCMake_CXXModules_NO_TEST) + run_cxx_module_test(import-std-export-no-std-build) + set(RunCMake_CXXModules_INSTALL 1) + run_cxx_module_test(import-std-export-no-std-install) + unset(RunCMake_CXXModules_INSTALL) if ("collation" IN_LIST CMake_TEST_MODULE_COMPILATION) run_cxx_module_test(import-std-not-in-export-build) diff --git a/Tests/RunCMake/CXXModules/examples/import-std-export-no-std-build/CMakeLists.txt b/Tests/RunCMake/CXXModules/examples/import-std-export-no-std-build/CMakeLists.txt new file mode 100644 index 0000000..0a4c41d --- /dev/null +++ b/Tests/RunCMake/CXXModules/examples/import-std-export-no-std-build/CMakeLists.txt @@ -0,0 +1,56 @@ +cmake_minimum_required(VERSION 3.29) +project(cxx_modules_import_std_export_no_std CXX) + +include("${CMAKE_SOURCE_DIR}/../cxx-modules-rules.cmake") + +set(CMAKE_NO_STD 1) + +add_library(import_std_export_no_std) +target_sources(import_std_export_no_std + PRIVATE + uses-std.cxx + PUBLIC + FILE_SET use_std TYPE CXX_MODULES FILES + impl-uses-std.cxx) +target_compile_features(import_std_export_no_std PUBLIC cxx_std_23) +set_property(TARGET import_std_export_no_std + PROPERTY + CXX_MODULE_STD "$>") + +add_executable(main + main.cxx) +target_link_libraries(main PRIVATE import_std_export_no_std) + +install(TARGETS import_std_export_no_std + EXPORT export + ARCHIVE DESTINATION "lib" + FILE_SET use_std DESTINATION "lib/cxx/miu") +export(EXPORT export + NAMESPACE CXXModules:: + FILE "${CMAKE_CURRENT_BINARY_DIR}/import_std_export_no_std-targets.cmake") +file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/import_std_export_no_std-config.cmake" + "include(\"\${CMAKE_CURRENT_LIST_DIR}/import_std_export_no_std-targets.cmake\") +set(\${CMAKE_FIND_PACKAGE_NAME}_FOUND 1) +") + +add_test(NAME main COMMAND main) + +set(generator + -G "${CMAKE_GENERATOR}") +if (CMAKE_GENERATOR_TOOLSET) + list(APPEND generator + -T "${CMAKE_GENERATOR_TOOLSET}") +endif () +if (CMAKE_GENERATOR_PLATFORM) + list(APPEND generator + -A "${CMAKE_GENERATOR_PLATFORM}") +endif () + +add_test(NAME import_std_export_no_std_build + COMMAND + "${CMAKE_COMMAND}" + "-Dexpected_dir=${CMAKE_CURRENT_SOURCE_DIR}" + "-Dimport_std_export_no_std_DIR=${CMAKE_CURRENT_BINARY_DIR}" + ${generator} + -S "${CMAKE_CURRENT_SOURCE_DIR}/test" + -B "${CMAKE_CURRENT_BINARY_DIR}/test") diff --git a/Tests/RunCMake/CXXModules/examples/import-std-export-no-std-build/impl-uses-std.cxx b/Tests/RunCMake/CXXModules/examples/import-std-export-no-std-build/impl-uses-std.cxx new file mode 100644 index 0000000..ee19332 --- /dev/null +++ b/Tests/RunCMake/CXXModules/examples/import-std-export-no-std-build/impl-uses-std.cxx @@ -0,0 +1,3 @@ +export module uses_std; + +export int f(); diff --git a/Tests/RunCMake/CXXModules/examples/import-std-export-no-std-build/main.cxx b/Tests/RunCMake/CXXModules/examples/import-std-export-no-std-build/main.cxx new file mode 100644 index 0000000..a6dd8d8 --- /dev/null +++ b/Tests/RunCMake/CXXModules/examples/import-std-export-no-std-build/main.cxx @@ -0,0 +1,6 @@ +import uses_std; + +int main(int argc, char* argv[]) +{ + return f(); +} diff --git a/Tests/RunCMake/CXXModules/examples/import-std-export-no-std-build/test/CMakeLists.txt b/Tests/RunCMake/CXXModules/examples/import-std-export-no-std-build/test/CMakeLists.txt new file mode 100644 index 0000000..e37f174 --- /dev/null +++ b/Tests/RunCMake/CXXModules/examples/import-std-export-no-std-build/test/CMakeLists.txt @@ -0,0 +1,45 @@ +cmake_minimum_required(VERSION 3.29) +project(cxx_modules_library NONE) + +find_package(import_std_export_no_std REQUIRED) + +if (NOT TARGET CXXModules::import_std_export_no_std) + message(FATAL_ERROR + "Missing imported target") +endif () + +function (check_property expected property) + get_property(actual TARGET CXXModules::import_std_export_no_std + PROPERTY "${property}") + if (NOT DEFINED actual) + if (NOT expected STREQUAL "") + message(SEND_ERROR + "Mismatch for ${property}:\n expected: ${expected}\n actual: NOT-DEFINED") + endif () + elseif (NOT actual STREQUAL expected) + message(SEND_ERROR + "Mismatch for ${property}:\n expected: ${expected}\n actual: ${actual}") + endif () +endfunction () + +check_property("" "IMPORTED_CXX_MODULES_INCLUDE_DIRECTORIES") +check_property("" "IMPORTED_CXX_MODULES_COMPILE_DEFINITIONS") +check_property("cxx_std_23" "IMPORTED_CXX_MODULES_COMPILE_FEATURES") +check_property("" "IMPORTED_CXX_MODULES_LINK_LIBRARIES") +check_property("" "INTERFACE_LINK_LIBRARIES") +check_property("$" "CXX_MODULE_STD") + +# Extract the export-dependent targets from the export file. +file(STRINGS "${import_std_export_no_std_DIR}/import_std_export_no_std-targets.cmake" usage_dependent_targets + REGEX "foreach._target ") +# Rudimentary argument splitting. +string(REPLACE " " ";" usage_dependent_targets "${usage_dependent_targets}") +# Remove exported "target" names. +list(FILTER usage_dependent_targets EXCLUDE REGEX "CXXModules::") +# Strip quotes. +string(REPLACE "\"" "" usage_dependent_targets "${usage_dependent_targets}") + +if ("__CMAKE::CXX23" IN_LIST usage_dependent_targets) + message(SEND_ERROR + "The main export requires the '__CMAKE::CXX23' target") +endif () diff --git a/Tests/RunCMake/CXXModules/examples/import-std-export-no-std-build/uses-std.cxx b/Tests/RunCMake/CXXModules/examples/import-std-export-no-std-build/uses-std.cxx new file mode 100644 index 0000000..bd91093 --- /dev/null +++ b/Tests/RunCMake/CXXModules/examples/import-std-export-no-std-build/uses-std.cxx @@ -0,0 +1,8 @@ +module uses_std; + +import std; + +int f() +{ + return 0; +} diff --git a/Tests/RunCMake/CXXModules/examples/import-std-export-no-std-install/CMakeLists.txt b/Tests/RunCMake/CXXModules/examples/import-std-export-no-std-install/CMakeLists.txt new file mode 100644 index 0000000..69edbb5 --- /dev/null +++ b/Tests/RunCMake/CXXModules/examples/import-std-export-no-std-install/CMakeLists.txt @@ -0,0 +1,58 @@ +cmake_minimum_required(VERSION 3.29) +project(cxx_modules_import_std_export_no_std CXX) + +include("${CMAKE_SOURCE_DIR}/../cxx-modules-rules.cmake") + +add_library(import_std_export_no_std) +target_sources(import_std_export_no_std + PRIVATE + uses-std.cxx + PUBLIC + FILE_SET use_std TYPE CXX_MODULES FILES + impl-uses-std.cxx) +target_compile_features(import_std_export_no_std PUBLIC cxx_std_23) +set_property(TARGET import_std_export_no_std + PROPERTY + CXX_MODULE_STD "$>") + +add_executable(main + main.cxx) +target_link_libraries(main PRIVATE import_std_export_no_std) + +install(TARGETS import_std_export_no_std + EXPORT export + ARCHIVE DESTINATION "lib" + FILE_SET use_std DESTINATION "lib/cxx/miu") +install( + EXPORT export + NAMESPACE CXXModules:: + DESTINATION "lib/cmake/import_std_export_no_std" + FILE "import_std_export_no_std-targets.cmake") +file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/import_std_export_no_std-config.cmake" + "include(\"\${CMAKE_CURRENT_LIST_DIR}/import_std_export_no_std-targets.cmake\") +set(\${CMAKE_FIND_PACKAGE_NAME}_FOUND 1) +") +install(FILES "${CMAKE_CURRENT_BINARY_DIR}/import_std_export_no_std-config.cmake" + DESTINATION "lib/cmake/import_std_export_no_std") + +add_test(NAME main COMMAND main) + +set(generator + -G "${CMAKE_GENERATOR}") +if (CMAKE_GENERATOR_TOOLSET) + list(APPEND generator + -T "${CMAKE_GENERATOR_TOOLSET}") +endif () +if (CMAKE_GENERATOR_PLATFORM) + list(APPEND generator + -A "${CMAKE_GENERATOR_PLATFORM}") +endif () + +add_test(NAME import_std_export_no_std_build + COMMAND + "${CMAKE_COMMAND}" + "-Dexpected_dir=${CMAKE_INSTALL_PREFIX}/lib/cxx/miu" + "-Dimport_std_export_no_std_DIR=${CMAKE_INSTALL_PREFIX}/lib/cmake/import_std_export_no_std" + ${generator} + -S "${CMAKE_CURRENT_SOURCE_DIR}/test" + -B "${CMAKE_CURRENT_BINARY_DIR}/test") diff --git a/Tests/RunCMake/CXXModules/examples/import-std-export-no-std-install/impl-uses-std.cxx b/Tests/RunCMake/CXXModules/examples/import-std-export-no-std-install/impl-uses-std.cxx new file mode 100644 index 0000000..ee19332 --- /dev/null +++ b/Tests/RunCMake/CXXModules/examples/import-std-export-no-std-install/impl-uses-std.cxx @@ -0,0 +1,3 @@ +export module uses_std; + +export int f(); diff --git a/Tests/RunCMake/CXXModules/examples/import-std-export-no-std-install/main.cxx b/Tests/RunCMake/CXXModules/examples/import-std-export-no-std-install/main.cxx new file mode 100644 index 0000000..a6dd8d8 --- /dev/null +++ b/Tests/RunCMake/CXXModules/examples/import-std-export-no-std-install/main.cxx @@ -0,0 +1,6 @@ +import uses_std; + +int main(int argc, char* argv[]) +{ + return f(); +} diff --git a/Tests/RunCMake/CXXModules/examples/import-std-export-no-std-install/test/CMakeLists.txt b/Tests/RunCMake/CXXModules/examples/import-std-export-no-std-install/test/CMakeLists.txt new file mode 100644 index 0000000..e37f174 --- /dev/null +++ b/Tests/RunCMake/CXXModules/examples/import-std-export-no-std-install/test/CMakeLists.txt @@ -0,0 +1,45 @@ +cmake_minimum_required(VERSION 3.29) +project(cxx_modules_library NONE) + +find_package(import_std_export_no_std REQUIRED) + +if (NOT TARGET CXXModules::import_std_export_no_std) + message(FATAL_ERROR + "Missing imported target") +endif () + +function (check_property expected property) + get_property(actual TARGET CXXModules::import_std_export_no_std + PROPERTY "${property}") + if (NOT DEFINED actual) + if (NOT expected STREQUAL "") + message(SEND_ERROR + "Mismatch for ${property}:\n expected: ${expected}\n actual: NOT-DEFINED") + endif () + elseif (NOT actual STREQUAL expected) + message(SEND_ERROR + "Mismatch for ${property}:\n expected: ${expected}\n actual: ${actual}") + endif () +endfunction () + +check_property("" "IMPORTED_CXX_MODULES_INCLUDE_DIRECTORIES") +check_property("" "IMPORTED_CXX_MODULES_COMPILE_DEFINITIONS") +check_property("cxx_std_23" "IMPORTED_CXX_MODULES_COMPILE_FEATURES") +check_property("" "IMPORTED_CXX_MODULES_LINK_LIBRARIES") +check_property("" "INTERFACE_LINK_LIBRARIES") +check_property("$" "CXX_MODULE_STD") + +# Extract the export-dependent targets from the export file. +file(STRINGS "${import_std_export_no_std_DIR}/import_std_export_no_std-targets.cmake" usage_dependent_targets + REGEX "foreach._target ") +# Rudimentary argument splitting. +string(REPLACE " " ";" usage_dependent_targets "${usage_dependent_targets}") +# Remove exported "target" names. +list(FILTER usage_dependent_targets EXCLUDE REGEX "CXXModules::") +# Strip quotes. +string(REPLACE "\"" "" usage_dependent_targets "${usage_dependent_targets}") + +if ("__CMAKE::CXX23" IN_LIST usage_dependent_targets) + message(SEND_ERROR + "The main export requires the '__CMAKE::CXX23' target") +endif () diff --git a/Tests/RunCMake/CXXModules/examples/import-std-export-no-std-install/uses-std.cxx b/Tests/RunCMake/CXXModules/examples/import-std-export-no-std-install/uses-std.cxx new file mode 100644 index 0000000..6b7e814 --- /dev/null +++ b/Tests/RunCMake/CXXModules/examples/import-std-export-no-std-install/uses-std.cxx @@ -0,0 +1,9 @@ +module uses_std; +import std; + +int f() +{ + std::string str = "hello!"; + std::cout << "program: " << str << std::endl; + return 0; +} -- cgit v0.12