resolve cyclic dependency with zstd
[platform/upstream/cmake.git] / Source / cmTargetLinkDirectoriesCommand.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 "cmTargetLinkDirectoriesCommand.h"
4
5 #include "cmGeneratorExpression.h"
6 #include "cmListFileCache.h"
7 #include "cmMakefile.h"
8 #include "cmMessageType.h"
9 #include "cmStringAlgorithms.h"
10 #include "cmSystemTools.h"
11 #include "cmTarget.h"
12 #include "cmTargetPropCommandBase.h"
13
14 namespace {
15
16 class TargetLinkDirectoriesImpl : public cmTargetPropCommandBase
17 {
18 public:
19   using cmTargetPropCommandBase::cmTargetPropCommandBase;
20
21 private:
22   void HandleMissingTarget(const std::string& name) override
23   {
24     this->Makefile->IssueMessage(
25       MessageType::FATAL_ERROR,
26       cmStrCat("Cannot specify link directories for target \"", name,
27                "\" which is not built by this project."));
28   }
29
30   std::string Join(const std::vector<std::string>& content) override;
31
32   bool HandleDirectContent(cmTarget* tgt,
33                            const std::vector<std::string>& content,
34                            bool prepend, bool /*system*/) override
35   {
36     cmListFileBacktrace lfbt = this->Makefile->GetBacktrace();
37     tgt->InsertLinkDirectory(BT<std::string>(this->Join(content), lfbt),
38                              prepend);
39     return true; // Successfully handled.
40   }
41 };
42
43 std::string TargetLinkDirectoriesImpl::Join(
44   const std::vector<std::string>& content)
45 {
46   std::vector<std::string> directories;
47
48   for (const auto& dir : content) {
49     auto unixPath = dir;
50     cmSystemTools::ConvertToUnixSlashes(unixPath);
51     if (!cmSystemTools::FileIsFullPath(unixPath) &&
52         !cmGeneratorExpression::StartsWithGeneratorExpression(unixPath)) {
53       auto tmp = this->Makefile->GetCurrentSourceDirectory();
54       tmp += "/";
55       tmp += unixPath;
56       unixPath = tmp;
57     }
58     directories.push_back(unixPath);
59   }
60
61   return cmJoin(directories, ";");
62 }
63
64 } // namespace
65
66 bool cmTargetLinkDirectoriesCommand(std::vector<std::string> const& args,
67                                     cmExecutionStatus& status)
68 {
69   return TargetLinkDirectoriesImpl(status).HandleArguments(
70     args, "LINK_DIRECTORIES", TargetLinkDirectoriesImpl::PROCESS_BEFORE);
71 }