Jelajahi Sumber

Xcode: Fix object library references in multi-project trees (#13452)

In cmGlobalXCodeGenerator::Generate we generate a .xcodeproj for each
directory in the tree containing a project() command.  First we
iteratively use SetGenerationRoot to add "ALL_BUILD" and other targets
to each project.  This leaves "CurrentProject" set to the last project
when we invoke cmGlobalGenerator::Generate, which is not the same as the
top-level project if any subdirectories invoke the project() command.

When cmGlobalGenerator::Generate reaches CreateGeneratorTargets it
constructs cmGeneratorTarget and calls ComputeTargetObjects exactly once
per target.  In this context the value of CurrentProject is undefined so
we cannot pass it to GetObjectsNormalDirectory.  Use "$(PROJECT_NAME)"
instead so it will adapt automatically to each project.

Also teach Tests/ObjectLibrary to cover this case.
Brad King 13 tahun lalu
induk
melakukan
b237dbd8c3

+ 1 - 1
Source/cmGlobalXCodeGenerator.cxx

@@ -3739,7 +3739,7 @@ cmGlobalXCodeGenerator
 
   const char* configName = this->GetCMakeCFGIntDir();
   std::string dir = this->GetObjectsNormalDirectory(
-    this->CurrentProject, configName, gt->Target);
+    "$(PROJECT_NAME)", configName, gt->Target);
   if(this->XcodeVersion >= 21)
     {
     dir += "$(CURRENT_ARCH)/";

+ 1 - 0
Tests/ObjectLibrary/A/CMakeLists.txt

@@ -1,3 +1,4 @@
+project(ObjectLibraryA)
 # Add -fPIC so objects can be used in shared libraries.
 # TODO: Need property for this.
 if(CMAKE_SHARED_LIBRARY_C_FLAGS AND NOT WATCOM)

+ 1 - 0
Tests/ObjectLibrary/B/CMakeLists.txt

@@ -1,3 +1,4 @@
+project(ObjectLibraryB)
 if("${CMAKE_GENERATOR}" MATCHES "Visual Studio 6")
   # VS 6 generator does not use per-target object locations.
   set(vs6 _vs6)