From 23f1cb47c72897cb53336a15e5de84b1206c0307 Mon Sep 17 00:00:00 2001 From: Matthew Woehlke Date: Wed, 2 Sep 2026 13:36:50 -0400 Subject: [PATCH] cmTarget: Don't crash on empty IMPORTED_CONFIGURATIONS The logic to select an imported configuration handled the case when `IMPORTED_CONFIGURATIONS` was missing, but assumed that if it was present, it was non-empty, which could cause CMake to crash if that happens. (To be fair, I believe this would never happen for imports generated by CMake.) Adjust the logic slightly to follow the same code path when `IMPORTED_CONFIGURATIONS` is empty as is taken if it's missing. Fixes: #28065 --- Source/cmTarget.cxx | 3 ++- .../Empty-IMPORTED_CONFIGURATIONS-result.txt | 1 + .../Empty-IMPORTED_CONFIGURATIONS-stderr.txt | 6 ++++++ .../Empty-IMPORTED_CONFIGURATIONS.cmake | 7 +++++++ Tests/RunCMake/GeneratorExpression/RunCMakeTest.cmake | 2 ++ 5 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 Tests/RunCMake/GeneratorExpression/Empty-IMPORTED_CONFIGURATIONS-result.txt create mode 100644 Tests/RunCMake/GeneratorExpression/Empty-IMPORTED_CONFIGURATIONS-stderr.txt create mode 100644 Tests/RunCMake/GeneratorExpression/Empty-IMPORTED_CONFIGURATIONS.cmake diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index 87599a2903..a1f69cd9ba 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -3580,7 +3580,8 @@ bool cmTarget::GetMappedConfigNew(std::string desiredConfig, cmValue& loc, } // Get imported configurations, if specified. - if (cmValue iconfigs = this->GetProperty("IMPORTED_CONFIGURATIONS")) { + cmValue const iconfigs = this->GetProperty("IMPORTED_CONFIGURATIONS"); + if (!iconfigs.IsEmpty()) { cmList const availableConfigs{ cmSystemTools::UpperCase(*iconfigs) }; if (!mappedConfigs.empty()) { diff --git a/Tests/RunCMake/GeneratorExpression/Empty-IMPORTED_CONFIGURATIONS-result.txt b/Tests/RunCMake/GeneratorExpression/Empty-IMPORTED_CONFIGURATIONS-result.txt new file mode 100644 index 0000000000..d00491fd7e --- /dev/null +++ b/Tests/RunCMake/GeneratorExpression/Empty-IMPORTED_CONFIGURATIONS-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/GeneratorExpression/Empty-IMPORTED_CONFIGURATIONS-stderr.txt b/Tests/RunCMake/GeneratorExpression/Empty-IMPORTED_CONFIGURATIONS-stderr.txt new file mode 100644 index 0000000000..c5ac1d21f7 --- /dev/null +++ b/Tests/RunCMake/GeneratorExpression/Empty-IMPORTED_CONFIGURATIONS-stderr.txt @@ -0,0 +1,6 @@ +(CMake Error in CMakeLists.txt: + IMPORTED_LOCATION not set for imported target "imported"( configuration + "[A-Za-z]+")?\. + +)+ +CMake Generate step failed\. Build files cannot be regenerated correctly\. diff --git a/Tests/RunCMake/GeneratorExpression/Empty-IMPORTED_CONFIGURATIONS.cmake b/Tests/RunCMake/GeneratorExpression/Empty-IMPORTED_CONFIGURATIONS.cmake new file mode 100644 index 0000000000..918a4b3214 --- /dev/null +++ b/Tests/RunCMake/GeneratorExpression/Empty-IMPORTED_CONFIGURATIONS.cmake @@ -0,0 +1,7 @@ +cmake_minimum_required(VERSION 4.4) +project(empty_imported_configuration NONE) + +add_library(imported UNKNOWN IMPORTED) +set_property(TARGET imported PROPERTY IMPORTED_CONFIGURATIONS "") + +file(GENERATE OUTPUT out.txt CONTENT "$") diff --git a/Tests/RunCMake/GeneratorExpression/RunCMakeTest.cmake b/Tests/RunCMake/GeneratorExpression/RunCMakeTest.cmake index c826e5da99..86ef5405a1 100644 --- a/Tests/RunCMake/GeneratorExpression/RunCMakeTest.cmake +++ b/Tests/RunCMake/GeneratorExpression/RunCMakeTest.cmake @@ -160,6 +160,8 @@ run_cmake_build(CMP0200-NEW) run_cmake_build(CMP0199-NEW+CMP0200-NEW) +run_cmake(Empty-IMPORTED_CONFIGURATIONS) + set(RunCMake_TEST_OPTIONS -DCMAKE_POLICY_DEFAULT_CMP0085:STRING=OLD) run_cmake(CMP0085-OLD) unset(RunCMake_TEST_OPTIONS)