cmInstallSubdirectoryGenerator.cxx 2.3 KB

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