diff options
26 files changed, 213 insertions, 18 deletions
diff --git a/Modules/Compiler/Clang.cmake b/Modules/Compiler/Clang.cmake index 4f8a9b7..2452d5e 100644 --- a/Modules/Compiler/Clang.cmake +++ b/Modules/Compiler/Clang.cmake @@ -95,11 +95,11 @@ else() endif() set(CMAKE_${lang}_ARCHIVE_CREATE_IPO - "\"${__ar}\" cr <TARGET> <LINK_FLAGS> <OBJECTS>" + "\"${__ar}\" qc <TARGET> <LINK_FLAGS> <OBJECTS>" ) set(CMAKE_${lang}_ARCHIVE_APPEND_IPO - "\"${__ar}\" r <TARGET> <LINK_FLAGS> <OBJECTS>" + "\"${__ar}\" q <TARGET> <LINK_FLAGS> <OBJECTS>" ) set(CMAKE_${lang}_ARCHIVE_FINISH_IPO diff --git a/Modules/Compiler/GNU.cmake b/Modules/Compiler/GNU.cmake index 88c8997..138bb4b 100644 --- a/Modules/Compiler/GNU.cmake +++ b/Modules/Compiler/GNU.cmake @@ -168,11 +168,11 @@ macro(__compiler_gnu lang) # # [1]: https://gcc.gnu.org/onlinedocs/gcc-4.9.4/gcc/Optimize-Options.html set(CMAKE_${lang}_ARCHIVE_CREATE_IPO - "\"${CMAKE_${lang}_COMPILER_AR}\" cr <TARGET> <LINK_FLAGS> <OBJECTS>" + "\"${CMAKE_${lang}_COMPILER_AR}\" qc <TARGET> <LINK_FLAGS> <OBJECTS>" ) set(CMAKE_${lang}_ARCHIVE_APPEND_IPO - "\"${CMAKE_${lang}_COMPILER_AR}\" r <TARGET> <LINK_FLAGS> <OBJECTS>" + "\"${CMAKE_${lang}_COMPILER_AR}\" q <TARGET> <LINK_FLAGS> <OBJECTS>" ) set(CMAKE_${lang}_ARCHIVE_FINISH_IPO diff --git a/Modules/Compiler/IBMClang.cmake b/Modules/Compiler/IBMClang.cmake index 169a0f0..a43f788 100644 --- a/Modules/Compiler/IBMClang.cmake +++ b/Modules/Compiler/IBMClang.cmake @@ -58,11 +58,11 @@ macro(__compiler_ibmclang lang) set(__ranlib "${CMAKE_${lang}_COMPILER_RANLIB}") set(CMAKE_${lang}_ARCHIVE_CREATE_IPO - "\"${__ar}\" cr <TARGET> <LINK_FLAGS> <OBJECTS>" + "\"${__ar}\" qc <TARGET> <LINK_FLAGS> <OBJECTS>" ) set(CMAKE_${lang}_ARCHIVE_APPEND_IPO - "\"${__ar}\" r <TARGET> <LINK_FLAGS> <OBJECTS>" + "\"${__ar}\" q <TARGET> <LINK_FLAGS> <OBJECTS>" ) set(CMAKE_${lang}_ARCHIVE_FINISH_IPO diff --git a/Modules/Compiler/IntelLLVM.cmake b/Modules/Compiler/IntelLLVM.cmake index a58128a..5afb1ce 100644 --- a/Modules/Compiler/IntelLLVM.cmake +++ b/Modules/Compiler/IntelLLVM.cmake @@ -19,8 +19,8 @@ set(__pch_header_OBJCXX "objective-c++-header") macro(__compiler_intel_llvm_common lang) set(_CMAKE_${lang}_IPO_SUPPORTED_BY_CMAKE YES) set(_CMAKE_${lang}_IPO_MAY_BE_SUPPORTED_BY_COMPILER YES) - set(CMAKE_${lang}_ARCHIVE_CREATE_IPO "\"${CMAKE_${lang}_COMPILER_AR}\" cr <TARGET> <LINK_FLAGS> <OBJECTS>") - set(CMAKE_${lang}_ARCHIVE_APPEND_IPO "\"${CMAKE_${lang}_COMPILER_AR}\" r <TARGET> <LINK_FLAGS> <OBJECTS>") + set(CMAKE_${lang}_ARCHIVE_CREATE_IPO "\"${CMAKE_${lang}_COMPILER_AR}\" qc <TARGET> <LINK_FLAGS> <OBJECTS>") + set(CMAKE_${lang}_ARCHIVE_APPEND_IPO "\"${CMAKE_${lang}_COMPILER_AR}\" q <TARGET> <LINK_FLAGS> <OBJECTS>") set(CMAKE_${lang}_ARCHIVE_FINISH_IPO "\"${CMAKE_${lang}_COMPILER_RANLIB}\" <TARGET>") endmacro() diff --git a/Modules/Compiler/LCC.cmake b/Modules/Compiler/LCC.cmake index f8c2084..2892ec6 100644 --- a/Modules/Compiler/LCC.cmake +++ b/Modules/Compiler/LCC.cmake @@ -65,11 +65,11 @@ macro(__compiler_lcc lang) set(CMAKE_${lang}_COMPILE_OPTIONS_IPO ${__lto_flags}) set(CMAKE_${lang}_ARCHIVE_CREATE_IPO - "\"${CMAKE_${lang}_COMPILER_AR}\" cr <TARGET> <LINK_FLAGS> <OBJECTS>" + "\"${CMAKE_${lang}_COMPILER_AR}\" qc <TARGET> <LINK_FLAGS> <OBJECTS>" ) set(CMAKE_${lang}_ARCHIVE_APPEND_IPO - "\"${CMAKE_${lang}_COMPILER_AR}\" r <TARGET> <LINK_FLAGS> <OBJECTS>" + "\"${CMAKE_${lang}_COMPILER_AR}\" q <TARGET> <LINK_FLAGS> <OBJECTS>" ) set(CMAKE_${lang}_ARCHIVE_FINISH_IPO diff --git a/Source/cmCxxModuleMapper.cxx b/Source/cmCxxModuleMapper.cxx index f45c011..b6b9540 100644 --- a/Source/cmCxxModuleMapper.cxx +++ b/Source/cmCxxModuleMapper.cxx @@ -305,7 +305,7 @@ cm::static_string_view CxxModuleMapExtension( std::set<std::string> CxxModuleUsageSeed( CxxModuleLocations const& loc, std::vector<cmScanDepInfo> const& objects, - CxxModuleUsage& usages) + CxxModuleUsage& usages, bool& private_usage_found) { // Track inner usages to populate usages from internal bits. // @@ -334,6 +334,7 @@ std::set<std::string> CxxModuleUsageSeed( cmStrCat("Unable to use module '", r.LogicalName, "' as it is 'PRIVATE' and therefore not accessible outside " "of its owning target.")); + private_usage_found = true; continue; } diff --git a/Source/cmCxxModuleMapper.h b/Source/cmCxxModuleMapper.h index 34111f7..c785099 100644 --- a/Source/cmCxxModuleMapper.h +++ b/Source/cmCxxModuleMapper.h @@ -93,7 +93,7 @@ cm::static_string_view CxxModuleMapExtension( // import cycle). std::set<std::string> CxxModuleUsageSeed( CxxModuleLocations const& loc, std::vector<cmScanDepInfo> const& objects, - CxxModuleUsage& usages); + CxxModuleUsage& usages, bool& private_usage_found); // Return the contents of the module map in the given format for the // object file. diff --git a/Source/cmGlobalNinjaGenerator.cxx b/Source/cmGlobalNinjaGenerator.cxx index 74a6bea..f018a8c 100644 --- a/Source/cmGlobalNinjaGenerator.cxx +++ b/Source/cmGlobalNinjaGenerator.cxx @@ -2742,7 +2742,9 @@ bool cmGlobalNinjaGenerator::WriteDyndepFile( // Insert information about the current target's modules. if (modmap_fmt) { - auto cycle_modules = CxxModuleUsageSeed(locs, objects, usages); + bool private_usage_found = false; + auto cycle_modules = + CxxModuleUsageSeed(locs, objects, usages, private_usage_found); if (!cycle_modules.empty()) { cmSystemTools::Error( cmStrCat("Circular dependency detected in the C++ module import " @@ -2750,6 +2752,10 @@ bool cmGlobalNinjaGenerator::WriteDyndepFile( cmJoin(cycle_modules, R"(", ")"_s), '"')); return false; } + if (private_usage_found) { + // Already errored in the function. + return false; + } } cmNinjaBuild build("dyndep"); @@ -2786,6 +2792,7 @@ bool cmGlobalNinjaGenerator::WriteDyndepFile( // `cmNinjaTargetGenerator::ExportObjectCompileCommand` to generate the // corresponding file path. cmGeneratedFileStream mmf(cmStrCat(object.PrimaryOutput, ".modmap")); + mmf.SetCopyIfDifferent(true); mmf << mm; } @@ -2875,6 +2882,7 @@ bool cmGlobalNinjaGenerator::WriteDyndepFile( } cmGeneratedFileStream tmf(target_mods_file); + tmf.SetCopyIfDifferent(true); tmf << target_module_info; cmDyndepMetadataCallbacks cb; diff --git a/Source/cmNinjaTargetGenerator.cxx b/Source/cmNinjaTargetGenerator.cxx index 45ed0ab..a465b08 100644 --- a/Source/cmNinjaTargetGenerator.cxx +++ b/Source/cmNinjaTargetGenerator.cxx @@ -815,6 +815,11 @@ void cmNinjaTargetGenerator::WriteCompileRule(const std::string& lang, // dyndep rules rule.RspFile = "$out.rsp"; rule.RspContent = "$in"; + // Ninja's collator writes all outputs using `cmGeneratedFileStream`, so + // they are only updated if contents actually change. Avoid running + // dependent jobs if the contents don't change by telling `ninja` to check + // the timestamp again. + rule.Restat = "1"; // Run CMake dependency scanner on the source file (using the preprocessed // source if that was performed). @@ -1222,11 +1227,13 @@ void cmNinjaTargetGenerator::WriteObjectBuildStatements( cmNinjaBuild build(this->LanguageDyndepRule(language, config)); build.Outputs.push_back(this->GetDyndepFilePath(language, config)); - build.ImplicitOuts.push_back( + build.ImplicitOuts.emplace_back( cmStrCat(this->Makefile->GetCurrentBinaryDirectory(), '/', this->LocalGenerator->GetTargetDirectory(this->GeneratorTarget), this->GetGlobalGenerator()->ConfigDirectory(config), '/', language, "Modules.json")); + build.ImplicitDeps.emplace_back( + this->GetTargetDependInfoPath(language, config)); for (auto const& scanFiles : scanningFiles) { if (!scanFiles.ScanningOutput.empty()) { build.ExplicitDeps.push_back(scanFiles.ScanningOutput); @@ -1241,10 +1248,12 @@ void cmNinjaTargetGenerator::WriteObjectBuildStatements( auto const linked_directories = this->GetLinkedTargetDirectories(language, config); for (std::string const& l : linked_directories.Direct) { - build.ImplicitDeps.push_back(cmStrCat(l, '/', language, "Modules.json")); + build.ImplicitDeps.emplace_back( + cmStrCat(l, '/', language, "Modules.json")); } for (std::string const& l : linked_directories.Forward) { - build.ImplicitDeps.push_back(cmStrCat(l, '/', language, "Modules.json")); + build.ImplicitDeps.emplace_back( + cmStrCat(l, '/', language, "Modules.json")); } this->GetGlobalGenerator()->WriteBuild(this->GetImplFileStream(fileConfig), @@ -1639,7 +1648,7 @@ void cmNinjaTargetGenerator::WriteObjectBuildStatement( // corresponding file path. std::string ddModmapFile = cmStrCat(objectFileName, ".modmap"); vars["DYNDEP_MODULE_MAP_FILE"] = ddModmapFile; - objBuild.OrderOnlyDeps.push_back(ddModmapFile); + objBuild.ImplicitDeps.push_back(ddModmapFile); scanningFiles.ModuleMapFile = std::move(ddModmapFile); } diff --git a/Tests/CommandLength/CMakeLists.txt b/Tests/CommandLength/CMakeLists.txt index 6836051..8d75172 100644 --- a/Tests/CommandLength/CMakeLists.txt +++ b/Tests/CommandLength/CMakeLists.txt @@ -10,7 +10,10 @@ set(msg "${msg} ${msg}") set(msg "${msg} ${msg}") set(msg "${msg} ${msg}") set(msg "${msg} ${msg}") -foreach(i RANGE 1 1000) +set(msg "${msg} ${msg}") +set(msg "${msg} ${msg}") +set(msg "${msg} ${msg}") +foreach(i RANGE 1 125) add_custom_command(TARGET CommandLength POST_BUILD VERBATIM COMMAND ${CMAKE_COMMAND} -E echo "${i} ${msg}" > log/${i} ) diff --git a/Tests/RunCMake/CXXModules/RunCMakeTest.cmake b/Tests/RunCMake/CXXModules/RunCMakeTest.cmake index 2a93aeb..421c509 100644 --- a/Tests/RunCMake/CXXModules/RunCMakeTest.cmake +++ b/Tests/RunCMake/CXXModules/RunCMakeTest.cmake @@ -147,6 +147,12 @@ function (run_cxx_module_test directory) if (NOT RunCMake_CXXModules_NO_TEST) run_cmake_command("examples/${test_name}-test" "${CMAKE_CTEST_COMMAND}" -C Debug --output-on-failure) endif () + if (RunCMake_CXXModules_REBUILD) + execute_process(COMMAND ${CMAKE_COMMAND} -E sleep 1.125) # handle 1s resolution + include("${RunCMake_TEST_SOURCE_DIR}/pre-rebuild.cmake") + execute_process(COMMAND ${CMAKE_COMMAND} -E sleep 1.125) # handle 1s resolution + run_cmake_command("examples/${test_name}-rebuild" "${CMAKE_COMMAND}" --build . --config Debug) + endif () endfunction () function (run_cxx_module_test_target directory target) @@ -155,6 +161,13 @@ function (run_cxx_module_test_target directory target) run_cxx_module_test("${directory}" ${ARGN}) endfunction () +function (run_cxx_module_test_rebuild directory) + set(RunCMake_CXXModules_INSTALL 0) + set(RunCMake_CXXModules_NO_TEST 1) + set(RunCMake_CXXModules_REBUILD 1) + run_cxx_module_test("${directory}" ${ARGN}) +endfunction () + string(REPLACE "," ";" CMake_TEST_MODULE_COMPILATION "${CMake_TEST_MODULE_COMPILATION}") if (RunCMake_GENERATOR MATCHES "Ninja") @@ -202,6 +215,11 @@ if ("collation" IN_LIST CMake_TEST_MODULE_COMPILATION) set(RunCMake_CXXModules_NO_TEST 1) run_cxx_module_test(req-private-other-target) unset(RunCMake_CXXModules_NO_TEST) + run_cxx_module_test_rebuild(depchain-modmap) + run_cxx_module_test_rebuild(depchain-modules-json-file) + if (RunCMake_GENERATOR MATCHES "Ninja") + run_cxx_module_test_rebuild(depchain-collation-restat) + endif () endif () # Tests which use named modules in shared libraries. diff --git a/Tests/RunCMake/CXXModules/examples/depchain-collation-restat-rebuild-check.cmake b/Tests/RunCMake/CXXModules/examples/depchain-collation-restat-rebuild-check.cmake new file mode 100644 index 0000000..46c1d29 --- /dev/null +++ b/Tests/RunCMake/CXXModules/examples/depchain-collation-restat-rebuild-check.cmake @@ -0,0 +1,12 @@ +if (RunCMake_GENERATOR_IS_MULTI_CONFIG) + set(dep_collation_restat "CMakeFiles/depchain_collation_restat.dir/Debug/main.cxx${CMAKE_CXX_OUTPUT_EXTENSION}") + set(collation_restat "CMakeFiles/depchain_with_collation_restat.dir/Debug/CXXModules.json") +else () + set(dep_collation_restat "CMakeFiles/depchain_collation_restat.dir/main.cxx${CMAKE_CXX_OUTPUT_EXTENSION}") + set(collation_restat "CMakeFiles/depchain_with_collation_restat.dir/CXXModules.json") +endif () + +if (NOT "${RunCMake_TEST_BINARY_DIR}/${collation_restat}" IS_NEWER_THAN "${RunCMake_TEST_BINARY_DIR}/${dep_collation_restat}") + list(APPEND RunCMake_TEST_FAILED + "Object '${dep_collation_restat}' should not have recompiled if '${collation_restat}' did not change content.") +endif () diff --git a/Tests/RunCMake/CXXModules/examples/depchain-collation-restat/CMakeLists.txt b/Tests/RunCMake/CXXModules/examples/depchain-collation-restat/CMakeLists.txt new file mode 100644 index 0000000..54df83a --- /dev/null +++ b/Tests/RunCMake/CXXModules/examples/depchain-collation-restat/CMakeLists.txt @@ -0,0 +1,23 @@ +cmake_minimum_required(VERSION 3.28) +project(cxx_modules_depchain_collation_restat CXX) + +include("${CMAKE_SOURCE_DIR}/../cxx-modules-rules.cmake") + +add_library(depchain_with_collation_restat) +target_sources(depchain_with_collation_restat + PUBLIC + FILE_SET CXX_MODULES + BASE_DIRS + "${CMAKE_CURRENT_SOURCE_DIR}" + FILES + importable.cxx) +target_compile_features(depchain_with_collation_restat PUBLIC cxx_std_20) + +add_executable(depchain_collation_restat) +target_sources(depchain_collation_restat + PRIVATE + main.cxx) +target_link_libraries(depchain_collation_restat + PRIVATE + depchain_with_collation_restat) +add_test(NAME depchain_collation_restat COMMAND depchain_collation_restat) diff --git a/Tests/RunCMake/CXXModules/examples/depchain-collation-restat/importable.cxx b/Tests/RunCMake/CXXModules/examples/depchain-collation-restat/importable.cxx new file mode 100644 index 0000000..607680a --- /dev/null +++ b/Tests/RunCMake/CXXModules/examples/depchain-collation-restat/importable.cxx @@ -0,0 +1,6 @@ +export module importable; + +export int from_import() +{ + return 0; +} diff --git a/Tests/RunCMake/CXXModules/examples/depchain-collation-restat/main.cxx b/Tests/RunCMake/CXXModules/examples/depchain-collation-restat/main.cxx new file mode 100644 index 0000000..feb38d2 --- /dev/null +++ b/Tests/RunCMake/CXXModules/examples/depchain-collation-restat/main.cxx @@ -0,0 +1,6 @@ +import importable; + +int main(int argc, char* argv[]) +{ + return from_import(); +} diff --git a/Tests/RunCMake/CXXModules/examples/depchain-collation-restat/pre-rebuild.cmake b/Tests/RunCMake/CXXModules/examples/depchain-collation-restat/pre-rebuild.cmake new file mode 100644 index 0000000..e1ff979 --- /dev/null +++ b/Tests/RunCMake/CXXModules/examples/depchain-collation-restat/pre-rebuild.cmake @@ -0,0 +1,7 @@ +if (RunCMake_GENERATOR_IS_MULTI_CONFIG) + set(collation_restat "CMakeFiles/depchain_with_collation_restat.dir/Debug/CXXModules.json") +else () + set(collation_restat "CMakeFiles/depchain_with_collation_restat.dir/CXXModules.json") +endif () + +file(TOUCH_NOCREATE "${RunCMake_TEST_BINARY_DIR}/${collation_restat}") diff --git a/Tests/RunCMake/CXXModules/examples/depchain-modmap-rebuild-check.cmake b/Tests/RunCMake/CXXModules/examples/depchain-modmap-rebuild-check.cmake new file mode 100644 index 0000000..1596632 --- /dev/null +++ b/Tests/RunCMake/CXXModules/examples/depchain-modmap-rebuild-check.cmake @@ -0,0 +1,11 @@ +if (RunCMake_GENERATOR_IS_MULTI_CONFIG) + set(object_path "CMakeFiles/depchain_modmap.dir/Debug/main.cxx${CMAKE_CXX_OUTPUT_EXTENSION}") +else () + set(object_path "CMakeFiles/depchain_modmap.dir/main.cxx${CMAKE_CXX_OUTPUT_EXTENSION}") +endif () +set(modmap_path "${object_path}.modmap") + +if ("${RunCMake_TEST_BINARY_DIR}/${modmap_path}" IS_NEWER_THAN "${RunCMake_TEST_BINARY_DIR}/${object_path}") + list(APPEND RunCMake_TEST_FAILED + "Object '${object_path}' should have recompiled if '${modmap_path}' changed.") +endif () diff --git a/Tests/RunCMake/CXXModules/examples/depchain-modmap/CMakeLists.txt b/Tests/RunCMake/CXXModules/examples/depchain-modmap/CMakeLists.txt new file mode 100644 index 0000000..11712e9 --- /dev/null +++ b/Tests/RunCMake/CXXModules/examples/depchain-modmap/CMakeLists.txt @@ -0,0 +1,18 @@ +cmake_minimum_required(VERSION 3.28) +project(cxx_modules_depchain_modmap CXX) + +include("${CMAKE_SOURCE_DIR}/../cxx-modules-rules.cmake") + +add_executable(depchain_modmap) +target_sources(depchain_modmap + PRIVATE + main.cxx + PRIVATE + FILE_SET CXX_MODULES + BASE_DIRS + "${CMAKE_CURRENT_SOURCE_DIR}" + FILES + importable.cxx) +target_compile_features(depchain_modmap PUBLIC cxx_std_20) + +add_test(NAME depchain_modmap COMMAND depchain_modmap) diff --git a/Tests/RunCMake/CXXModules/examples/depchain-modmap/importable.cxx b/Tests/RunCMake/CXXModules/examples/depchain-modmap/importable.cxx new file mode 100644 index 0000000..607680a --- /dev/null +++ b/Tests/RunCMake/CXXModules/examples/depchain-modmap/importable.cxx @@ -0,0 +1,6 @@ +export module importable; + +export int from_import() +{ + return 0; +} diff --git a/Tests/RunCMake/CXXModules/examples/depchain-modmap/main.cxx b/Tests/RunCMake/CXXModules/examples/depchain-modmap/main.cxx new file mode 100644 index 0000000..feb38d2 --- /dev/null +++ b/Tests/RunCMake/CXXModules/examples/depchain-modmap/main.cxx @@ -0,0 +1,6 @@ +import importable; + +int main(int argc, char* argv[]) +{ + return from_import(); +} diff --git a/Tests/RunCMake/CXXModules/examples/depchain-modmap/pre-rebuild.cmake b/Tests/RunCMake/CXXModules/examples/depchain-modmap/pre-rebuild.cmake new file mode 100644 index 0000000..f434cbe --- /dev/null +++ b/Tests/RunCMake/CXXModules/examples/depchain-modmap/pre-rebuild.cmake @@ -0,0 +1,7 @@ +if (RunCMake_GENERATOR_IS_MULTI_CONFIG) + set(modmap_path "CMakeFiles/depchain_modmap.dir/Debug/main.cxx${CMAKE_CXX_OUTPUT_EXTENSION}.modmap") +else () + set(modmap_path "CMakeFiles/depchain_modmap.dir/main.cxx${CMAKE_CXX_OUTPUT_EXTENSION}.modmap") +endif () + +file(TOUCH_NOCREATE "${RunCMake_TEST_BINARY_DIR}/${modmap_path}") diff --git a/Tests/RunCMake/CXXModules/examples/depchain-modules-json-file-rebuild-check.cmake b/Tests/RunCMake/CXXModules/examples/depchain-modules-json-file-rebuild-check.cmake new file mode 100644 index 0000000..94e833a --- /dev/null +++ b/Tests/RunCMake/CXXModules/examples/depchain-modules-json-file-rebuild-check.cmake @@ -0,0 +1,12 @@ +if (RunCMake_GENERATOR_IS_MULTI_CONFIG) + set(dep_modules_json_path "CMakeFiles/depchain_modules_json_file.dir/Debug/CXX.dd") + set(modules_json_path "CMakeFiles/depchain_with_modules_json_file.dir/Debug/CXXModules.json") +else () + set(dep_modules_json_path "CMakeFiles/depchain_modules_json_file.dir/CXX.dd") + set(modules_json_path "CMakeFiles/depchain_with_modules_json_file.dir/CXXModules.json") +endif () + +if ("${RunCMake_TEST_BINARY_DIR}/${modules_json_path}" IS_NEWER_THAN "${RunCMake_TEST_BINARY_DIR}/${dep_modules_json_path}") + list(APPEND RunCMake_TEST_FAILED + "Object '${dep_modules_json_path}' should have recompiled if '${modules_json_path}' changed.") +endif () diff --git a/Tests/RunCMake/CXXModules/examples/depchain-modules-json-file/CMakeLists.txt b/Tests/RunCMake/CXXModules/examples/depchain-modules-json-file/CMakeLists.txt new file mode 100644 index 0000000..9828ee6 --- /dev/null +++ b/Tests/RunCMake/CXXModules/examples/depchain-modules-json-file/CMakeLists.txt @@ -0,0 +1,23 @@ +cmake_minimum_required(VERSION 3.28) +project(cxx_modules_depchain_modules_json_file CXX) + +include("${CMAKE_SOURCE_DIR}/../cxx-modules-rules.cmake") + +add_library(depchain_with_modules_json_file) +target_sources(depchain_with_modules_json_file + PUBLIC + FILE_SET CXX_MODULES + BASE_DIRS + "${CMAKE_CURRENT_SOURCE_DIR}" + FILES + importable.cxx) +target_compile_features(depchain_with_modules_json_file PUBLIC cxx_std_20) + +add_executable(depchain_modules_json_file) +target_sources(depchain_modules_json_file + PRIVATE + main.cxx) +target_link_libraries(depchain_modules_json_file + PRIVATE + depchain_with_modules_json_file) +add_test(NAME depchain_modules_json_file COMMAND depchain_modules_json_file) diff --git a/Tests/RunCMake/CXXModules/examples/depchain-modules-json-file/importable.cxx b/Tests/RunCMake/CXXModules/examples/depchain-modules-json-file/importable.cxx new file mode 100644 index 0000000..607680a --- /dev/null +++ b/Tests/RunCMake/CXXModules/examples/depchain-modules-json-file/importable.cxx @@ -0,0 +1,6 @@ +export module importable; + +export int from_import() +{ + return 0; +} diff --git a/Tests/RunCMake/CXXModules/examples/depchain-modules-json-file/main.cxx b/Tests/RunCMake/CXXModules/examples/depchain-modules-json-file/main.cxx new file mode 100644 index 0000000..feb38d2 --- /dev/null +++ b/Tests/RunCMake/CXXModules/examples/depchain-modules-json-file/main.cxx @@ -0,0 +1,6 @@ +import importable; + +int main(int argc, char* argv[]) +{ + return from_import(); +} diff --git a/Tests/RunCMake/CXXModules/examples/depchain-modules-json-file/pre-rebuild.cmake b/Tests/RunCMake/CXXModules/examples/depchain-modules-json-file/pre-rebuild.cmake new file mode 100644 index 0000000..9c3f2ff --- /dev/null +++ b/Tests/RunCMake/CXXModules/examples/depchain-modules-json-file/pre-rebuild.cmake @@ -0,0 +1,7 @@ +if (RunCMake_GENERATOR_IS_MULTI_CONFIG) + set(modules_json_path "CMakeFiles/depchain_with_modules_json_file.dir/Debug/CXXModules.json") +else () + set(modules_json_path "CMakeFiles/depchain_with_modules_json_file.dir/CXXModules.json") +endif () + +file(TOUCH_NOCREATE "${RunCMake_TEST_BINARY_DIR}/${modules_json_path}") |