| /* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying | 
 |    file Copyright.txt or https://cmake.org/licensing for details.  */ | 
 | #pragma once | 
 |  | 
 | #include "cmConfigure.h" // IWYU pragma: keep | 
 |  | 
 | #include <string> | 
 | #include <vector> | 
 |  | 
 | #include "cmsys/RegularExpression.hxx" | 
 |  | 
 | #include "cm_sys_stat.h" | 
 |  | 
 | #include "cmFileTimeCache.h" | 
 |  | 
 | class cmExecutionStatus; | 
 | class cmMakefile; | 
 |  | 
 | // File installation helper class. | 
 | struct cmFileCopier | 
 | { | 
 |   cmFileCopier(cmExecutionStatus& status, const char* name = "COPY"); | 
 |   virtual ~cmFileCopier(); | 
 |  | 
 |   bool Run(std::vector<std::string> const& args); | 
 |  | 
 | protected: | 
 |   cmExecutionStatus& Status; | 
 |   cmMakefile* Makefile; | 
 |   const char* Name; | 
 |   bool Always = false; | 
 |   cmFileTimeCache FileTimes; | 
 |  | 
 |   // Whether to install a file not matching any expression. | 
 |   bool MatchlessFiles = true; | 
 |  | 
 |   // Permissions for files and directories installed by this object. | 
 |   mode_t FilePermissions = 0; | 
 |   mode_t DirPermissions = 0; | 
 |  | 
 |   // Properties set by pattern and regex match rules. | 
 |   struct MatchProperties | 
 |   { | 
 |     bool Exclude = false; | 
 |     mode_t Permissions = 0; | 
 |   }; | 
 |   struct MatchRule | 
 |   { | 
 |     cmsys::RegularExpression Regex; | 
 |     MatchProperties Properties; | 
 |     std::string RegexString; | 
 |     MatchRule(std::string const& regex) | 
 |       : Regex(regex) | 
 |       , RegexString(regex) | 
 |     { | 
 |     } | 
 |   }; | 
 |   std::vector<MatchRule> MatchRules; | 
 |  | 
 |   // Get the properties from rules matching this input file. | 
 |   MatchProperties CollectMatchProperties(const std::string& file); | 
 |  | 
 |   bool SetPermissions(const std::string& toFile, mode_t permissions); | 
 |  | 
 |   // Translate an argument to a permissions bit. | 
 |   bool CheckPermissions(std::string const& arg, mode_t& permissions); | 
 |  | 
 |   bool InstallSymlinkChain(std::string& fromFile, std::string& toFile); | 
 |   bool InstallSymlink(const std::string& fromFile, const std::string& toFile); | 
 |   virtual bool InstallFile(const std::string& fromFile, | 
 |                            const std::string& toFile, | 
 |                            MatchProperties match_properties); | 
 |   bool InstallDirectory(const std::string& source, | 
 |                         const std::string& destination, | 
 |                         MatchProperties match_properties); | 
 |   virtual bool Install(const std::string& fromFile, const std::string& toFile); | 
 |   virtual std::string const& ToName(std::string const& fromName); | 
 |  | 
 |   enum Type | 
 |   { | 
 |     TypeFile, | 
 |     TypeDir, | 
 |     TypeLink | 
 |   }; | 
 |   virtual void ReportCopy(const std::string&, Type, bool) {} | 
 |   virtual bool ReportMissing(const std::string& fromFile); | 
 |  | 
 |   MatchRule* CurrentMatchRule = nullptr; | 
 |   bool UseGivenPermissionsFile = false; | 
 |   bool UseGivenPermissionsDir = false; | 
 |   bool UseSourcePermissions = true; | 
 |   bool FollowSymlinkChain = false; | 
 |   std::string Destination; | 
 |   std::string FilesFromDir; | 
 |   std::vector<std::string> Files; | 
 |  | 
 |   enum | 
 |   { | 
 |     DoingNone, | 
 |     DoingError, | 
 |     DoingDestination, | 
 |     DoingFilesFromDir, | 
 |     DoingFiles, | 
 |     DoingPattern, | 
 |     DoingRegex, | 
 |     DoingPermissionsFile, | 
 |     DoingPermissionsDir, | 
 |     DoingPermissionsMatch, | 
 |     DoingLast1 | 
 |   }; | 
 |   int Doing = DoingNone; | 
 |  | 
 |   virtual bool Parse(std::vector<std::string> const& args); | 
 |   virtual bool CheckKeyword(std::string const& arg); | 
 |   virtual bool CheckValue(std::string const& arg); | 
 |  | 
 |   void NotBeforeMatch(std::string const& arg); | 
 |   void NotAfterMatch(std::string const& arg); | 
 |   virtual void DefaultFilePermissions(); | 
 |   virtual void DefaultDirectoryPermissions(); | 
 |  | 
 |   bool GetDefaultDirectoryPermissions(mode_t** mode); | 
 | }; |