OS X: Enable rpath support on Mac OS X when find_library() is used.

This commit is contained in:
Clinton Stimpson 2013-07-15 22:23:12 -06:00
parent b94e726a83
commit e645ff0b10
6 changed files with 56 additions and 19 deletions

View File

@ -1345,12 +1345,23 @@ void cmComputeLinkInformation::AddFrameworkItem(std::string const& item)
return; 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. // 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. // Add the item using the -framework option.
this->Items.push_back(Item("-framework", false)); this->Items.push_back(Item("-framework", false));
std::string fw = this->SplitFramework.match(2);
fw = this->LocalGenerator->EscapeForShell(fw.c_str()); fw = this->LocalGenerator->EscapeForShell(fw.c_str());
this->Items.push_back(Item(fw, false)); this->Items.push_back(Item(fw, false));
} }
@ -1813,9 +1824,10 @@ cmComputeLinkInformation::AddLibraryRuntimeInfo(std::string const& fullPath)
if(fullPath.find(".framework") != std::string::npos) if(fullPath.find(".framework") != std::string::npos)
{ {
cmsys::RegularExpression splitFramework; cmsys::RegularExpression splitFramework;
splitFramework.compile("^(.*)/(.*).framework/.*/(.*)$"); splitFramework.compile("^(.*)/(.*).framework/(.*)$");
if(splitFramework.find(fullPath) && if(splitFramework.find(fullPath) &&
(splitFramework.match(2) == splitFramework.match(3))) (std::string::npos !=
splitFramework.match(3).find(splitFramework.match(2))))
{ {
is_shared_library = true; is_shared_library = true;
} }

View File

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

View File

@ -14,6 +14,10 @@ set_target_properties(shared2 PROPERTIES
add_library(framework SHARED framework.cpp framework.h) add_library(framework SHARED framework.cpp framework.h)
set_target_properties(framework PROPERTIES MACOSX_RPATH 1 FRAMEWORK 1) 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 # executable to test a shared library dependency with install rpaths
add_executable(test1 test1.cpp) add_executable(test1 test1.cpp)
target_link_libraries(test1 shared) 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 shared EXPORT MyExport DESTINATION lib)
install(TARGETS shared2 EXPORT MyExport DESTINATION lib2) install(TARGETS shared2 EXPORT MyExport DESTINATION lib2)
install(TARGETS framework EXPORT MyExport DESTINATION lib-fw) install(TARGETS framework EXPORT MyExport DESTINATION lib-fw)
install(TARGETS framework2 EXPORT MyExport DESTINATION lib-fw2)
install(EXPORT MyExport DESTINATION lib FILE exp.cmake) install(EXPORT MyExport DESTINATION lib FILE exp.cmake)

View File

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

View File

@ -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

View File

@ -9,7 +9,8 @@ add_executable(testb ${MacRuntimePath_B_SOURCE_DIR}/../A/test3.cpp)
target_link_libraries(testb shared framework) target_link_libraries(testb shared framework)
# test link with rpath enabled library by filename # 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 add_custom_target(testb_run ALL
COMMAND testb COMMAND testb