cmInstallFilesGenerator.cxx 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  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 "cmInstallFilesGenerator.h"
  4. #include <utility>
  5. #include "cmGeneratorExpression.h"
  6. #include "cmInstallType.h"
  7. #include "cmStringAlgorithms.h"
  8. class cmLocalGenerator;
  9. cmInstallFilesGenerator::cmInstallFilesGenerator(
  10. std::vector<std::string> const& files, std::string const& dest,
  11. bool programs, std::string file_permissions,
  12. std::vector<std::string> const& configurations, std::string const& component,
  13. MessageLevel message, bool exclude_from_all, std::string rename,
  14. bool optional)
  15. : cmInstallGenerator(dest, configurations, component, message,
  16. exclude_from_all)
  17. , LocalGenerator(nullptr)
  18. , Files(files)
  19. , FilePermissions(std::move(file_permissions))
  20. , Rename(std::move(rename))
  21. , Programs(programs)
  22. , Optional(optional)
  23. {
  24. // We need per-config actions if the destination has generator expressions.
  25. if (cmGeneratorExpression::Find(this->Destination) != std::string::npos) {
  26. this->ActionsPerConfig = true;
  27. }
  28. // We need per-config actions if any directories have generator expressions.
  29. if (!this->ActionsPerConfig) {
  30. for (std::string const& file : files) {
  31. if (cmGeneratorExpression::Find(file) != std::string::npos) {
  32. this->ActionsPerConfig = true;
  33. break;
  34. }
  35. }
  36. }
  37. }
  38. cmInstallFilesGenerator::~cmInstallFilesGenerator() = default;
  39. bool cmInstallFilesGenerator::Compute(cmLocalGenerator* lg)
  40. {
  41. this->LocalGenerator = lg;
  42. return true;
  43. }
  44. std::string cmInstallFilesGenerator::GetDestination(
  45. std::string const& config) const
  46. {
  47. return cmGeneratorExpression::Evaluate(this->Destination,
  48. this->LocalGenerator, config);
  49. }
  50. void cmInstallFilesGenerator::AddFilesInstallRule(
  51. std::ostream& os, std::string const& config, Indent indent,
  52. std::vector<std::string> const& files)
  53. {
  54. // Write code to install the files.
  55. const char* no_dir_permissions = nullptr;
  56. this->AddInstallRule(
  57. os, this->GetDestination(config),
  58. (this->Programs ? cmInstallType_PROGRAMS : cmInstallType_FILES), files,
  59. this->Optional, this->FilePermissions.c_str(), no_dir_permissions,
  60. this->Rename.c_str(), nullptr, indent);
  61. }
  62. void cmInstallFilesGenerator::GenerateScriptActions(std::ostream& os,
  63. Indent indent)
  64. {
  65. if (this->ActionsPerConfig) {
  66. this->cmInstallGenerator::GenerateScriptActions(os, indent);
  67. } else {
  68. this->AddFilesInstallRule(os, "", indent, this->Files);
  69. }
  70. }
  71. void cmInstallFilesGenerator::GenerateScriptForConfig(
  72. std::ostream& os, const std::string& config, Indent indent)
  73. {
  74. std::vector<std::string> files;
  75. for (std::string const& f : this->Files) {
  76. cmExpandList(
  77. cmGeneratorExpression::Evaluate(f, this->LocalGenerator, config), files);
  78. }
  79. this->AddFilesInstallRule(os, config, indent, files);
  80. }