cmInstallSubdirectoryGenerator.cxx 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  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 "cmLocalGenerator.h"
  5. #include "cmMakefile.h"
  6. #include "cmPolicies.h"
  7. #include "cmScriptGenerator.h"
  8. #include "cmSystemTools.h"
  9. #include <sstream>
  10. #include <vector>
  11. cmInstallSubdirectoryGenerator::cmInstallSubdirectoryGenerator(
  12. cmMakefile* makefile, const char* binaryDirectory, bool excludeFromAll)
  13. : cmInstallGenerator(nullptr, std::vector<std::string>(), nullptr,
  14. MessageDefault, excludeFromAll)
  15. , Makefile(makefile)
  16. , BinaryDirectory(binaryDirectory)
  17. {
  18. }
  19. cmInstallSubdirectoryGenerator::~cmInstallSubdirectoryGenerator()
  20. {
  21. }
  22. bool cmInstallSubdirectoryGenerator::HaveInstall()
  23. {
  24. for (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. void cmInstallSubdirectoryGenerator::Compute(cmLocalGenerator* lg)
  39. {
  40. this->LocalGenerator = lg;
  41. }
  42. void cmInstallSubdirectoryGenerator::GenerateScript(std::ostream& os)
  43. {
  44. if (!this->ExcludeFromAll) {
  45. cmPolicies::PolicyStatus status =
  46. this->LocalGenerator->GetPolicyStatus(cmPolicies::CMP0082);
  47. switch (status) {
  48. case cmPolicies::WARN:
  49. case cmPolicies::OLD:
  50. // OLD behavior is handled in cmLocalGenerator::GenerateInstallRules()
  51. break;
  52. case cmPolicies::NEW:
  53. case cmPolicies::REQUIRED_IF_USED:
  54. case cmPolicies::REQUIRED_ALWAYS: {
  55. Indent indent;
  56. std::string odir = this->BinaryDirectory;
  57. cmSystemTools::ConvertToUnixSlashes(odir);
  58. os << indent << "if(NOT CMAKE_INSTALL_LOCAL_ONLY)\n"
  59. << indent.Next()
  60. << "# Include the install script for the subdirectory.\n"
  61. << indent.Next() << "include(\"" << odir
  62. << "/cmake_install.cmake\")\n"
  63. << indent << "endif()\n\n";
  64. } break;
  65. }
  66. }
  67. }