Procházet zdrojové kódy

Xcode: ensure framework with custom output directory can be consumed

Fixes: #24046
Marc Chevrier před 3 roky
rodič
revize
4aa86da827

+ 13 - 5
Source/cmGlobalXCodeGenerator.cxx

@@ -3830,6 +3830,7 @@ void cmGlobalXCodeGenerator::AddDependAndLinkInformation(cmXCodeObject* target)
       const auto& fwPaths = cli->GetFrameworkPaths();
       emitted.insert(fwPaths.begin(), fwPaths.end());
       BuildObjectListOrString libPaths(this, true);
+      BuildObjectListOrString fwSearchPaths(this, true);
       for (auto const& libItem : configItemMap[configName]) {
         auto const& libName = *libItem;
         if (libName.IsPath == cmComputeLinkInformation::ItemIsPath::Yes) {
@@ -3846,8 +3847,8 @@ void cmGlobalXCodeGenerator::AddDependAndLinkInformation(cmXCodeObject* target)
                 emitted.insert(fwDescriptor->Directory).second) {
               // This is a search path we had not added before and it isn't
               // an implicit search path, so we need it
-              libPaths.Add("-F " +
-                           this->XCodeEscapePath(fwDescriptor->Directory));
+              fwSearchPaths.Add(
+                this->XCodeEscapePath(fwDescriptor->Directory));
             }
             if (libName.GetFeatureName() == "__CMAKE_LINK_FRAMEWORK"_s) {
               // use the full path
@@ -3886,9 +3887,16 @@ void cmGlobalXCodeGenerator::AddDependAndLinkInformation(cmXCodeObject* target)
           target->AddDependTarget(configName, libName.Target->GetName());
         }
       }
-      this->AppendBuildSettingAttribute(target,
-                                        this->GetTargetLinkFlagsVar(gt),
-                                        libPaths.CreateList(), configName);
+      if (!libPaths.IsEmpty()) {
+        this->AppendBuildSettingAttribute(target,
+                                          this->GetTargetLinkFlagsVar(gt),
+                                          libPaths.CreateList(), configName);
+      }
+      if (!fwSearchPaths.IsEmpty()) {
+        this->AppendBuildSettingAttribute(target, "FRAMEWORK_SEARCH_PATHS",
+                                          fwSearchPaths.CreateList(),
+                                          configName);
+      }
     }
   }
 }

+ 18 - 0
Tests/RunCMake/Framework/FrameworkConsumption.cmake

@@ -13,3 +13,21 @@ set_target_properties(Gui PROPERTIES
 add_executable(app main.c)
 
 target_link_libraries(app PRIVATE Gui)
+
+
+# Same test but with generation done in custom directories
+add_library(Gui2 SHARED Gui.c "${input_header}")
+set_target_properties(Gui2 PROPERTIES
+    PUBLIC_HEADER "${input_header}"
+    FRAMEWORK TRUE
+    LIBRARY_OUTPUT_DIRECTORY lib
+)
+
+add_executable(app2 main2.c)
+set_target_properties(Gui2 PROPERTIES
+    PUBLIC_HEADER "${input_header}"
+    FRAMEWORK TRUE
+    RUNTIME_OUTPUT_DIRECTORY bin
+)
+
+target_link_libraries(app2 PRIVATE Gui2)

+ 9 - 0
Tests/RunCMake/Framework/main2.c

@@ -0,0 +1,9 @@
+
+#include <Gui2/Gui.h>
+
+int main()
+{
+  foo();
+
+  return 0;
+}