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 "cmInstallSubdirectoryGenerator.h"
4
5 #include <memory>
6 #include <sstream>
7 #include <utility>
8 #include <vector>
9
10 #include "cmLocalGenerator.h"
11 #include "cmMakefile.h"
12 #include "cmPolicies.h"
13 #include "cmScriptGenerator.h"
14 #include "cmSystemTools.h"
15
cmInstallSubdirectoryGenerator(cmMakefile * makefile,std::string binaryDirectory,cmListFileBacktrace backtrace)16 cmInstallSubdirectoryGenerator::cmInstallSubdirectoryGenerator(
17 cmMakefile* makefile, std::string binaryDirectory,
18 cmListFileBacktrace backtrace)
19 : cmInstallGenerator("", std::vector<std::string>(), "", MessageDefault,
20 false, false, std::move(backtrace))
21 , Makefile(makefile)
22 , BinaryDirectory(std::move(binaryDirectory))
23 {
24 }
25
26 cmInstallSubdirectoryGenerator::~cmInstallSubdirectoryGenerator() = default;
27
HaveInstall()28 bool cmInstallSubdirectoryGenerator::HaveInstall()
29 {
30 for (const auto& generator : this->Makefile->GetInstallGenerators()) {
31 if (generator->HaveInstall()) {
32 return true;
33 }
34 }
35
36 return false;
37 }
38
CheckCMP0082(bool & haveSubdirectoryInstall,bool &)39 void cmInstallSubdirectoryGenerator::CheckCMP0082(
40 bool& haveSubdirectoryInstall, bool& /*unused*/)
41 {
42 if (this->HaveInstall()) {
43 haveSubdirectoryInstall = true;
44 }
45 }
46
Compute(cmLocalGenerator * lg)47 bool cmInstallSubdirectoryGenerator::Compute(cmLocalGenerator* lg)
48 {
49 this->LocalGenerator = lg;
50 return true;
51 }
52
GenerateScript(std::ostream & os)53 void cmInstallSubdirectoryGenerator::GenerateScript(std::ostream& os)
54 {
55 if (!this->Makefile->GetPropertyAsBool("EXCLUDE_FROM_ALL")) {
56 cmPolicies::PolicyStatus status =
57 this->LocalGenerator->GetPolicyStatus(cmPolicies::CMP0082);
58 switch (status) {
59 case cmPolicies::WARN:
60 CM_FALLTHROUGH;
61 case cmPolicies::OLD:
62 // OLD behavior is handled in cmLocalGenerator::GenerateInstallRules()
63 break;
64
65 case cmPolicies::NEW:
66 case cmPolicies::REQUIRED_IF_USED:
67 case cmPolicies::REQUIRED_ALWAYS: {
68 Indent indent;
69 std::string odir = this->BinaryDirectory;
70 cmSystemTools::ConvertToUnixSlashes(odir);
71 os << indent << "if(NOT CMAKE_INSTALL_LOCAL_ONLY)\n"
72 << indent.Next()
73 << "# Include the install script for the subdirectory.\n"
74 << indent.Next() << "include(\"" << odir
75 << "/cmake_install.cmake\")\n"
76 << indent << "endif()\n\n";
77 } break;
78 }
79 }
80 }
81