CMake/Source/cmCommand.h

177 lines
4.6 KiB
C
Raw Permalink Normal View History

Simplify CMake per-source license notices Per-source copyright/license notice headers that spell out copyright holder names and years are hard to maintain and often out-of-date or plain wrong. Precise contributor information is already maintained automatically by the version control tool. Ultimately it is the receiver of a file who is responsible for determining its licensing status, and per-source notices are merely a convenience. Therefore it is simpler and more accurate for each source to have a generic notice of the license name and references to more detailed information on copyright holders and full license terms. Our `Copyright.txt` file now contains a list of Contributors whose names appeared source-level copyright notices. It also references version control history for more precise information. Therefore we no longer need to spell out the list of Contributors in each source file notice. Replace CMake per-source copyright/license notice headers with a short description of the license and links to `Copyright.txt` and online information available from "https://cmake.org/licensing". The online URL also handles cases of modules being copied out of our source into other projects, so we can drop our notices about replacing links with full license text. Run the `Utilities/Scripts/filter-notices.bash` script to perform the majority of the replacements mechanically. Manually fix up shebang lines and trailing newlines in a few files. Manually update the notices in a few files that the script does not handle.
2016-09-27 22:01:08 +03:00
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file Copyright.txt or https://cmake.org/licensing for details. */
2001-01-18 19:20:24 +03:00
#ifndef cmCommand_h
#define cmCommand_h
#include "cmObject.h"
#include "cmCommandArgumentsHelper.h"
#include "cmListFileCache.h"
#include "cmMakefile.h"
2001-01-18 19:20:24 +03:00
/** \class cmCommand
* \brief Superclass for all commands in CMake.
*
2001-01-18 19:20:24 +03:00
* cmCommand is the base class for all commands in CMake. A command
* manifests as an entry in CMakeLists.txt and produces one or
* more makefile rules. Commands are associated with a particular
* makefile. This base class cmCommand defines the API for commands
* to support such features as enable/disable, inheritance,
2001-01-18 19:20:24 +03:00
* documentation, and construction.
*/
class cmCommand : public cmObject
{
public:
cmTypeMacro(cmCommand, cmObject);
/**
2001-01-18 19:20:24 +03:00
* Construct the command. By default it is enabled with no makefile.
*/
cmCommand()
{
2016-06-27 23:44:16 +03:00
this->Makefile = CM_NULLPTR;
this->Enabled = true;
}
/**
* Need virtual destructor to destroy real command type.
*/
2016-06-27 22:25:27 +03:00
~cmCommand() CM_OVERRIDE {}
/**
* Specify the makefile.
*/
void SetMakefile(cmMakefile* m) { this->Makefile = m; }
2006-03-15 19:02:08 +03:00
cmMakefile* GetMakefile() { return this->Makefile; }
/**
* This is called by the cmMakefile when the command is first
* encountered in the CMakeLists.txt file. It expands the command's
* arguments and then invokes the InitialPass.
*/
virtual bool InvokeInitialPass(const std::vector<cmListFileArgument>& args,
cmExecutionStatus& status)
{
std::vector<std::string> expandedArguments;
if (!this->Makefile->ExpandArguments(args, expandedArguments)) {
// There was an error expanding arguments. It was already
// reported, so we can skip this command without error.
return true;
}
return this->InitialPass(expandedArguments, status);
}
/**
2001-01-18 19:20:24 +03:00
* This is called when the command is first encountered in
* the CMakeLists.txt file.
*/
virtual bool InitialPass(std::vector<std::string> const& args,
cmExecutionStatus&) = 0;
/**
* This is called at the end after all the information
2001-01-18 19:20:24 +03:00
* specified by the command is accumulated. Most commands do
* not implement this method. At this point, reading and
* writing to the cache can be done.
*/
virtual void FinalPass() {}
/**
* Does this command have a final pass? Query after InitialPass.
*/
virtual bool HasFinalPass() const { return false; }
/**
2001-01-18 19:20:24 +03:00
* This is a virtual constructor for the command.
*/
2001-01-18 19:20:24 +03:00
virtual cmCommand* Clone() = 0;
/**
* This determines if the command is invoked when in script mode.
*/
virtual bool IsScriptable() const { return false; }
/**
* This is used to avoid including this command
* in documentation. This is mainly used by
* cmMacroHelperCommand and cmFunctionHelperCommand
* which cannot provide appropriate documentation.
*/
virtual bool ShouldAppearInDocumentation() const { return true; }
/**
2001-01-18 19:20:24 +03:00
* The name of the command as specified in CMakeList.txt.
*/
2014-02-25 05:19:17 +04:00
virtual std::string GetName() const = 0;
/**
2001-01-18 19:20:24 +03:00
* Enable the command.
*/
void EnabledOn() { this->Enabled = true; }
/**
2001-01-18 19:20:24 +03:00
* Disable the command.
*/
void EnabledOff() { this->Enabled = false; }
/**
2001-01-18 19:20:24 +03:00
* Query whether the command is enabled.
*/
bool GetEnabled() const { return this->Enabled; }
2001-01-18 19:20:24 +03:00
/**
* Disable or enable the command.
*/
void SetEnabled(bool enabled) { this->Enabled = enabled; }
2001-01-18 19:20:24 +03:00
/**
* Return the last error string.
*/
const char* GetError()
{
if (this->Error.empty()) {
this->Error = this->GetName();
this->Error += " unknown error.";
}
return this->Error.c_str();
}
/**
* Set the error message
*/
void SetError(const std::string& e)
{
2006-03-15 19:02:08 +03:00
this->Error = this->GetName();
this->Error += " ";
this->Error += e;
}
/** Check if the command is disallowed by a policy. */
bool Disallowed(cmPolicies::PolicyID pol, const char* e)
{
switch (this->Makefile->GetPolicyStatus(pol)) {
case cmPolicies::WARN:
this->Makefile->IssueMessage(cmake::AUTHOR_WARNING,
cmPolicies::GetPolicyWarning(pol));
case cmPolicies::OLD:
return false;
case cmPolicies::REQUIRED_IF_USED:
case cmPolicies::REQUIRED_ALWAYS:
case cmPolicies::NEW:
this->Makefile->IssueMessage(cmake::FATAL_ERROR, e);
break;
}
return true;
}
protected:
2006-03-15 19:02:08 +03:00
cmMakefile* Makefile;
cmCommandArgumentsHelper Helper;
private:
2006-03-15 19:02:08 +03:00
bool Enabled;
std::string Error;
};
#endif