From e645ff0b10567e400c722dfc28c58dc4fd8d181b Mon Sep 17 00:00:00 2001 From: Clinton Stimpson Date: Mon, 15 Jul 2013 22:23:12 -0600 Subject: OS X: Enable rpath support on Mac OS X when find_library() is used. --- Source/cmComputeLinkInformation.cxx | 20 ++++++++++++++++---- Source/cmOrderDirectories.cxx | 22 ++++++++-------------- Tests/MacRuntimePath/A/CMakeLists.txt | 5 +++++ Tests/MacRuntimePath/A/framework2.cpp | 8 ++++++++ Tests/MacRuntimePath/A/framework2.h | 17 +++++++++++++++++ Tests/MacRuntimePath/B/CMakeLists.txt | 3 ++- 6 files changed, 56 insertions(+), 19 deletions(-) create mode 100644 Tests/MacRuntimePath/A/framework2.cpp create mode 100644 Tests/MacRuntimePath/A/framework2.h diff --git a/Source/cmComputeLinkInformation.cxx b/Source/cmComputeLinkInformation.cxx index ab9eb14..fb7b5b6 100644 --- a/Source/cmComputeLinkInformation.cxx +++ b/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; } diff --git a/Source/cmOrderDirectories.cxx b/Source/cmOrderDirectories.cxx index 93885b2..0220825 100644 --- a/Source/cmOrderDirectories.cxx +++ b/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 { diff --git a/Tests/MacRuntimePath/A/CMakeLists.txt b/Tests/MacRuntimePath/A/CMakeLists.txt index 6e6de42..5fc54f4 100644 --- a/Tests/MacRuntimePath/A/CMakeLists.txt +++ b/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) diff --git a/Tests/MacRuntimePath/A/framework2.cpp b/Tests/MacRuntimePath/A/framework2.cpp new file mode 100644 index 0000000..d3c2c45 --- /dev/null +++ b/Tests/MacRuntimePath/A/framework2.cpp @@ -0,0 +1,8 @@ + +#include "framework2.h" +#include "stdio.h" + +void framework2() +{ + printf("framework 2\n"); +} diff --git a/Tests/MacRuntimePath/A/framework2.h b/Tests/MacRuntimePath/A/framework2.h new file mode 100644 index 0000000..4576d12 --- /dev/null +++ b/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 diff --git a/Tests/MacRuntimePath/B/CMakeLists.txt b/Tests/MacRuntimePath/B/CMakeLists.txt index c361620..4317af6 100644 --- a/Tests/MacRuntimePath/B/CMakeLists.txt +++ b/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 $ framework) +find_library(fw2 NAMES framework2 HINTS ${MacRuntimePath_B_BINARY_DIR}/../Root/lib-fw2) +target_link_libraries(testb $ ${fw2}) add_custom_target(testb_run ALL COMMAND testb -- cgit v0.12