mirror of
https://github.com/Kitware/CMake.git
synced 2026-05-04 05:10:10 -05:00
Merge topic 'rpath-default'
d25ad48 OS X: Add CMP0042 to enable MACOSX_RPATH by default
This commit is contained in:
@@ -1752,7 +1752,7 @@ cmComputeLinkInformation::AddLibraryRuntimeInfo(std::string const& fullPath,
|
||||
// @loader_path or full paths.
|
||||
if(this->Makefile->IsOn("CMAKE_PLATFORM_HAS_INSTALLNAME"))
|
||||
{
|
||||
if(!target->HasMacOSXRpath(this->Config))
|
||||
if(!target->HasMacOSXRpathInstallNameDir(this->Config))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1045,6 +1045,12 @@ cmGlobalGenerator::GetExportedTargetsFile(const std::string &filename) const
|
||||
return it == this->BuildExportSets.end() ? 0 : it->second;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
void cmGlobalGenerator::AddCMP0042WarnTarget(const std::string& target)
|
||||
{
|
||||
this->CMP0042WarnTargets.insert(target);
|
||||
}
|
||||
|
||||
bool cmGlobalGenerator::CheckALLOW_DUPLICATE_CUSTOM_TARGETS()
|
||||
{
|
||||
// If the property is not enabled then okay.
|
||||
@@ -1072,6 +1078,9 @@ void cmGlobalGenerator::Generate()
|
||||
// Start with an empty vector:
|
||||
this->FilesReplacedDuringGenerate.clear();
|
||||
|
||||
// clear targets to issue warning CMP0042 for
|
||||
this->CMP0042WarnTargets.clear();
|
||||
|
||||
// Check whether this generator is allowed to run.
|
||||
if(!this->CheckALLOW_DUPLICATE_CUSTOM_TARGETS())
|
||||
{
|
||||
@@ -1203,6 +1212,25 @@ void cmGlobalGenerator::Generate()
|
||||
this->ExtraGenerator->Generate();
|
||||
}
|
||||
|
||||
if(!this->CMP0042WarnTargets.empty())
|
||||
{
|
||||
cmOStringStream w;
|
||||
w <<
|
||||
(this->GetCMakeInstance()->GetPolicies()->
|
||||
GetPolicyWarning(cmPolicies::CMP0042)) << "\n";
|
||||
w << "MACOSX_RPATH is not specified for"
|
||||
" the following targets:\n";
|
||||
for(std::set<std::string>::iterator
|
||||
iter = this->CMP0042WarnTargets.begin();
|
||||
iter != this->CMP0042WarnTargets.end();
|
||||
++iter)
|
||||
{
|
||||
w << " " << *iter << "\n";
|
||||
}
|
||||
this->GetCMakeInstance()->IssueMessage(cmake::AUTHOR_WARNING, w.str(),
|
||||
cmListFileBacktrace());
|
||||
}
|
||||
|
||||
this->CMakeInstance->UpdateProgress("Generating done", -1);
|
||||
}
|
||||
|
||||
|
||||
@@ -315,6 +315,8 @@ public:
|
||||
bool GenerateImportFile(const std::string &file);
|
||||
cmExportBuildFileGenerator*
|
||||
GetExportedTargetsFile(const std::string &filename) const;
|
||||
void AddCMP0042WarnTarget(const std::string& target);
|
||||
|
||||
protected:
|
||||
typedef std::vector<cmLocalGenerator*> GeneratorVector;
|
||||
// for a project collect all its targets by following depend
|
||||
@@ -449,6 +451,9 @@ private:
|
||||
|
||||
// Set of binary directories on disk.
|
||||
std::set<cmStdString> BinaryDirectories;
|
||||
|
||||
// track targets to issue CMP0042 warning for.
|
||||
std::set<std::string> CMP0042WarnTargets;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
#include "cmLocalXCodeGenerator.h"
|
||||
#include "cmGlobalXCodeGenerator.h"
|
||||
#include "cmSourceFile.h"
|
||||
#include "cmMakefile.h"
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
cmLocalXCodeGenerator::cmLocalXCodeGenerator()
|
||||
@@ -42,3 +43,31 @@ void cmLocalXCodeGenerator::AppendFlagEscape(std::string& flags,
|
||||
static_cast<cmGlobalXCodeGenerator*>(this->GlobalGenerator);
|
||||
gg->AppendFlag(flags, rawFlag);
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
void cmLocalXCodeGenerator::Generate()
|
||||
{
|
||||
cmLocalGenerator::Generate();
|
||||
|
||||
cmTargets& targets = this->Makefile->GetTargets();
|
||||
for(cmTargets::iterator iter = targets.begin();
|
||||
iter != targets.end(); ++iter)
|
||||
{
|
||||
cmTarget* t = &iter->second;
|
||||
t->HasMacOSXRpathInstallNameDir(NULL);
|
||||
}
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
void cmLocalXCodeGenerator::GenerateInstallRules()
|
||||
{
|
||||
cmLocalGenerator::GenerateInstallRules();
|
||||
|
||||
cmTargets& targets = this->Makefile->GetTargets();
|
||||
for(cmTargets::iterator iter = targets.begin();
|
||||
iter != targets.end(); ++iter)
|
||||
{
|
||||
cmTarget* t = &iter->second;
|
||||
t->HasMacOSXRpathInstallNameDir(NULL);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29,6 +29,8 @@ public:
|
||||
virtual ~cmLocalXCodeGenerator();
|
||||
virtual std::string GetTargetDirectory(cmTarget const& target) const;
|
||||
virtual void AppendFlagEscape(std::string& flags, const char* rawFlag);
|
||||
virtual void Generate();
|
||||
virtual void GenerateInstallRules();
|
||||
private:
|
||||
|
||||
};
|
||||
|
||||
@@ -311,6 +311,11 @@ cmPolicies::cmPolicies()
|
||||
CMP0041, "CMP0041",
|
||||
"Error on relative include with generator expression.",
|
||||
3,0,0,0, cmPolicies::WARN);
|
||||
|
||||
this->DefinePolicy(
|
||||
CMP0042, "CMP0042",
|
||||
"MACOSX_RPATH is enabled by default.",
|
||||
3,0,0,0, cmPolicies::WARN);
|
||||
}
|
||||
|
||||
cmPolicies::~cmPolicies()
|
||||
|
||||
@@ -95,6 +95,7 @@ public:
|
||||
CMP0040, ///< The target in the TARGET signature of
|
||||
/// add_custom_command() must exist.
|
||||
CMP0041, ///< Error on relative include with generator expression
|
||||
CMP0042, ///< Enable MACOSX_RPATH by default
|
||||
|
||||
/** \brief Always the last entry.
|
||||
*
|
||||
|
||||
+48
-5
@@ -3186,13 +3186,17 @@ std::string cmTarget::GetSOName(const char* config) const
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool cmTarget::HasMacOSXRpath(const char* config) const
|
||||
bool cmTarget::HasMacOSXRpathInstallNameDir(const char* config) const
|
||||
{
|
||||
bool install_name_is_rpath = false;
|
||||
bool macosx_rpath = this->GetPropertyAsBool("MACOSX_RPATH");
|
||||
bool macosx_rpath = false;
|
||||
|
||||
if(!this->IsImportedTarget)
|
||||
{
|
||||
if(this->GetType() != cmTarget::SHARED_LIBRARY)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
const char* install_name = this->GetProperty("INSTALL_NAME_DIR");
|
||||
bool use_install_name =
|
||||
this->GetPropertyAsBool("BUILD_WITH_INSTALL_RPATH");
|
||||
@@ -3205,6 +3209,10 @@ bool cmTarget::HasMacOSXRpath(const char* config) const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
if(!install_name_is_rpath)
|
||||
{
|
||||
macosx_rpath = this->MacOSXRpathInstallNameDirDefault();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -3258,6 +3266,37 @@ bool cmTarget::HasMacOSXRpath(const char* config) const
|
||||
return true;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool cmTarget::MacOSXRpathInstallNameDirDefault() const
|
||||
{
|
||||
// we can't do rpaths when unsupported
|
||||
if(!this->Makefile->IsSet("CMAKE_SHARED_LIBRARY_RUNTIME_C_FLAG"))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
const char* macosx_rpath_str = this->GetProperty("MACOSX_RPATH");
|
||||
if(macosx_rpath_str)
|
||||
{
|
||||
return this->GetPropertyAsBool("MACOSX_RPATH");
|
||||
}
|
||||
|
||||
cmPolicies::PolicyStatus cmp0042 = this->GetPolicyStatusCMP0042();
|
||||
|
||||
if(cmp0042 == cmPolicies::WARN)
|
||||
{
|
||||
this->Makefile->GetLocalGenerator()->GetGlobalGenerator()->
|
||||
AddCMP0042WarnTarget(this->GetName());
|
||||
}
|
||||
|
||||
if(cmp0042 == cmPolicies::NEW)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool cmTarget::IsImportedSharedLibWithoutSOName(const char* config) const
|
||||
{
|
||||
@@ -3847,7 +3886,8 @@ std::string cmTarget::GetInstallNameDirForBuildTree(const char* config) const
|
||||
!this->GetPropertyAsBool("SKIP_BUILD_RPATH"))
|
||||
{
|
||||
std::string dir;
|
||||
if(this->GetPropertyAsBool("MACOSX_RPATH"))
|
||||
bool macosx_rpath = this->MacOSXRpathInstallNameDirDefault();
|
||||
if(macosx_rpath)
|
||||
{
|
||||
dir = "@rpath";
|
||||
}
|
||||
@@ -3881,9 +3921,12 @@ std::string cmTarget::GetInstallNameDirForInstallTree() const
|
||||
dir += "/";
|
||||
}
|
||||
}
|
||||
if(!install_name_dir && this->GetPropertyAsBool("MACOSX_RPATH"))
|
||||
if(!install_name_dir)
|
||||
{
|
||||
dir = "@rpath/";
|
||||
if(this->MacOSXRpathInstallNameDirDefault())
|
||||
{
|
||||
dir = "@rpath/";
|
||||
}
|
||||
}
|
||||
return dir;
|
||||
}
|
||||
|
||||
+6
-2
@@ -26,7 +26,8 @@
|
||||
F(CMP0020) \
|
||||
F(CMP0021) \
|
||||
F(CMP0022) \
|
||||
F(CMP0041)
|
||||
F(CMP0041) \
|
||||
F(CMP0042)
|
||||
|
||||
class cmake;
|
||||
class cmMakefile;
|
||||
@@ -382,7 +383,10 @@ public:
|
||||
std::string GetSOName(const char* config) const;
|
||||
|
||||
/** Whether this library has \@rpath and platform supports it. */
|
||||
bool HasMacOSXRpath(const char* config) const;
|
||||
bool HasMacOSXRpathInstallNameDir(const char* config) const;
|
||||
|
||||
/** Whether this library defaults to \@rpath. */
|
||||
bool MacOSXRpathInstallNameDirDefault() const;
|
||||
|
||||
/** Test for special case of a third-party shared library that has
|
||||
no soname at all. */
|
||||
|
||||
Reference in New Issue
Block a user