1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173
|
/* 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 <string>
#include <utility>
#include <vector>
#include "cmCustomCommandLines.h"
#include "cmListFileCache.h"
#include "cmPolicies.h"
class cmImplicitDependsList
: public std::vector<std::pair<std::string, std::string>>
{
};
class cmStateSnapshot;
/** \class cmCustomCommand
* \brief A class to encapsulate a custom command
*
* cmCustomCommand encapsulates the properties of a custom command
*/
class cmCustomCommand
{
public:
/** Get the output file produced by the command. */
std::vector<std::string> const& GetOutputs() const;
void SetOutputs(std::vector<std::string> outputs);
void SetOutputs(std::string output);
/** Get the extra files produced by the command. */
std::vector<std::string> const& GetByproducts() const;
void SetByproducts(std::vector<std::string> byproducts);
/** Get the vector that holds the list of dependencies. */
std::vector<std::string> const& GetDepends() const;
void SetDepends(std::vector<std::string> depends);
bool HasMainDependency() const { return this->HasMainDependency_; }
std::string const& GetMainDependency() const;
void SetMainDependency(std::string main_dependency);
/** Get the working directory. */
std::string const& GetWorkingDirectory() const
{
return this->WorkingDirectory;
}
void SetWorkingDirectory(char const* workingDirectory)
{
this->WorkingDirectory = (workingDirectory ? workingDirectory : "");
}
/** Get the list of command lines. */
cmCustomCommandLines const& GetCommandLines() const;
void SetCommandLines(cmCustomCommandLines commandLines);
/** Get the comment string for the command. */
char const* GetComment() const;
void SetComment(char const* comment);
/** Get a value indicating if the command uses UTF-8 output pipes. */
bool GetStdPipesUTF8() const { return this->StdPipesUTF8; }
void SetStdPipesUTF8(bool stdPipesUTF8)
{
this->StdPipesUTF8 = stdPipesUTF8;
}
/** Append to the list of command lines. */
void AppendCommands(cmCustomCommandLines const& commandLines);
/** Append to the list of dependencies. */
void AppendDepends(std::vector<std::string> const& depends);
/** Set/Get whether old-style escaping should be used. */
bool GetEscapeOldStyle() const;
void SetEscapeOldStyle(bool b);
/** Set/Get whether the build tool can replace variables in
arguments to the command. */
bool GetEscapeAllowMakeVars() const;
void SetEscapeAllowMakeVars(bool b);
/** Backtrace of the command that created this custom command. */
cmListFileBacktrace const& GetBacktrace() const;
void SetBacktrace(cmListFileBacktrace lfbt);
void SetImplicitDepends(cmImplicitDependsList const&);
void AppendImplicitDepends(cmImplicitDependsList const&);
cmImplicitDependsList const& GetImplicitDepends() const;
/** Set/Get whether this custom command should be given access to the
real console (if possible). */
bool GetUsesTerminal() const;
void SetUsesTerminal(bool b);
/** Set/Get whether lists in command lines should be expanded. */
bool GetCommandExpandLists() const;
void SetCommandExpandLists(bool b);
/** Set/Get whether to use additional dependencies coming from
users of OUTPUT of the custom command. */
bool GetDependsExplicitOnly() const;
void SetDependsExplicitOnly(bool b);
/** Set/Get the depfile (used by the Ninja generator) */
std::string const& GetDepfile() const;
void SetDepfile(std::string const& depfile);
/** Set/Get the job_pool (used by the Ninja generator) */
std::string const& GetJobPool() const;
void SetJobPool(std::string const& job_pool);
/** Set/Get whether this custom command should be given access to the
jobserver (if possible). */
bool GetJobserverAware() const;
void SetJobserverAware(bool b);
#define DECLARE_CC_POLICY_ACCESSOR(P) \
cmPolicies::PolicyStatus Get##P##Status() const;
CM_FOR_EACH_CUSTOM_COMMAND_POLICY(DECLARE_CC_POLICY_ACCESSOR)
#undef DECLARE_CC_POLICY_ACCESSOR
/** Record policy values from state snapshot */
void RecordPolicyValues(cmStateSnapshot const& snapshot);
/** Set/Get the associated target */
std::string const& GetTarget() const;
void SetTarget(std::string const& target);
/** Set/Get the custom command rolee */
std::string const& GetRole() const;
void SetRole(std::string const& role);
/** Record if the custom command can be used for code generation. */
bool GetCodegen() const { return Codegen; }
void SetCodegen(bool b) { Codegen = b; }
private:
std::vector<std::string> Outputs;
std::vector<std::string> Byproducts;
std::vector<std::string> Depends;
cmCustomCommandLines CommandLines;
cmListFileBacktrace Backtrace;
cmImplicitDependsList ImplicitDepends;
std::string Target;
std::string Comment;
std::string WorkingDirectory;
std::string Depfile;
std::string JobPool;
std::string Role;
bool JobserverAware = false;
bool HaveComment = false;
bool EscapeAllowMakeVars = false;
bool EscapeOldStyle = true;
bool UsesTerminal = false;
bool CommandExpandLists = false;
bool StdPipesUTF8 = false;
bool HasMainDependency_ = false;
bool DependsExplicitOnly = false;
bool Codegen = false;
// Policies are NEW for synthesized custom commands, and set by cmMakefile for
// user-created custom commands.
#define DECLARE_CC_POLICY_FIELD(P) \
cmPolicies::PolicyStatus P##Status = cmPolicies::NEW;
CM_FOR_EACH_CUSTOM_COMMAND_POLICY(DECLARE_CC_POLICY_FIELD)
#undef DECLARE_CC_POLICY_FIELD
};
|