cmInstallSubdirectoryGenerator.cxx 2.2 KB

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