diff options
author | Brad King <brad.king@kitware.com> | 2009-11-24 16:16:38 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2009-11-24 16:16:38 (GMT) |
commit | 02db43239b7e2fd1f6dede9fb7237470ca51b567 (patch) | |
tree | b8d176017c422f81c6122c40c24e6592d3375548 /Source/cmLinkDirectoriesCommand.cxx | |
parent | e1548142fbb582d02f2386ff8085e6372f7f3ffd (diff) | |
download | CMake-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.cxx | 44 |
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()); +} |