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"
7 #include "cmExecutionStatus.h"
8 #include "cmGeneratorExpression.h"
9 #include "cmMakefile.h"
10 #include "cmMessageType.h"
11 #include "cmPolicies.h"
12 #include "cmStringAlgorithms.h"
13 #include "cmSystemTools.h"
15 static void AddLinkDir(cmMakefile& mf, std::string const& dir,
16 std::vector<std::string>& directories);
18 bool cmLinkDirectoriesCommand(std::vector<std::string> const& args,
19 cmExecutionStatus& status)
25 cmMakefile& mf = status.GetMakefile();
26 bool before = mf.IsOn("CMAKE_LINK_DIRECTORIES_BEFORE");
28 auto i = args.cbegin();
29 if ((*i) == "BEFORE") {
32 } else if ((*i) == "AFTER") {
37 std::vector<std::string> directories;
38 for (; i != args.cend(); ++i) {
39 AddLinkDir(mf, *i, directories);
42 mf.AddLinkDirectory(cmJoin(directories, ";"), before);
47 static void AddLinkDir(cmMakefile& mf, std::string const& dir,
48 std::vector<std::string>& directories)
50 std::string unixPath = dir;
51 cmSystemTools::ConvertToUnixSlashes(unixPath);
52 if (!cmSystemTools::FileIsFullPath(unixPath) &&
53 !cmGeneratorExpression::StartsWithGeneratorExpression(unixPath)) {
54 bool convertToAbsolute = false;
56 /* clang-format off */
57 e << "This command specifies the relative path\n"
58 << " " << unixPath << "\n"
59 << "as a link directory.\n";
61 switch (mf.GetPolicyStatus(cmPolicies::CMP0015)) {
62 case cmPolicies::WARN:
63 e << cmPolicies::GetPolicyWarning(cmPolicies::CMP0015);
64 mf.IssueMessage(MessageType::AUTHOR_WARNING, e.str());
67 // OLD behavior does not convert
69 case cmPolicies::REQUIRED_IF_USED:
70 case cmPolicies::REQUIRED_ALWAYS:
71 e << cmPolicies::GetRequiredPolicyError(cmPolicies::CMP0015);
72 mf.IssueMessage(MessageType::FATAL_ERROR, e.str());
75 // NEW behavior converts
76 convertToAbsolute = true;
79 if (convertToAbsolute) {
80 unixPath = cmStrCat(mf.GetCurrentSourceDirectory(), '/', unixPath);
83 directories.push_back(unixPath);