cmake/Source/cmFileCopier.h

124 lines
3.4 KiB
C
Raw Normal View History

2019-11-11 23:01:05 +01:00
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file Copyright.txt or https://cmake.org/licensing for details. */
2021-09-14 00:13:48 +02:00
#pragma once
2019-11-11 23:01:05 +01:00
#include "cmConfigure.h" // IWYU pragma: keep
#include <string>
#include <vector>
2020-02-01 23:06:01 +01:00
#include "cmsys/RegularExpression.hxx"
#include "cm_sys_stat.h"
#include "cmFileTimeCache.h"
class cmExecutionStatus;
2019-11-11 23:01:05 +01:00
class cmMakefile;
// File installation helper class.
struct cmFileCopier
{
2020-02-01 23:06:01 +01:00
cmFileCopier(cmExecutionStatus& status, const char* name = "COPY");
2019-11-11 23:01:05 +01:00
virtual ~cmFileCopier();
bool Run(std::vector<std::string> const& args);
protected:
2020-02-01 23:06:01 +01:00
cmExecutionStatus& Status;
2019-11-11 23:01:05 +01:00
cmMakefile* Makefile;
const char* Name;
2022-08-04 22:12:04 +02:00
bool Always = false;
2019-11-11 23:01:05 +01:00
cmFileTimeCache FileTimes;
// Whether to install a file not matching any expression.
2022-08-04 22:12:04 +02:00
bool MatchlessFiles = true;
2019-11-11 23:01:05 +01:00
// Permissions for files and directories installed by this object.
2022-08-04 22:12:04 +02:00
mode_t FilePermissions = 0;
mode_t DirPermissions = 0;
2019-11-11 23:01:05 +01:00
// 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);
2021-11-20 13:41:27 +01:00
virtual bool InstallFile(const std::string& fromFile,
const std::string& toFile,
MatchProperties match_properties);
2019-11-11 23:01:05 +01:00
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);
2022-08-04 22:12:04 +02:00
MatchRule* CurrentMatchRule = nullptr;
bool UseGivenPermissionsFile = false;
bool UseGivenPermissionsDir = false;
bool UseSourcePermissions = true;
bool FollowSymlinkChain = false;
2019-11-11 23:01:05 +01:00
std::string Destination;
std::string FilesFromDir;
std::vector<std::string> Files;
enum
{
DoingNone,
DoingError,
DoingDestination,
DoingFilesFromDir,
DoingFiles,
DoingPattern,
DoingRegex,
DoingPermissionsFile,
DoingPermissionsDir,
DoingPermissionsMatch,
DoingLast1
};
2022-08-04 22:12:04 +02:00
int Doing = DoingNone;
virtual bool Parse(std::vector<std::string> const& args);
2019-11-11 23:01:05 +01:00
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);
};