Bläddra i källkod

Merge topic 'rpath-on-mac'

603bc59 OS X: Fix regression handling frameworks for Ninja
e645ff0 OS X: Enable rpath support on Mac OS X when find_library() is used.
Brad King 12 år sedan
förälder
incheckning
8521a909ba

+ 16 - 4
Source/cmComputeLinkInformation.cxx

@@ -1345,12 +1345,23 @@ void cmComputeLinkInformation::AddFrameworkItem(std::string const& item)
     return;
     }
 
+  std::string fw_path = this->SplitFramework.match(1);
+  std::string fw = this->SplitFramework.match(2);
+  std::string full_fw = fw_path;
+  full_fw += "/";
+  full_fw += fw;
+  full_fw += ".framework";
+  full_fw += "/";
+  full_fw += fw;
+
   // Add the directory portion to the framework search path.
-  this->AddFrameworkPath(this->SplitFramework.match(1));
+  this->AddFrameworkPath(fw_path);
+
+  // add runtime information
+  this->AddLibraryRuntimeInfo(full_fw);
 
   // Add the item using the -framework option.
   this->Items.push_back(Item("-framework", false));
-  std::string fw = this->SplitFramework.match(2);
   fw = this->LocalGenerator->EscapeForShell(fw.c_str());
   this->Items.push_back(Item(fw, false));
 }
@@ -1813,9 +1824,10 @@ cmComputeLinkInformation::AddLibraryRuntimeInfo(std::string const& fullPath)
     if(fullPath.find(".framework") != std::string::npos)
       {
       cmsys::RegularExpression splitFramework;
-      splitFramework.compile("^(.*)/(.*).framework/.*/(.*)$");
+      splitFramework.compile("^(.*)/(.*).framework/(.*)$");
       if(splitFramework.find(fullPath) &&
-        (splitFramework.match(2) == splitFramework.match(3)))
+        (std::string::npos !=
+         splitFramework.match(3).find(splitFramework.match(2))))
         {
         is_shared_library = true;
         }

+ 7 - 1
Source/cmGlobalNinjaGenerator.cxx

@@ -824,13 +824,19 @@ cmGlobalNinjaGenerator
   cmLocalNinjaGenerator *ng =
     static_cast<cmLocalNinjaGenerator *>(this->LocalGenerators[0]);
 
+  // for frameworks, we want the real name, not smple name
+  // frameworks always appear versioned, and the build.ninja
+  // will always attempt to manage symbolic links instead
+  // of letting cmOSXBundleGenerator do it.
+  bool realname = target->IsFrameworkOnApple();
+
   switch (target->GetType()) {
   case cmTarget::EXECUTABLE:
   case cmTarget::SHARED_LIBRARY:
   case cmTarget::STATIC_LIBRARY:
   case cmTarget::MODULE_LIBRARY:
     outputs.push_back(ng->ConvertToNinjaPath(
-      target->GetFullPath(configName).c_str()));
+      target->GetFullPath(configName, false, realname).c_str()));
     break;
 
   case cmTarget::OBJECT_LIBRARY:

+ 4 - 2
Source/cmNinjaNormalTargetGenerator.cxx

@@ -265,7 +265,8 @@ cmNinjaNormalTargetGenerator
                                         rspcontent);
   }
 
-  if (this->TargetNameOut != this->TargetNameReal) {
+  if (this->TargetNameOut != this->TargetNameReal &&
+    !this->GetTarget()->IsFrameworkOnApple()) {
     std::string cmakeCommand =
       this->GetLocalGenerator()->ConvertToOutputFormat(
         this->GetMakefile()->GetRequiredDefinition("CMAKE_COMMAND"),
@@ -599,7 +600,8 @@ void cmNinjaNormalTargetGenerator::WriteLinkStatement()
                               rspfile,
                               commandLineLengthLimit);
 
-  if (targetOutput != targetOutputReal) {
+  if (targetOutput != targetOutputReal &&
+    !this->GetTarget()->IsFrameworkOnApple()) {
     if (targetType == cmTarget::EXECUTABLE) {
       globalGenerator->WriteBuild(this->GetBuildFileStream(),
                                   "Create executable symlink " + targetOutput,

+ 8 - 14
Source/cmOrderDirectories.cxx

@@ -40,9 +40,10 @@ public:
     if(file.rfind(".framework") != std::string::npos)
       {
       cmsys::RegularExpression splitFramework;
-      splitFramework.compile("^(.*)/(.*).framework/.*/(.*)$");
+      splitFramework.compile("^(.*)/(.*).framework/(.*)$");
       if(splitFramework.find(file) &&
-        (splitFramework.match(2) == splitFramework.match(3)))
+        (std::string::npos !=
+         splitFramework.match(3).find(splitFramework.match(2))))
         {
         this->Directory = splitFramework.match(1);
         this->FileName =
@@ -318,7 +319,6 @@ void cmOrderDirectories::AddRuntimeLibrary(std::string const& fullPath,
   // Add the runtime library at most once.
   if(this->EmmittedConstraintSOName.insert(fullPath).second)
     {
-    std::string soname2 = soname ? soname : "";
     // Implicit link directories need special handling.
     if(!this->ImplicitDirectories.empty())
       {
@@ -327,16 +327,12 @@ void cmOrderDirectories::AddRuntimeLibrary(std::string const& fullPath,
       if(fullPath.rfind(".framework") != std::string::npos)
         {
         cmsys::RegularExpression splitFramework;
-        splitFramework.compile("^(.*)/(.*).framework/(.*)/(.*)$");
+        splitFramework.compile("^(.*)/(.*).framework/(.*)$");
         if(splitFramework.find(fullPath) &&
-          (splitFramework.match(2) == splitFramework.match(4)))
+          (std::string::npos !=
+           splitFramework.match(3).find(splitFramework.match(2))))
           {
           dir = splitFramework.match(1);
-          soname2 = splitFramework.match(2);
-          soname2 += ".framework/";
-          soname2 += splitFramework.match(3);
-          soname2 += "/";
-          soname2 += splitFramework.match(4);
           }
         }
 
@@ -344,16 +340,14 @@ void cmOrderDirectories::AddRuntimeLibrary(std::string const& fullPath,
          this->ImplicitDirectories.end())
         {
         this->ImplicitDirEntries.push_back(
-          new cmOrderDirectoriesConstraintSOName(this, fullPath,
-                                                 soname2.c_str()));
+          new cmOrderDirectoriesConstraintSOName(this, fullPath, soname));
         return;
         }
       }
 
     // Construct the runtime information entry for this library.
     this->ConstraintEntries.push_back(
-      new cmOrderDirectoriesConstraintSOName(this, fullPath,
-                                             soname2.c_str()));
+      new cmOrderDirectoriesConstraintSOName(this, fullPath, soname));
     }
   else
     {

+ 5 - 0
Tests/MacRuntimePath/A/CMakeLists.txt

@@ -14,6 +14,10 @@ set_target_properties(shared2 PROPERTIES
 add_library(framework SHARED framework.cpp framework.h)
 set_target_properties(framework PROPERTIES MACOSX_RPATH 1 FRAMEWORK 1)
 
+# another framework
+add_library(framework2 SHARED framework2.cpp framework2.h)
+set_target_properties(framework2 PROPERTIES MACOSX_RPATH 1 FRAMEWORK 1)
+
 # executable to test a shared library dependency with install rpaths
 add_executable(test1 test1.cpp)
 target_link_libraries(test1 shared)
@@ -60,4 +64,5 @@ export(TARGETS shared shared2 framework FILE "${CMAKE_CURRENT_BINARY_DIR}/exp.cm
 install(TARGETS shared EXPORT MyExport DESTINATION lib)
 install(TARGETS shared2 EXPORT MyExport DESTINATION lib2)
 install(TARGETS framework EXPORT MyExport DESTINATION lib-fw)
+install(TARGETS framework2 EXPORT MyExport DESTINATION lib-fw2)
 install(EXPORT MyExport DESTINATION lib FILE exp.cmake)

+ 8 - 0
Tests/MacRuntimePath/A/framework2.cpp

@@ -0,0 +1,8 @@
+
+#include "framework2.h"
+#include "stdio.h"
+
+void framework2()
+{
+  printf("framework 2\n");
+}

+ 17 - 0
Tests/MacRuntimePath/A/framework2.h

@@ -0,0 +1,17 @@
+
+#ifndef framework2_h
+#define framework2_h
+
+#ifdef WIN32
+# ifdef framework2_EXPORTS
+#  define FRAMEWORK2_EXPORT __declspec(dllexport)
+# else
+#  define FRAMEWORK2_EXPORT __declspec(dllimport)
+# endif
+#else
+# define FRAMEWORK2_EXPORT
+#endif
+
+void FRAMEWORK2_EXPORT framework2();
+
+#endif

+ 2 - 1
Tests/MacRuntimePath/B/CMakeLists.txt

@@ -9,7 +9,8 @@ add_executable(testb ${MacRuntimePath_B_SOURCE_DIR}/../A/test3.cpp)
 target_link_libraries(testb shared framework)
 
 # test link with rpath enabled library by filename
-target_link_libraries(testb $<TARGET_LINKER_FILE:shared2> framework)
+find_library(fw2 NAMES framework2 HINTS ${MacRuntimePath_B_BINARY_DIR}/../Root/lib-fw2)
+target_link_libraries(testb $<TARGET_LINKER_FILE:shared2> ${fw2})
 
 add_custom_target(testb_run ALL
   COMMAND testb