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