Răsfoiți Sursa

Ninja Multi-Config: Restore TARGET_OBJECTS support in cross-configs

Since commit 2ae72ef74b (Xcode: Enable multi-arch TARGET_OBJECTS genex
in [INTERFACE_]LINK_LIBRARIES, 2021-05-26, v3.21.0-rc1~126^2) the
TARGET_OBJECTS genex, when referenced for linking, is now evaluated with
EvaluateForBuildsystem enabled.  This causes the object file paths to be
computed with a buildsystem-specific placeholder for the configuration.

This is normally fine because the placeholder will be evaluated by the
native buildsystem tool using the proper configuration.  However, the
Ninja Multi-Config generator's `${CONFIGURATION}` placeholder may not
have the correct value for cross-config object files.  Switch back to
using the per-config location of each object file for this generator.

Fixes: #22436
Brad King 4 ani în urmă
părinte
comite
cb777dd81e

+ 1 - 1
Source/cmGeneratorExpressionNode.cxx

@@ -1665,7 +1665,7 @@ static const struct TargetObjectsNode : public cmGeneratorExpressionNode
       gt->GetTargetObjectNames(context->Config, objects);
 
       std::string obj_dir;
-      if (context->EvaluateForBuildsystem) {
+      if (context->EvaluateForBuildsystem && !gg->SupportsCrossConfigs()) {
         // Use object file directory with buildsystem placeholder.
         obj_dir = gt->ObjectDirectory;
         context->HadContextSensitiveCondition =

+ 2 - 0
Tests/RunCMake/NinjaMultiConfig/RunCMakeTest.cmake

@@ -100,6 +100,8 @@ run_ninja(Simple release-file build-Release.ninja ${simpleexe_Release})
 run_cmake_build(Simple all-configs Release simplestatic:all)
 run_ninja(Simple default-build-file build.ninja simpleexe)
 run_cmake_build(Simple all-clean Release clean:all)
+run_ninja(Simple debug-in-release-graph-target build-Release.ninja simpleexe2:Debug)
+run_cmake_build(Simple all-clean Release clean:all)
 run_cmake_build(Simple debug-subdir Debug SimpleSubdir/all)
 run_ninja(Simple release-in-minsizerel-graph-subdir build-MinSizeRel.ninja SimpleSubdir/all:Release)
 run_cmake_build(Simple all-subdir Release SimpleSubdir/all:all)

+ 37 - 0
Tests/RunCMake/NinjaMultiConfig/Simple-debug-in-release-graph-target-ninja-check.cmake

@@ -0,0 +1,37 @@
+check_files("${RunCMake_TEST_BINARY_DIR}"
+  INCLUDE
+    ${GENERATED_FILES}
+
+    ${TARGET_FILE_simpleexe2_Debug}
+    ${TARGET_OBJECT_FILES_simpleexe2_Debug}
+
+    ${TARGET_FILE_simpleshared_Debug}
+    ${TARGET_LINKER_FILE_simpleshared_Debug}
+    ${TARGET_OBJECT_FILES_simpleshared_Debug}
+
+    ${TARGET_OBJECT_FILES_simpleobj_Debug}
+
+  EXCLUDE
+    ${TARGET_FILE_simpleexe_Debug}
+
+    ${TARGET_OBJECT_FILES_simpleexe_Debug}
+    ${TARGET_OBJECT_FILES_simplestatic_Debug}
+
+    ${TARGET_OBJECT_FILES_simpleexe_Release}
+    ${TARGET_OBJECT_FILES_simpleexe2_Release}
+    ${TARGET_OBJECT_FILES_simpleshared_Release}
+    ${TARGET_OBJECT_FILES_simplestatic_Release}
+    ${TARGET_OBJECT_FILES_simpleobj_Release}
+
+    ${TARGET_OBJECT_FILES_simpleexe_MinSizeRel}
+    ${TARGET_OBJECT_FILES_simpleexe2_MinSizeRel}
+    ${TARGET_OBJECT_FILES_simpleshared_MinSizeRel}
+    ${TARGET_OBJECT_FILES_simplestatic_MinSizeRel}
+    ${TARGET_OBJECT_FILES_simpleobj_MinSizeRel}
+
+    ${TARGET_OBJECT_FILES_simpleexe_RelWithDebInfo}
+    ${TARGET_OBJECT_FILES_simpleexe2_RelWithDebInfo}
+    ${TARGET_OBJECT_FILES_simpleshared_RelWithDebInfo}
+    ${TARGET_OBJECT_FILES_simplestatic_RelWithDebInfo}
+    ${TARGET_OBJECT_FILES_simpleobj_RelWithDebInfo}
+  )

+ 1 - 1
Tests/RunCMake/NinjaMultiConfig/Simple.cmake

@@ -10,6 +10,6 @@ add_subdirectory(SimpleSubdir)
 add_library(simplestatic STATIC simplelib.c)
 
 include(${CMAKE_CURRENT_LIST_DIR}/Common.cmake)
-generate_output_files(simpleexe simpleshared simplestatic simpleobj)
+generate_output_files(simpleexe simpleexe2 simpleshared simplestatic simpleobj)
 
 file(APPEND "${CMAKE_BINARY_DIR}/target_files.cmake" "set(GENERATED_FILES [==[${CMAKE_BINARY_DIR}/empty.cmake]==])\n")

+ 7 - 2
Tests/RunCMake/NinjaMultiConfig/SimpleSubdir/CMakeLists.txt

@@ -1,4 +1,9 @@
-add_library(simpleobj OBJECT ../empty.c)
-add_executable(simpleexe ../main.c $<TARGET_OBJECTS:simpleobj>)
+add_library(simpleobj OBJECT ../empty.c "$<$<CONFIG:Debug>:../empty_dbg.c>" "$<$<CONFIG:Release>:../empty_rel.c>")
 add_library(simpleshared SHARED ../simplelib.c)
+
+add_executable(simpleexe ../main.c $<TARGET_OBJECTS:simpleobj>)
 target_link_libraries(simpleexe PRIVATE simpleshared)
+
+add_executable(simpleexe2 ../main.c)
+target_link_libraries(simpleexe2 PRIVATE simpleshared $<TARGET_OBJECTS:simpleobj>)
+set_property(TARGET simpleexe2 PROPERTY EXCLUDE_FROM_ALL 1)

+ 0 - 0
Tests/RunCMake/NinjaMultiConfig/empty_dbg.c


+ 0 - 0
Tests/RunCMake/NinjaMultiConfig/empty_rel.c


+ 2 - 14
Tests/RunCMake/ObjectLibrary/OwnSources-stderr.txt

@@ -1,19 +1,7 @@
-^CMake Error at OwnSources.cmake:[0-9]+ \(add_library\):
+^(CMake Error at OwnSources.cmake:[0-9]+ \(add_library\):
   The SOURCES of "A" use a generator expression that depends on the SOURCES
   themselves.
 Call Stack \(most recent call first\):
   CMakeLists.txt:[0-9]+ \(include\)
-+
-CMake Error at OwnSources.cmake:[0-9]+ \(add_library\):
-  The SOURCES of "A" use a generator expression that depends on the SOURCES
-  themselves.
-Call Stack \(most recent call first\):
-  CMakeLists.txt:[0-9]+ \(include\)
-+
-CMake Error at OwnSources.cmake:[0-9]+ \(add_library\):
-  The SOURCES of "A" use a generator expression that depends on the SOURCES
-  themselves.
-Call Stack \(most recent call first\):
-  CMakeLists.txt:[0-9]+ \(include\)
-+
++)+
 CMake Generate step failed\.  Build files cannot be regenerated correctly\.$