diff options
13 files changed, 64 insertions, 5 deletions
diff --git a/Modules/ExternalProject.cmake b/Modules/ExternalProject.cmake index 574b339..605908d 100644 --- a/Modules/ExternalProject.cmake +++ b/Modules/ExternalProject.cmake @@ -4266,6 +4266,10 @@ function(ExternalProject_Add name) # Miscellaneous options # LIST_SEPARATOR + # + # Internal options (undocumented) + # + EXTERNALPROJECT_INTERNAL_ARGUMENT_SEPARATOR ) _ep_parse_arguments( ExternalProject_Add diff --git a/Modules/FetchContent.cmake b/Modules/FetchContent.cmake index 56fc0ed..4ff43ed 100644 --- a/Modules/FetchContent.cmake +++ b/Modules/FetchContent.cmake @@ -1336,9 +1336,11 @@ function(FetchContent_Declare contentName) endif() # Add back in the keyword args we pulled out and potentially tweaked/added + set(sep EXTERNALPROJECT_INTERNAL_ARGUMENT_SEPARATOR) foreach(key IN LISTS oneValueArgs) if(DEFINED ARG_${key}) - list(PREPEND ARG_UNPARSED_ARGUMENTS ${key} "${ARG_${key}}") + list(PREPEND ARG_UNPARSED_ARGUMENTS ${key} "${ARG_${key}}" ${sep}) + set(sep "") endif() endforeach() diff --git a/Source/cmVisualStudio10TargetGenerator.cxx b/Source/cmVisualStudio10TargetGenerator.cxx index 33152f2..8d6b024 100644 --- a/Source/cmVisualStudio10TargetGenerator.cxx +++ b/Source/cmVisualStudio10TargetGenerator.cxx @@ -2778,6 +2778,8 @@ void cmVisualStudio10TargetGenerator::OutputSourceSpecificFlags( } } + bool isCppModule = false; + for (std::string const& config : this->Configurations) { this->GeneratorTarget->NeedCxxModuleSupport(lang, config); @@ -2801,6 +2803,7 @@ void cmVisualStudio10TargetGenerator::OutputSourceSpecificFlags( if (fs && fs->GetType() == "CXX_MODULES"_s) { if (lang == "CXX"_s) { if (fs->GetType() == "CXX_MODULES"_s) { + isCppModule = true; if (shouldScanForModules && this->GlobalGenerator->IsScanDependenciesSupported()) { // ScanSourceforModuleDependencies uses 'cl /scanDependencies' and @@ -2959,6 +2962,14 @@ void cmVisualStudio10TargetGenerator::OutputSourceSpecificFlags( oh.OutputPreprocessorDefinitions(lang); } } + + if (isCppModule && !objectName.empty()) { + std::string baseName = cmStrCat("$(IntDir)/", objectName); + cmStripSuffixIfExists(baseName, ".obj"); + e2.Element("ModuleOutputFile", cmStrCat(baseName, ".ifc")); + e2.Element("ModuleDependenciesFile", cmStrCat(baseName, ".module.json")); + } + if (this->IsXamlSource(source->GetFullPath())) { const std::string& fileName = source->GetFullPath(); e2.Element("DependentUpon", diff --git a/Tests/RunCMake/CXXModules/RunCMakeTest.cmake b/Tests/RunCMake/CXXModules/RunCMakeTest.cmake index 1569f91..ada0c65 100644 --- a/Tests/RunCMake/CXXModules/RunCMakeTest.cmake +++ b/Tests/RunCMake/CXXModules/RunCMakeTest.cmake @@ -148,6 +148,7 @@ if ("named" IN_LIST CMake_TEST_MODULE_COMPILATION) set(RunCMake_CXXModules_NO_TEST 1) run_cxx_module_test(circular) unset(RunCMake_CXXModules_NO_TEST) + run_cxx_module_test(same-src-name) run_cxx_module_test(scan_properties) endif () diff --git a/Tests/RunCMake/CXXModules/examples/same-src-name-stderr.txt b/Tests/RunCMake/CXXModules/examples/same-src-name-stderr.txt new file mode 100644 index 0000000..78bdf2b --- /dev/null +++ b/Tests/RunCMake/CXXModules/examples/same-src-name-stderr.txt @@ -0,0 +1,4 @@ +CMake Warning \(dev\) at CMakeLists.txt:7 \(target_sources\): + CMake's C\+\+ module support is experimental. It is meant only for + experimentation and feedback to CMake developers. +This warning is for project developers. Use -Wno-dev to suppress it. diff --git a/Tests/RunCMake/CXXModules/examples/same-src-name/CMakeLists.txt b/Tests/RunCMake/CXXModules/examples/same-src-name/CMakeLists.txt new file mode 100644 index 0000000..997bbb1 --- /dev/null +++ b/Tests/RunCMake/CXXModules/examples/same-src-name/CMakeLists.txt @@ -0,0 +1,20 @@ +cmake_minimum_required(VERSION 3.27) +project(cxx_modules_same_src_name CXX) + +include("${CMAKE_SOURCE_DIR}/../cxx-modules-rules.cmake") + +add_executable(same_src_name) +target_sources(same_src_name + PRIVATE + main.cxx + PRIVATE + FILE_SET CXX_MODULES + BASE_DIRS + "${CMAKE_CURRENT_SOURCE_DIR}" + FILES + a/same.cxx + b/same.cxx + ) +target_compile_features(same_src_name PUBLIC cxx_std_20) + +add_test(NAME same_src_name COMMAND same_src_name) diff --git a/Tests/RunCMake/CXXModules/examples/same-src-name/a/same.cxx b/Tests/RunCMake/CXXModules/examples/same-src-name/a/same.cxx new file mode 100644 index 0000000..8aa79cb --- /dev/null +++ b/Tests/RunCMake/CXXModules/examples/same-src-name/a/same.cxx @@ -0,0 +1,5 @@ +export module a.same; +export int a_same() +{ + return 0; +} diff --git a/Tests/RunCMake/CXXModules/examples/same-src-name/b/same.cxx b/Tests/RunCMake/CXXModules/examples/same-src-name/b/same.cxx new file mode 100644 index 0000000..7aa3703 --- /dev/null +++ b/Tests/RunCMake/CXXModules/examples/same-src-name/b/same.cxx @@ -0,0 +1,5 @@ +export module b.same; +export int b_same() +{ + return 0; +} diff --git a/Tests/RunCMake/CXXModules/examples/same-src-name/main.cxx b/Tests/RunCMake/CXXModules/examples/same-src-name/main.cxx new file mode 100644 index 0000000..30f2250 --- /dev/null +++ b/Tests/RunCMake/CXXModules/examples/same-src-name/main.cxx @@ -0,0 +1,7 @@ +import a.same; +import b.same; + +int main() +{ + return a_same() + b_same(); +} diff --git a/Tests/RunCMake/DependencyProviders/FetchContentSerial-stdout.txt b/Tests/RunCMake/DependencyProviders/FetchContentSerial-stdout.txt index fa4a794..5cda903 100644 --- a/Tests/RunCMake/DependencyProviders/FetchContentSerial-stdout.txt +++ b/Tests/RunCMake/DependencyProviders/FetchContentSerial-stdout.txt @@ -2,6 +2,6 @@ -- After cmake_language -- AThing_FOUND = 0 -- Intercepted FetchContent_MakeAvailable\(SomeDep\) --- Provider invoked for method FETCHCONTENT_MAKEAVAILABLE_SERIAL with args: SOURCE_DIR;.*/Tests/RunCMake/DependencyProviders;BINARY_DIR;.*/Tests/RunCMake/DependencyProviders/FetchContentSerial-build/_deps/somedep-build;SOURCE_SUBDIR;DoesNotExist +-- Provider invoked for method FETCHCONTENT_MAKEAVAILABLE_SERIAL with args: SOURCE_DIR;.*/Tests/RunCMake/DependencyProviders;BINARY_DIR;.*/Tests/RunCMake/DependencyProviders/FetchContentSerial-build/_deps/somedep-build;EXTERNALPROJECT_INTERNAL_ARGUMENT_SEPARATOR;SOURCE_SUBDIR;DoesNotExist -- FetchContent_MakeAvailable\(\) succeeded -- Configuring done diff --git a/Tests/RunCMake/DependencyProviders/PassThroughProvider-stdout.txt b/Tests/RunCMake/DependencyProviders/PassThroughProvider-stdout.txt index 0c9303a..5e412c4 100644 --- a/Tests/RunCMake/DependencyProviders/PassThroughProvider-stdout.txt +++ b/Tests/RunCMake/DependencyProviders/PassThroughProvider-stdout.txt @@ -4,4 +4,4 @@ -- Provider invoked for method FIND_PACKAGE with args: AThing;QUIET -- AThing_FOUND = 0 -- Null provider called --- Provider invoked for method FETCHCONTENT_MAKEAVAILABLE_SERIAL with args: SomeDep;SOURCE_DIR;.*/Tests/RunCMake/DependencyProviders;BINARY_DIR;.*/Tests/RunCMake/DependencyProviders/PassThroughProvider-build/_deps/somedep-build;SOURCE_SUBDIR;DoesNotExist +-- Provider invoked for method FETCHCONTENT_MAKEAVAILABLE_SERIAL with args: SomeDep;SOURCE_DIR;.*/Tests/RunCMake/DependencyProviders;BINARY_DIR;.*/Tests/RunCMake/DependencyProviders/PassThroughProvider-build/_deps/somedep-build;EXTERNALPROJECT_INTERNAL_ARGUMENT_SEPARATOR;SOURCE_SUBDIR;DoesNotExist diff --git a/Tests/RunCMake/DependencyProviders/Recurse-stdout.txt b/Tests/RunCMake/DependencyProviders/Recurse-stdout.txt index 2c2035a..25824cb 100644 --- a/Tests/RunCMake/DependencyProviders/Recurse-stdout.txt +++ b/Tests/RunCMake/DependencyProviders/Recurse-stdout.txt @@ -1,7 +1,7 @@ -- Before cmake_language -- After cmake_language -- Intercepted FetchContent_MakeAvailable\(SomeDep\) --- Provider invoked for method FETCHCONTENT_MAKEAVAILABLE_SERIAL with args: SOURCE_DIR;.*/Tests/RunCMake/DependencyProviders/Recurse-build/_deps/somedep-src;BINARY_DIR;.*/Tests/RunCMake/DependencyProviders/Recurse-build/_deps/somedep-build;DOWNLOAD_COMMAND;.*/cmake(\.exe)?;-E;echo;Download command called +-- Provider invoked for method FETCHCONTENT_MAKEAVAILABLE_SERIAL with args: SOURCE_DIR;.*/Tests/RunCMake/DependencyProviders/Recurse-build/_deps/somedep-src;BINARY_DIR;.*/Tests/RunCMake/DependencyProviders/Recurse-build/_deps/somedep-build;EXTERNALPROJECT_INTERNAL_ARGUMENT_SEPARATOR;DOWNLOAD_COMMAND;.*/cmake(\.exe)?;-E;echo;Download command called .*Download command called .*-- Should now be handled -- Configuring done diff --git a/Tests/RunCMake/DependencyProviders/RedirectFetchContentSerial-stdout.txt b/Tests/RunCMake/DependencyProviders/RedirectFetchContentSerial-stdout.txt index a293324..06f94e5 100644 --- a/Tests/RunCMake/DependencyProviders/RedirectFetchContentSerial-stdout.txt +++ b/Tests/RunCMake/DependencyProviders/RedirectFetchContentSerial-stdout.txt @@ -2,4 +2,4 @@ -- After cmake_language -- AThing_FOUND = 0 -- Redirecting FetchContent_MakeAvailable\(SomeDep\) to find_package\(\) --- Provider invoked for method FETCHCONTENT_MAKEAVAILABLE_SERIAL with args: SOURCE_DIR;.*/Tests/RunCMake/DependencyProviders;BINARY_DIR;.*/Tests/RunCMake/DependencyProviders/RedirectFetchContentSerial-build/_deps/somedep-build;SOURCE_SUBDIR;DoesNotExist +-- Provider invoked for method FETCHCONTENT_MAKEAVAILABLE_SERIAL with args: SOURCE_DIR;.*/Tests/RunCMake/DependencyProviders;BINARY_DIR;.*/Tests/RunCMake/DependencyProviders/RedirectFetchContentSerial-build/_deps/somedep-build;EXTERNALPROJECT_INTERNAL_ARGUMENT_SEPARATOR;SOURCE_SUBDIR;DoesNotExist |