From c31f09a1e6d94effc14f8bab5f9a441a306eed6d Mon Sep 17 00:00:00 2001 From: Martin Duffy Date: Wed, 22 Jul 2026 09:57:07 -0400 Subject: [PATCH] CMAKE_TEST_BUILD_DEPENDS: Use config when evaluating test dependency targets Fixes: #27979 --- Source/cmGlobalFastbuildGenerator.cxx | 3 ++- Source/cmGlobalNinjaGenerator.cxx | 2 +- Source/cmGlobalUnixMakefileGenerator3.cxx | 2 +- Source/cmTestGenerator.cxx | 4 ++-- Source/cmTestGenerator.h | 3 ++- Tests/RunCMake/add_test/RunCMakeTest.cmake | 12 ++++++++++++ ...stDependency-ON-file-generate-config.cmake | 19 +++++++++++++++++++ 7 files changed, 39 insertions(+), 6 deletions(-) create mode 100644 Tests/RunCMake/add_test/TestDependency-ON-file-generate-config.cmake diff --git a/Source/cmGlobalFastbuildGenerator.cxx b/Source/cmGlobalFastbuildGenerator.cxx index 84fc61ab3b..95cbefacd4 100644 --- a/Source/cmGlobalFastbuildGenerator.cxx +++ b/Source/cmGlobalFastbuildGenerator.cxx @@ -1607,7 +1607,8 @@ void cmGlobalFastbuildGenerator::WriteTestPrepTargets() auto const& testGenerators = localGen->GetMakefile()->GetTestGenerators(); for (auto const& tester : testGenerators) { cmTestGenerator::BuildDependencies testDeps; - if (!tester->GetBuildDependencies(localGen.get(), testDeps)) { + if (!tester->GetBuildDependencies(localGen.get(), std::string(), + testDeps)) { continue; } std::string const depName = diff --git a/Source/cmGlobalNinjaGenerator.cxx b/Source/cmGlobalNinjaGenerator.cxx index ccc1d16941..5336a49841 100644 --- a/Source/cmGlobalNinjaGenerator.cxx +++ b/Source/cmGlobalNinjaGenerator.cxx @@ -1313,7 +1313,7 @@ void cmGlobalNinjaGenerator::WriteTestPrepTargets() auto const& testGenerators = lg->GetMakefile()->GetTestGenerators(); for (auto const& tester : testGenerators) { cmTestGenerator::BuildDependencies testDeps; - if (!tester->GetBuildDependencies(lg, testDeps)) { + if (!tester->GetBuildDependencies(lg, config, testDeps)) { continue; } std::string const depName = this->ConvertToNinjaPath( diff --git a/Source/cmGlobalUnixMakefileGenerator3.cxx b/Source/cmGlobalUnixMakefileGenerator3.cxx index 4d25afb752..62517e2f9a 100644 --- a/Source/cmGlobalUnixMakefileGenerator3.cxx +++ b/Source/cmGlobalUnixMakefileGenerator3.cxx @@ -967,7 +967,7 @@ void cmGlobalUnixMakefileGenerator3::ComputeTestPrepTargets() for (auto const& lg : this->LocalGenerators) { for (auto const& tester : lg->GetMakefile()->GetTestGenerators()) { cmTestGenerator::BuildDependencies deps; - if (!tester->GetBuildDependencies(lg.get(), deps)) { + if (!tester->GetBuildDependencies(lg.get(), std::string(), deps)) { continue; } cmTest* test = tester->GetTest(); diff --git a/Source/cmTestGenerator.cxx b/Source/cmTestGenerator.cxx index 3fe5d13cb6..2666e87d81 100644 --- a/Source/cmTestGenerator.cxx +++ b/Source/cmTestGenerator.cxx @@ -115,6 +115,7 @@ cmTest* cmTestGenerator::GetTest() const } bool cmTestGenerator::GetBuildDependencies(cmLocalGenerator* lg, + std::string const& config, BuildDependencies& info) { if (this->Test == nullptr || @@ -128,7 +129,6 @@ bool cmTestGenerator::GetBuildDependencies(cmLocalGenerator* lg, // Get dependencies from generator expressions cmGeneratorExpression ge(*this->Test->GetMakefile()->GetCMakeInstance(), this->Test->GetBacktrace()); - std::string const config; for (std::string const& arg : this->Test->GetCommand()) { auto parsed = ge.Parse(arg); parsed->Evaluate(lg, config); @@ -304,7 +304,7 @@ void cmTestGenerator::GenerateScriptForConfig(std::ostream& os, ge.Parse(i.second)->Evaluate(this->LG, config)); } BuildDependencies deps; - if (this->GetBuildDependencies(this->LG, deps)) { + if (this->GetBuildDependencies(this->LG, config, deps)) { cmList depList; for (std::string const& dep : this->LG->GetGlobalGenerator()->GetTestBuildDependencyPaths(config, diff --git a/Source/cmTestGenerator.h b/Source/cmTestGenerator.h index 278db2eed0..2982f2bc57 100644 --- a/Source/cmTestGenerator.h +++ b/Source/cmTestGenerator.h @@ -52,7 +52,8 @@ public: cmTestGenerator& operator=(cmTestGenerator const&) = delete; void Compute(cmLocalGenerator* lg); - bool GetBuildDependencies(cmLocalGenerator* lg, BuildDependencies& deps); + bool GetBuildDependencies(cmLocalGenerator* lg, std::string const& config, + BuildDependencies& deps); /** Test if this generator installs the test for a given configuration. */ bool TestsForConfig(std::string const& config); diff --git a/Tests/RunCMake/add_test/RunCMakeTest.cmake b/Tests/RunCMake/add_test/RunCMakeTest.cmake index 7aa406f866..88c46bc8ef 100644 --- a/Tests/RunCMake/add_test/RunCMakeTest.cmake +++ b/Tests/RunCMake/add_test/RunCMakeTest.cmake @@ -122,6 +122,18 @@ if(RunCMake_GENERATOR MATCHES "Ninja|FASTBuild|Makefiles") set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/TestDependency-ON-build) run_testdependency_case(ON TRUE) + if(RunCMake_GENERATOR MATCHES "Ninja" AND RunCMake_GENERATOR_IS_MULTI_CONFIG) + block() + set(RunCMake_TEST_BINARY_DIR + ${RunCMake_BINARY_DIR}/TestDependency-ON-file-generate-config-build) + run_cmake(TestDependency-ON-file-generate-config) + set(RunCMake_TEST_NO_CLEAN 1) + run_cmake_command(TestDependency-ON-file-generate-config-build + ${CMAKE_COMMAND} --build . --config Debug + --target test_prep/FileGenerateConfigTest) + endblock() + endif() + set(RunCMake_TEST_OUTPUT_MERGE 1) set(RunCMake_TEST_NO_CLEAN 1) run_cmake_command(TestDependency-ON-all diff --git a/Tests/RunCMake/add_test/TestDependency-ON-file-generate-config.cmake b/Tests/RunCMake/add_test/TestDependency-ON-file-generate-config.cmake new file mode 100644 index 0000000000..60eb52eb42 --- /dev/null +++ b/Tests/RunCMake/add_test/TestDependency-ON-file-generate-config.cmake @@ -0,0 +1,19 @@ +cmake_minimum_required(VERSION 4.3) +set(CMAKE_TEST_BUILD_DEPENDS ON) + +project(TestDependencyFileGenerateConfig C) + +enable_testing() + +add_executable(TestDependencyGenexFileGenerate main.c) + +set(rc_file + "${CMAKE_CURRENT_BINARY_DIR}/gen/TestDependencyGenexFileGenerate/$/version.rc") +file(GENERATE + OUTPUT "${rc_file}" + CONTENT "// Config: $\n1 RCDATA { \"$\" }\n" + TARGET TestDependencyGenexFileGenerate) +target_sources(TestDependencyGenexFileGenerate PRIVATE "${rc_file}") + +add_test(NAME FileGenerateConfigTest + COMMAND $)