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"
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
)
26 cmMakefile
& mf
= status
.GetMakefile();
27 bool before
= mf
.IsOn("CMAKE_LINK_DIRECTORIES_BEFORE");
29 auto i
= args
.cbegin();
30 if ((*i
) == "BEFORE") {
33 } else if ((*i
) == "AFTER") {
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
);
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;
57 /* clang-format off */
58 e
<< "This command specifies the relative path\n"
59 << " " << unixPath
<< "\n"
60 << "as a link directory.\n";
62 switch (mf
.GetPolicyStatus(cmPolicies::CMP0015
)) {
63 case cmPolicies::WARN
:
64 e
<< cmPolicies::GetPolicyWarning(cmPolicies::CMP0015
);
65 mf
.IssueMessage(MessageType::AUTHOR_WARNING
, e
.str());
68 // OLD behavior does not convert
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());
76 // NEW behavior converts
77 convertToAbsolute
= true;
80 if (convertToAbsolute
) {
81 unixPath
= cmStrCat(mf
.GetCurrentSourceDirectory(), '/', unixPath
);
84 directories
.push_back(unixPath
);