From 539b097bd8887475d848009a60f9c4895806cf77 Mon Sep 17 00:00:00 2001 From: Vito Gamberini Date: Sun, 26 Jul 2026 16:34:33 -0400 Subject: [PATCH] CPS/c++modules: Use file system root as base directory for module manifests Fixes: #27989 --- Source/cmCxxModuleMetadata.cxx | 12 +++-- .../CXXModulesCompile/RunCMakeTest.cmake | 1 + .../exp-nested-dirs-build/CMakeLists.txt | 50 +++++++++++++++++++ .../exp-nested-dirs-build/nested/alpha.cxx | 6 +++ .../exp-nested-dirs-build/nested/sub/beta.cxx | 6 +++ .../exp-nested-dirs-build/test/CMakeLists.txt | 5 ++ 6 files changed, 77 insertions(+), 3 deletions(-) create mode 100644 Tests/RunCMake/CXXModulesCompile/exp-nested-dirs-build/CMakeLists.txt create mode 100644 Tests/RunCMake/CXXModulesCompile/exp-nested-dirs-build/nested/alpha.cxx create mode 100644 Tests/RunCMake/CXXModulesCompile/exp-nested-dirs-build/nested/sub/beta.cxx create mode 100644 Tests/RunCMake/CXXModulesCompile/exp-nested-dirs-build/test/CMakeLists.txt diff --git a/Source/cmCxxModuleMetadata.cxx b/Source/cmCxxModuleMetadata.cxx index 869e4c579b..322b5a16af 100644 --- a/Source/cmCxxModuleMetadata.cxx +++ b/Source/cmCxxModuleMetadata.cxx @@ -464,13 +464,19 @@ MetaDataProperties CollectMetaProperties(cmCxxModuleMetadata const& meta) props.MetadataDir = cmSystemTools::GetFilenamePath(meta.MetadataFilePath); +#ifndef _WIN32 + props.BaseDirs.insert("/"); +#endif + for (auto const& module : meta.Modules) { std::string sourcePath = props.NormalizePath(module.SourcePath); props.Sources.insert(sourcePath); - // Module metadata files can reference files in different roots, - // just use the immediate parent directory as a base directory - props.BaseDirs.insert(cmSystemTools::GetFilenamePath(sourcePath)); +#ifdef _WIN32 + std::string root; + cmSystemTools::SplitPathRootComponent(sourcePath, &root); + props.BaseDirs.insert(root); +#endif if (module.LocalArguments) { for (auto const& incDir : module.LocalArguments->IncludeDirectories) { diff --git a/Tests/RunCMake/CXXModulesCompile/RunCMakeTest.cmake b/Tests/RunCMake/CXXModulesCompile/RunCMakeTest.cmake index d37cdbe3f2..becb546549 100644 --- a/Tests/RunCMake/CXXModulesCompile/RunCMakeTest.cmake +++ b/Tests/RunCMake/CXXModulesCompile/RunCMakeTest.cmake @@ -335,6 +335,7 @@ endfunction () # Tests which install BMIs if ("export_bmi" IN_LIST CMake_TEST_MODULE_COMPILATION) + run_cxx_module_test(exp-nested-dirs-build) run_cxx_module_test(exp-iface-no-props-build) run_cxx_module_test(exp-iface-build) run_cxx_module_test(exp-incdirs-build) diff --git a/Tests/RunCMake/CXXModulesCompile/exp-nested-dirs-build/CMakeLists.txt b/Tests/RunCMake/CXXModulesCompile/exp-nested-dirs-build/CMakeLists.txt new file mode 100644 index 0000000000..12d1474331 --- /dev/null +++ b/Tests/RunCMake/CXXModulesCompile/exp-nested-dirs-build/CMakeLists.txt @@ -0,0 +1,50 @@ +cmake_minimum_required(VERSION 3.24...3.28) +project(cxx_modules_nested_dirs CXX) + +include("${CMAKE_SOURCE_DIR}/../cxx-modules-rules.cmake") + +add_library(export_nested_dirs STATIC) +target_sources(export_nested_dirs + PUBLIC + FILE_SET modules TYPE CXX_MODULES + BASE_DIRS + "${CMAKE_CURRENT_SOURCE_DIR}" + FILES + nested/alpha.cxx + nested/sub/beta.cxx + ) +target_compile_features(export_nested_dirs PUBLIC cxx_std_20) + +install(TARGETS export_nested_dirs + EXPORT CXXModules + FILE_SET modules DESTINATION "lib/cxx/miu") +export(EXPORT CXXModules + NAMESPACE CXXModules:: + FILE "${CMAKE_CURRENT_BINARY_DIR}/export_nested_dirs-targets.cmake" + CXX_MODULES_DIRECTORY "export_nested_dirs-cxx-modules") +export(PACKAGE_INFO export_nested_dirs_cps + EXPORT CXXModules + CXX_MODULES_DIRECTORY "export_nested_dirs-cxx-modules-cps") +file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/export_nested_dirs-config.cmake" + "include(\"\${CMAKE_CURRENT_LIST_DIR}/export_nested_dirs-targets.cmake\") +set(\${CMAKE_FIND_PACKAGE_NAME}_FOUND 1) +") + +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 export_nested_dirs_build + COMMAND + "${CMAKE_COMMAND}" + "-DCMAKE_PREFIX_PATH=${CMAKE_CURRENT_BINARY_DIR}" + ${generator} + -S "${CMAKE_CURRENT_SOURCE_DIR}/test" + -B "${CMAKE_CURRENT_BINARY_DIR}/test") diff --git a/Tests/RunCMake/CXXModulesCompile/exp-nested-dirs-build/nested/alpha.cxx b/Tests/RunCMake/CXXModulesCompile/exp-nested-dirs-build/nested/alpha.cxx new file mode 100644 index 0000000000..d5c20c0c33 --- /dev/null +++ b/Tests/RunCMake/CXXModulesCompile/exp-nested-dirs-build/nested/alpha.cxx @@ -0,0 +1,6 @@ +export module nested_alpha; + +export int from_alpha() +{ + return 1; +} diff --git a/Tests/RunCMake/CXXModulesCompile/exp-nested-dirs-build/nested/sub/beta.cxx b/Tests/RunCMake/CXXModulesCompile/exp-nested-dirs-build/nested/sub/beta.cxx new file mode 100644 index 0000000000..fea3c24e04 --- /dev/null +++ b/Tests/RunCMake/CXXModulesCompile/exp-nested-dirs-build/nested/sub/beta.cxx @@ -0,0 +1,6 @@ +export module nested_sub_beta; + +export int from_beta() +{ + return 2; +} diff --git a/Tests/RunCMake/CXXModulesCompile/exp-nested-dirs-build/test/CMakeLists.txt b/Tests/RunCMake/CXXModulesCompile/exp-nested-dirs-build/test/CMakeLists.txt new file mode 100644 index 0000000000..47d693e09d --- /dev/null +++ b/Tests/RunCMake/CXXModulesCompile/exp-nested-dirs-build/test/CMakeLists.txt @@ -0,0 +1,5 @@ +cmake_minimum_required(VERSION 3.28) +project(cxx_modules_library NONE) + +find_package(export_nested_dirs REQUIRED) +find_package(export_nested_dirs_cps REQUIRED)