summaryrefslogtreecommitdiffstats
path: root/Source/cmLinkDirectoriesCommand.cxx
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2009-11-24 16:16:38 (GMT)
committerBrad King <brad.king@kitware.com>2009-11-24 16:16:38 (GMT)
commit02db43239b7e2fd1f6dede9fb7237470ca51b567 (patch)
treeb8d176017c422f81c6122c40c24e6592d3375548 /Source/cmLinkDirectoriesCommand.cxx
parente1548142fbb582d02f2386ff8085e6372f7f3ffd (diff)
downloadCMake-02db43239b7e2fd1f6dede9fb7237470ca51b567.zip
CMake-02db43239b7e2fd1f6dede9fb7237470ca51b567.tar.gz
CMake-02db43239b7e2fd1f6dede9fb7237470ca51b567.tar.bz2
Teach link_directories to recognize relative paths
We create CMake Policy CMP0015 to make link_directories() treat relative paths with respect to the source tree while retaining compatibility. This makes it consistent with include_directories() and other commands. Changes based on patch from Alex. See issue #9697.
Diffstat (limited to 'Source/cmLinkDirectoriesCommand.cxx')
-rw-r--r--Source/cmLinkDirectoriesCommand.cxx44
1 files changed, 41 insertions, 3 deletions
diff --git a/Source/cmLinkDirectoriesCommand.cxx b/Source/cmLinkDirectoriesCommand.cxx
index 697376f..4412414 100644
--- a/Source/cmLinkDirectoriesCommand.cxx
+++ b/Source/cmLinkDirectoriesCommand.cxx
@@ -23,10 +23,48 @@ bool cmLinkDirectoriesCommand
for(std::vector<std::string>::const_iterator i = args.begin();
i != args.end(); ++i)
{
- std::string unixPath = *i;
- cmSystemTools::ConvertToUnixSlashes(unixPath);
- this->Makefile->AddLinkDirectory(unixPath.c_str());
+ this->AddLinkDir(*i);
}
return true;
}
+//----------------------------------------------------------------------------
+void cmLinkDirectoriesCommand::AddLinkDir(std::string const& dir)
+{
+ std::string unixPath = dir;
+ cmSystemTools::ConvertToUnixSlashes(unixPath);
+ if(!cmSystemTools::FileIsFullPath(unixPath.c_str()))
+ {
+ bool convertToAbsolute = false;
+ cmOStringStream e;
+ e << "This command specifies the relative path\n"
+ << " " << unixPath << "\n"
+ << "as a link directory.\n";
+ cmPolicies* policies = this->Makefile->GetPolicies();
+ switch (this->Makefile->GetPolicyStatus(cmPolicies::CMP0015))
+ {
+ case cmPolicies::WARN:
+ e << policies->GetPolicyWarning(cmPolicies::CMP0015);
+ this->Makefile->IssueMessage(cmake::AUTHOR_WARNING, e.str());
+ case cmPolicies::OLD:
+ // OLD behavior does not convert
+ break;
+ case cmPolicies::REQUIRED_IF_USED:
+ case cmPolicies::REQUIRED_ALWAYS:
+ e << policies->GetRequiredPolicyError(cmPolicies::CMP0015);
+ this->Makefile->IssueMessage(cmake::FATAL_ERROR, e.str());
+ case cmPolicies::NEW:
+ // NEW behavior converts
+ convertToAbsolute = true;
+ break;
+ }
+ if (convertToAbsolute)
+ {
+ std::string tmp = this->Makefile->GetStartDirectory();
+ tmp += "/";
+ tmp += unixPath;
+ unixPath = tmp;
+ }
+ }
+ this->Makefile->AddLinkDirectory(unixPath.c_str());
+}