/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying file LICENSE.rst or https://cmake.org/licensing for details. */ #pragma once #include "cmConfigure.h" // IWYU pragma: keep #include #include #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, char const* name = "COPY"); virtual ~cmFileCopier(); bool Run(std::vector const& args); protected: cmExecutionStatus& Status; cmMakefile* Makefile; char const* 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 MatchRules; // Get the properties from rules matching this input file. MatchProperties CollectMatchProperties(std::string const& file); bool SetPermissions(std::string const& 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(std::string const& fromFile, std::string const& toFile); virtual bool InstallFile(std::string const& fromFile, std::string const& toFile, MatchProperties match_properties); bool InstallDirectory(std::string const& source, std::string const& destination, MatchProperties match_properties); virtual bool Install(std::string const& fromFile, std::string const& toFile); virtual std::string const& ToName(std::string const& fromName); enum Type { TypeFile, TypeDir, TypeLink }; virtual void ReportCopy(std::string const&, Type, bool) {} virtual bool ReportMissing(std::string const& fromFile); MatchRule* CurrentMatchRule = nullptr; bool UseGivenPermissionsFile = false; bool UseGivenPermissionsDir = false; bool UseSourcePermissions = true; bool FollowSymlinkChain = false; std::string Destination; std::string FilesFromDir; std::vector Files; enum { DoingNone, DoingError, DoingDestination, DoingFilesFromDir, DoingFiles, DoingPattern, DoingRegex, DoingPermissionsFile, DoingPermissionsDir, DoingPermissionsMatch, DoingLast1 }; int Doing = DoingNone; virtual bool Parse(std::vector 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); };