OS X: Enable rpath support on Mac OS X when find_library() is used.
This commit is contained in:
parent
b94e726a83
commit
e645ff0b10
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
{
|
{
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -0,0 +1,8 @@
|
||||||
|
|
||||||
|
#include "framework2.h"
|
||||||
|
#include "stdio.h"
|
||||||
|
|
||||||
|
void framework2()
|
||||||
|
{
|
||||||
|
printf("framework 2\n");
|
||||||
|
}
|
|
@ -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
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue