Merge topic 'rpath-use-implicit-link-dirs'

95a9c80 Merge topic 'LINK_LIBRARIES-property' into rpath-use-implicit-link-dirs
baa33ac AIX-GNU: Put implicit link directories in runtime libpath (#13909)
171b099 Avoid duplicate RPATH entries
This commit is contained in:
Brad King 2013-02-15 13:12:31 -05:00 committed by CMake Topic Stage
commit e85f1c28d4
3 changed files with 53 additions and 4 deletions

View File

@ -23,4 +23,5 @@ macro(__aix_compiler_gnu lang)
set(CMAKE_SHARED_LIBRARY_RUNTIME_${lang}_FLAG_SEP ":") set(CMAKE_SHARED_LIBRARY_RUNTIME_${lang}_FLAG_SEP ":")
set(CMAKE_SHARED_LIBRARY_CREATE_${lang}_FLAGS "${CMAKE_SHARED_LIBRARY_CREATE_${lang}_FLAGS} -Wl,-G,-brtl,-bnoipath") set(CMAKE_SHARED_LIBRARY_CREATE_${lang}_FLAGS "${CMAKE_SHARED_LIBRARY_CREATE_${lang}_FLAGS} -Wl,-G,-brtl,-bnoipath")
set(CMAKE_SHARED_LIBRARY_LINK_${lang}_FLAGS "-Wl,-brtl,-bnoipath,-bexpall") # +s, flag for exe link to use shared lib set(CMAKE_SHARED_LIBRARY_LINK_${lang}_FLAGS "-Wl,-brtl,-bnoipath,-bexpall") # +s, flag for exe link to use shared lib
set(CMAKE_${lang}_USE_IMPLICIT_LINK_DIRECTORIES_IN_RUNTIME_PATH 1)
endmacro() endmacro()

View File

@ -1783,6 +1783,22 @@ cmComputeLinkInformation::AddLibraryRuntimeInfo(std::string const& fullPath)
} }
} }
//----------------------------------------------------------------------------
static void cmCLI_ExpandListUnique(const char* str,
std::vector<std::string>& out,
std::set<cmStdString>& emitted)
{
std::vector<std::string> tmp;
cmSystemTools::ExpandListArgument(str, tmp);
for(std::vector<std::string>::iterator i = tmp.begin(); i != tmp.end(); ++i)
{
if(emitted.insert(*i).second)
{
out.push_back(*i);
}
}
}
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
void cmComputeLinkInformation::GetRPath(std::vector<std::string>& runtimeDirs, void cmComputeLinkInformation::GetRPath(std::vector<std::string>& runtimeDirs,
bool for_install) bool for_install)
@ -1808,10 +1824,11 @@ void cmComputeLinkInformation::GetRPath(std::vector<std::string>& runtimeDirs,
this->Target->GetPropertyAsBool("INSTALL_RPATH_USE_LINK_PATH"); this->Target->GetPropertyAsBool("INSTALL_RPATH_USE_LINK_PATH");
// Construct the RPATH. // Construct the RPATH.
std::set<cmStdString> emitted;
if(use_install_rpath) if(use_install_rpath)
{ {
const char* install_rpath = this->Target->GetProperty("INSTALL_RPATH"); const char* install_rpath = this->Target->GetProperty("INSTALL_RPATH");
cmSystemTools::ExpandListArgument(install_rpath, runtimeDirs); cmCLI_ExpandListUnique(install_rpath, runtimeDirs, emitted);
} }
if(use_build_rpath || use_link_rpath) if(use_build_rpath || use_link_rpath)
{ {
@ -1822,9 +1839,12 @@ void cmComputeLinkInformation::GetRPath(std::vector<std::string>& runtimeDirs,
// Put this directory in the rpath if using build-tree rpath // Put this directory in the rpath if using build-tree rpath
// support or if using the link path as an rpath. // support or if using the link path as an rpath.
if(use_build_rpath) if(use_build_rpath)
{
if(emitted.insert(*ri).second)
{ {
runtimeDirs.push_back(*ri); runtimeDirs.push_back(*ri);
} }
}
else if(use_link_rpath) else if(use_link_rpath)
{ {
// Do not add any path inside the source or build tree. // Do not add any path inside the source or build tree.
@ -1835,15 +1855,40 @@ void cmComputeLinkInformation::GetRPath(std::vector<std::string>& runtimeDirs,
!cmSystemTools::IsSubDirectory(ri->c_str(), topSourceDir) && !cmSystemTools::IsSubDirectory(ri->c_str(), topSourceDir) &&
!cmSystemTools::IsSubDirectory(ri->c_str(), topBinaryDir)) !cmSystemTools::IsSubDirectory(ri->c_str(), topBinaryDir))
{ {
if(emitted.insert(*ri).second)
{
runtimeDirs.push_back(*ri); runtimeDirs.push_back(*ri);
} }
} }
} }
} }
}
// Add runtime paths required by the languages to always be
// present. This is done even when skipping rpath support.
{
cmTarget::LinkClosure const* lc =
this->Target->GetLinkClosure(this->Config, this->HeadTarget);
for(std::vector<std::string>::const_iterator li = lc->Languages.begin();
li != lc->Languages.end(); ++li)
{
std::string useVar = "CMAKE_" + *li +
"_USE_IMPLICIT_LINK_DIRECTORIES_IN_RUNTIME_PATH";
if(this->Makefile->IsOn(useVar.c_str()))
{
std::string dirVar = "CMAKE_" + *li +
"_IMPLICIT_LINK_DIRECTORIES";
if(const char* dirs = this->Makefile->GetDefinition(dirVar.c_str()))
{
cmCLI_ExpandListUnique(dirs, runtimeDirs, emitted);
}
}
}
}
// Add runtime paths required by the platform to always be // Add runtime paths required by the platform to always be
// present. This is done even when skipping rpath support. // present. This is done even when skipping rpath support.
cmSystemTools::ExpandListArgument(this->RuntimeAlways.c_str(), runtimeDirs); cmCLI_ExpandListUnique(this->RuntimeAlways.c_str(), runtimeDirs, emitted);
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------

View File

@ -1867,6 +1867,9 @@ void cmDocumentVariables::DefineVariables(cmake* cm)
cmProperty::VARIABLE,0,0); cmProperty::VARIABLE,0,0);
cm->DefineProperty("CMAKE_PLATFORM_REQUIRED_RUNTIME_PATH", cm->DefineProperty("CMAKE_PLATFORM_REQUIRED_RUNTIME_PATH",
cmProperty::VARIABLE,0,0); cmProperty::VARIABLE,0,0);
cm->DefineProperty(
"CMAKE_<LANG>_USE_IMPLICIT_LINK_DIRECTORIES_IN_RUNTIME_PATH",
cmProperty::VARIABLE,0,0);
cm->DefineProperty("CMAKE_SHARED_MODULE_CREATE_<LANG>_FLAGS", cm->DefineProperty("CMAKE_SHARED_MODULE_CREATE_<LANG>_FLAGS",
cmProperty::VARIABLE,0,0); cmProperty::VARIABLE,0,0);
cm->DefineProperty("CMAKE_SHARED_MODULE_<LANG>_FLAGS", cm->DefineProperty("CMAKE_SHARED_MODULE_<LANG>_FLAGS",