resolve cyclic dependency with zstd
[platform/upstream/cmake.git] / Source / cmLinkDirectoriesCommand.cxx
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"
4
5 #include <sstream>
6
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"
14
15 static void AddLinkDir(cmMakefile& mf, std::string const& dir,
16                        std::vector<std::string>& directories);
17
18 bool cmLinkDirectoriesCommand(std::vector<std::string> const& args,
19                               cmExecutionStatus& status)
20 {
21   if (args.empty()) {
22     return true;
23   }
24
25   cmMakefile& mf = status.GetMakefile();
26   bool before = mf.IsOn("CMAKE_LINK_DIRECTORIES_BEFORE");
27
28   auto i = args.cbegin();
29   if ((*i) == "BEFORE") {
30     before = true;
31     ++i;
32   } else if ((*i) == "AFTER") {
33     before = false;
34     ++i;
35   }
36
37   std::vector<std::string> directories;
38   for (; i != args.cend(); ++i) {
39     AddLinkDir(mf, *i, directories);
40   }
41
42   mf.AddLinkDirectory(cmJoin(directories, ";"), before);
43
44   return true;
45 }
46
47 static void AddLinkDir(cmMakefile& mf, std::string const& dir,
48                        std::vector<std::string>& directories)
49 {
50   std::string unixPath = dir;
51   cmSystemTools::ConvertToUnixSlashes(unixPath);
52   if (!cmSystemTools::FileIsFullPath(unixPath) &&
53       !cmGeneratorExpression::StartsWithGeneratorExpression(unixPath)) {
54     bool convertToAbsolute = false;
55     std::ostringstream e;
56     /* clang-format off */
57     e << "This command specifies the relative path\n"
58       << "  " << unixPath << "\n"
59       << "as a link directory.\n";
60     /* clang-format on */
61     switch (mf.GetPolicyStatus(cmPolicies::CMP0015)) {
62       case cmPolicies::WARN:
63         e << cmPolicies::GetPolicyWarning(cmPolicies::CMP0015);
64         mf.IssueMessage(MessageType::AUTHOR_WARNING, e.str());
65         CM_FALLTHROUGH;
66       case cmPolicies::OLD:
67         // OLD behavior does not convert
68         break;
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());
73         CM_FALLTHROUGH;
74       case cmPolicies::NEW:
75         // NEW behavior converts
76         convertToAbsolute = true;
77         break;
78     }
79     if (convertToAbsolute) {
80       unixPath = cmStrCat(mf.GetCurrentSourceDirectory(), '/', unixPath);
81     }
82   }
83   directories.push_back(unixPath);
84 }