cmFileCopier.h 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
  2. file Copyright.txt or https://cmake.org/licensing for details. */
  3. #pragma once
  4. #include "cmConfigure.h" // IWYU pragma: keep
  5. #include <string>
  6. #include <vector>
  7. #include "cmsys/RegularExpression.hxx"
  8. #include "cm_sys_stat.h"
  9. #include "cmFileTimeCache.h"
  10. class cmExecutionStatus;
  11. class cmMakefile;
  12. // File installation helper class.
  13. struct cmFileCopier
  14. {
  15. cmFileCopier(cmExecutionStatus& status, const char* name = "COPY");
  16. virtual ~cmFileCopier();
  17. bool Run(std::vector<std::string> const& args);
  18. protected:
  19. cmExecutionStatus& Status;
  20. cmMakefile* Makefile;
  21. const char* Name;
  22. bool Always = false;
  23. cmFileTimeCache FileTimes;
  24. // Whether to install a file not matching any expression.
  25. bool MatchlessFiles = true;
  26. // Permissions for files and directories installed by this object.
  27. mode_t FilePermissions = 0;
  28. mode_t DirPermissions = 0;
  29. // Properties set by pattern and regex match rules.
  30. struct MatchProperties
  31. {
  32. bool Exclude = false;
  33. mode_t Permissions = 0;
  34. };
  35. struct MatchRule
  36. {
  37. cmsys::RegularExpression Regex;
  38. MatchProperties Properties;
  39. std::string RegexString;
  40. MatchRule(std::string const& regex)
  41. : Regex(regex)
  42. , RegexString(regex)
  43. {
  44. }
  45. };
  46. std::vector<MatchRule> MatchRules;
  47. // Get the properties from rules matching this input file.
  48. MatchProperties CollectMatchProperties(const std::string& file);
  49. bool SetPermissions(const std::string& toFile, mode_t permissions);
  50. // Translate an argument to a permissions bit.
  51. bool CheckPermissions(std::string const& arg, mode_t& permissions);
  52. bool InstallSymlinkChain(std::string& fromFile, std::string& toFile);
  53. bool InstallSymlink(const std::string& fromFile, const std::string& toFile);
  54. virtual bool InstallFile(const std::string& fromFile,
  55. const std::string& toFile,
  56. MatchProperties match_properties);
  57. bool InstallDirectory(const std::string& source,
  58. const std::string& destination,
  59. MatchProperties match_properties);
  60. virtual bool Install(const std::string& fromFile, const std::string& toFile);
  61. virtual std::string const& ToName(std::string const& fromName);
  62. enum Type
  63. {
  64. TypeFile,
  65. TypeDir,
  66. TypeLink
  67. };
  68. virtual void ReportCopy(const std::string&, Type, bool) {}
  69. virtual bool ReportMissing(const std::string& fromFile);
  70. MatchRule* CurrentMatchRule = nullptr;
  71. bool UseGivenPermissionsFile = false;
  72. bool UseGivenPermissionsDir = false;
  73. bool UseSourcePermissions = true;
  74. bool FollowSymlinkChain = false;
  75. std::string Destination;
  76. std::string FilesFromDir;
  77. std::vector<std::string> Files;
  78. enum
  79. {
  80. DoingNone,
  81. DoingError,
  82. DoingDestination,
  83. DoingFilesFromDir,
  84. DoingFiles,
  85. DoingPattern,
  86. DoingRegex,
  87. DoingPermissionsFile,
  88. DoingPermissionsDir,
  89. DoingPermissionsMatch,
  90. DoingLast1
  91. };
  92. int Doing = DoingNone;
  93. virtual bool Parse(std::vector<std::string> const& args);
  94. virtual bool CheckKeyword(std::string const& arg);
  95. virtual bool CheckValue(std::string const& arg);
  96. void NotBeforeMatch(std::string const& arg);
  97. void NotAfterMatch(std::string const& arg);
  98. virtual void DefaultFilePermissions();
  99. virtual void DefaultDirectoryPermissions();
  100. bool GetDefaultDirectoryPermissions(mode_t** mode);
  101. };