CMake Nightly Date Stamp
[kiteware-cmake.git] / Source / cmLinkDirectoriesCommand.cxx
blob6775a601558defc5304f25f1df0474f309deb49a
1 /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
2 file Copyright.txt or https://cmake.org/licensing for details. */
3 #include "cmLinkDirectoriesCommand.h"
5 #include <sstream>
7 #include "cmExecutionStatus.h"
8 #include "cmGeneratorExpression.h"
9 #include "cmList.h"
10 #include "cmMakefile.h"
11 #include "cmMessageType.h"
12 #include "cmPolicies.h"
13 #include "cmStringAlgorithms.h"
14 #include "cmSystemTools.h"
16 static void AddLinkDir(cmMakefile& mf, std::string const& dir,
17 std::vector<std::string>& directories);
19 bool cmLinkDirectoriesCommand(std::vector<std::string> const& args,
20 cmExecutionStatus& status)
22 if (args.empty()) {
23 return true;
26 cmMakefile& mf = status.GetMakefile();
27 bool before = mf.IsOn("CMAKE_LINK_DIRECTORIES_BEFORE");
29 auto i = args.cbegin();
30 if ((*i) == "BEFORE") {
31 before = true;
32 ++i;
33 } else if ((*i) == "AFTER") {
34 before = false;
35 ++i;
38 std::vector<std::string> directories;
39 for (; i != args.cend(); ++i) {
40 AddLinkDir(mf, *i, directories);
43 mf.AddLinkDirectory(cmList::to_string(directories), before);
45 return true;
48 static void AddLinkDir(cmMakefile& mf, std::string const& dir,
49 std::vector<std::string>& directories)
51 std::string unixPath = dir;
52 cmSystemTools::ConvertToUnixSlashes(unixPath);
53 if (!cmSystemTools::FileIsFullPath(unixPath) &&
54 !cmGeneratorExpression::StartsWithGeneratorExpression(unixPath)) {
55 bool convertToAbsolute = false;
56 std::ostringstream e;
57 /* clang-format off */
58 e << "This command specifies the relative path\n"
59 << " " << unixPath << "\n"
60 << "as a link directory.\n";
61 /* clang-format on */
62 switch (mf.GetPolicyStatus(cmPolicies::CMP0015)) {
63 case cmPolicies::WARN:
64 e << cmPolicies::GetPolicyWarning(cmPolicies::CMP0015);
65 mf.IssueMessage(MessageType::AUTHOR_WARNING, e.str());
66 CM_FALLTHROUGH;
67 case cmPolicies::OLD:
68 // OLD behavior does not convert
69 break;
70 case cmPolicies::REQUIRED_IF_USED:
71 case cmPolicies::REQUIRED_ALWAYS:
72 e << cmPolicies::GetRequiredPolicyError(cmPolicies::CMP0015);
73 mf.IssueMessage(MessageType::FATAL_ERROR, e.str());
74 CM_FALLTHROUGH;
75 case cmPolicies::NEW:
76 // NEW behavior converts
77 convertToAbsolute = true;
78 break;
80 if (convertToAbsolute) {
81 unixPath = cmStrCat(mf.GetCurrentSourceDirectory(), '/', unixPath);
84 directories.push_back(unixPath);