mirror of
https://github.com/Kitware/CMake.git
synced 2026-02-16 20:21:41 -06:00
Retire cmCommandArgumentsHelper
This commit is contained in:
committed by
Kyle Edwards
parent
f5acecaa6f
commit
45edf1ad66
@@ -445,8 +445,6 @@ set(SRCS
|
||||
cmCMakeMinimumRequired.h
|
||||
cmCMakePolicyCommand.cxx
|
||||
cmCMakePolicyCommand.h
|
||||
cmCommandArgumentsHelper.cxx
|
||||
cmCommandArgumentsHelper.h
|
||||
cmConditionEvaluator.cxx
|
||||
cmConditionEvaluator.h
|
||||
cmConfigureFileCommand.cxx
|
||||
|
||||
@@ -1,233 +0,0 @@
|
||||
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
||||
file Copyright.txt or https://cmake.org/licensing for details. */
|
||||
#include "cmCommandArgumentsHelper.h"
|
||||
|
||||
cmCommandArgument::cmCommandArgument(cmCommandArgumentsHelper* args,
|
||||
const char* key,
|
||||
cmCommandArgumentGroup* group)
|
||||
: Key(key)
|
||||
, Group(group)
|
||||
, WasActive(false)
|
||||
, ArgumentsBeforeEmpty(true)
|
||||
, CurrentIndex(0)
|
||||
{
|
||||
if (args != nullptr) {
|
||||
args->AddArgument(this);
|
||||
}
|
||||
|
||||
if (this->Group != nullptr) {
|
||||
this->Group->ContainedArguments.push_back(this);
|
||||
}
|
||||
}
|
||||
|
||||
void cmCommandArgument::Reset()
|
||||
{
|
||||
this->WasActive = false;
|
||||
this->CurrentIndex = 0;
|
||||
this->DoReset();
|
||||
}
|
||||
|
||||
void cmCommandArgument::Follows(const cmCommandArgument* arg)
|
||||
{
|
||||
this->ArgumentsBeforeEmpty = false;
|
||||
this->ArgumentsBefore.insert(arg);
|
||||
}
|
||||
|
||||
void cmCommandArgument::FollowsGroup(const cmCommandArgumentGroup* group)
|
||||
{
|
||||
if (group != nullptr) {
|
||||
this->ArgumentsBeforeEmpty = false;
|
||||
this->ArgumentsBefore.insert(group->ContainedArguments.begin(),
|
||||
group->ContainedArguments.end());
|
||||
}
|
||||
}
|
||||
|
||||
bool cmCommandArgument::MayFollow(const cmCommandArgument* current) const
|
||||
{
|
||||
if (this->ArgumentsBeforeEmpty) {
|
||||
return true;
|
||||
}
|
||||
return this->ArgumentsBefore.find(current) != this->ArgumentsBefore.end();
|
||||
}
|
||||
|
||||
bool cmCommandArgument::KeyMatches(const std::string& key) const
|
||||
{
|
||||
if ((this->Key == nullptr) || (this->Key[0] == '\0')) {
|
||||
return true;
|
||||
}
|
||||
return (key == this->Key);
|
||||
}
|
||||
|
||||
void cmCommandArgument::ApplyOwnGroup()
|
||||
{
|
||||
if (this->Group != nullptr) {
|
||||
for (cmCommandArgument* cargs : this->Group->ContainedArguments) {
|
||||
if (cargs != this) {
|
||||
this->ArgumentsBefore.insert(cargs);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void cmCommandArgument::Activate()
|
||||
{
|
||||
this->WasActive = true;
|
||||
this->CurrentIndex = 0;
|
||||
}
|
||||
|
||||
bool cmCommandArgument::Consume(const std::string& arg)
|
||||
{
|
||||
bool res = this->DoConsume(arg, this->CurrentIndex);
|
||||
this->CurrentIndex++;
|
||||
return res;
|
||||
}
|
||||
|
||||
cmCAStringVector::cmCAStringVector(cmCommandArgumentsHelper* args,
|
||||
const char* key,
|
||||
cmCommandArgumentGroup* group)
|
||||
: cmCommandArgument(args, key, group)
|
||||
, Ignore(nullptr)
|
||||
{
|
||||
if ((key == nullptr) || (*key == 0)) {
|
||||
this->DataStart = 0;
|
||||
} else {
|
||||
this->DataStart = 1;
|
||||
}
|
||||
}
|
||||
|
||||
bool cmCAStringVector::DoConsume(const std::string& arg, unsigned int index)
|
||||
{
|
||||
if (index >= this->DataStart) {
|
||||
if ((this->Ignore == nullptr) || (arg != this->Ignore)) {
|
||||
this->Vector.push_back(arg);
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void cmCAStringVector::DoReset()
|
||||
{
|
||||
this->Vector.clear();
|
||||
}
|
||||
|
||||
cmCAString::cmCAString(cmCommandArgumentsHelper* args, const char* key,
|
||||
cmCommandArgumentGroup* group)
|
||||
: cmCommandArgument(args, key, group)
|
||||
{
|
||||
if ((key == nullptr) || (*key == 0)) {
|
||||
this->DataStart = 0;
|
||||
} else {
|
||||
this->DataStart = 1;
|
||||
}
|
||||
}
|
||||
|
||||
bool cmCAString::DoConsume(const std::string& arg, unsigned int index)
|
||||
{
|
||||
if (index == this->DataStart) {
|
||||
this->String = arg;
|
||||
}
|
||||
|
||||
return index >= this->DataStart;
|
||||
}
|
||||
|
||||
void cmCAString::DoReset()
|
||||
{
|
||||
this->String.clear();
|
||||
}
|
||||
|
||||
cmCAEnabler::cmCAEnabler(cmCommandArgumentsHelper* args, const char* key,
|
||||
cmCommandArgumentGroup* group)
|
||||
: cmCommandArgument(args, key, group)
|
||||
, Enabled(false)
|
||||
{
|
||||
}
|
||||
|
||||
bool cmCAEnabler::DoConsume(const std::string&, unsigned int index)
|
||||
{
|
||||
if (index == 0) {
|
||||
this->Enabled = true;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void cmCAEnabler::DoReset()
|
||||
{
|
||||
this->Enabled = false;
|
||||
}
|
||||
|
||||
cmCADisabler::cmCADisabler(cmCommandArgumentsHelper* args, const char* key,
|
||||
cmCommandArgumentGroup* group)
|
||||
: cmCommandArgument(args, key, group)
|
||||
, Enabled(true)
|
||||
{
|
||||
}
|
||||
|
||||
bool cmCADisabler::DoConsume(const std::string&, unsigned int index)
|
||||
{
|
||||
if (index == 0) {
|
||||
this->Enabled = false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void cmCADisabler::DoReset()
|
||||
{
|
||||
this->Enabled = true;
|
||||
}
|
||||
|
||||
void cmCommandArgumentGroup::Follows(const cmCommandArgument* arg)
|
||||
{
|
||||
for (cmCommandArgument* ca : this->ContainedArguments) {
|
||||
ca->Follows(arg);
|
||||
}
|
||||
}
|
||||
|
||||
void cmCommandArgumentGroup::FollowsGroup(const cmCommandArgumentGroup* group)
|
||||
{
|
||||
for (cmCommandArgument* ca : this->ContainedArguments) {
|
||||
ca->FollowsGroup(group);
|
||||
}
|
||||
}
|
||||
|
||||
void cmCommandArgumentsHelper::Parse(const std::vector<std::string>* args,
|
||||
std::vector<std::string>* unconsumedArgs)
|
||||
{
|
||||
if (args == nullptr) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (cmCommandArgument* ca : this->Arguments) {
|
||||
ca->ApplyOwnGroup();
|
||||
ca->Reset();
|
||||
}
|
||||
|
||||
cmCommandArgument* activeArgument = nullptr;
|
||||
const cmCommandArgument* previousArgument = nullptr;
|
||||
for (std::string const& it : *args) {
|
||||
for (cmCommandArgument* ca : this->Arguments) {
|
||||
if (ca->KeyMatches(it) && (ca->MayFollow(previousArgument))) {
|
||||
activeArgument = ca;
|
||||
activeArgument->Activate();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (activeArgument) {
|
||||
bool argDone = activeArgument->Consume(it);
|
||||
previousArgument = activeArgument;
|
||||
if (argDone) {
|
||||
activeArgument = nullptr;
|
||||
}
|
||||
} else {
|
||||
if (unconsumedArgs != nullptr) {
|
||||
unconsumedArgs->push_back(it);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void cmCommandArgumentsHelper::AddArgument(cmCommandArgument* arg)
|
||||
{
|
||||
this->Arguments.push_back(arg);
|
||||
}
|
||||
@@ -1,194 +0,0 @@
|
||||
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
||||
file Copyright.txt or https://cmake.org/licensing for details. */
|
||||
#ifndef cmCommandArgumentsHelper_h
|
||||
#define cmCommandArgumentsHelper_h
|
||||
|
||||
#include "cmConfigure.h" // IWYU pragma: keep
|
||||
|
||||
#include <set>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
class cmCommandArgumentGroup;
|
||||
class cmCommandArgumentsHelper;
|
||||
|
||||
/* cmCommandArgumentsHelper, cmCommandArgumentGroup and cmCommandArgument (i.e.
|
||||
its derived classes cmCAXXX can be used to simplify the processing of
|
||||
arguments to cmake commands. Maybe they can also be used to generate
|
||||
documentation.
|
||||
|
||||
For every argument supported by a command one cmCommandArgument is created
|
||||
and added to cmCommandArgumentsHelper. cmCommand has a cmCommandArgumentsHelper
|
||||
as member variable so this should be used.
|
||||
|
||||
The order of the arguments is defined using the Follows(arg) method. It says
|
||||
that this argument follows immediateley the given argument. It can be used
|
||||
with multiple arguments if the argument can follow after different arguments.
|
||||
|
||||
Arguments can be arranged in groups using cmCommandArgumentGroup. Every
|
||||
member of a group can follow any other member of the group. These groups
|
||||
can also be used to define the order.
|
||||
|
||||
Once all arguments and groups are set up, cmCommandArgumentsHelper::Parse()
|
||||
is called and afterwards the values of the arguments can be evaluated.
|
||||
|
||||
For an example see cmExportCommand.cxx.
|
||||
*/
|
||||
class cmCommandArgument
|
||||
{
|
||||
public:
|
||||
cmCommandArgument(cmCommandArgumentsHelper* args, const char* key,
|
||||
cmCommandArgumentGroup* group = nullptr);
|
||||
virtual ~cmCommandArgument() = default;
|
||||
|
||||
/// this argument may follow after arg. 0 means it comes first.
|
||||
void Follows(const cmCommandArgument* arg);
|
||||
|
||||
/// this argument may follow after any of the arguments in the given group
|
||||
void FollowsGroup(const cmCommandArgumentGroup* group);
|
||||
|
||||
/// Returns true if the argument was found in the argument list
|
||||
bool WasFound() const { return this->WasActive; }
|
||||
|
||||
// The following methods are only called from
|
||||
// cmCommandArgumentsHelper::Parse(), but making this a friend would
|
||||
// give it access to everything
|
||||
|
||||
/// Make the current argument the currently active argument
|
||||
void Activate();
|
||||
/// Consume the current string
|
||||
bool Consume(const std::string& arg);
|
||||
|
||||
/// Return true if this argument may follow after the given argument.
|
||||
bool MayFollow(const cmCommandArgument* current) const;
|
||||
|
||||
/** Returns true if the given key matches the key for this argument.
|
||||
If this argument has an empty key everything matches. */
|
||||
bool KeyMatches(const std::string& key) const;
|
||||
|
||||
/// Make this argument follow all members of the own group
|
||||
void ApplyOwnGroup();
|
||||
|
||||
/// Reset argument, so it's back to its initial state
|
||||
void Reset();
|
||||
|
||||
private:
|
||||
const char* Key;
|
||||
std::set<const cmCommandArgument*> ArgumentsBefore;
|
||||
cmCommandArgumentGroup* Group;
|
||||
bool WasActive;
|
||||
bool ArgumentsBeforeEmpty;
|
||||
unsigned int CurrentIndex;
|
||||
|
||||
virtual bool DoConsume(const std::string& arg, unsigned int index) = 0;
|
||||
virtual void DoReset() = 0;
|
||||
};
|
||||
|
||||
/** cmCAStringVector is to be used for arguments which can consist of more
|
||||
than one string, e.g. the FILES argument in INSTALL(FILES f1 f2 f3 ...). */
|
||||
class cmCAStringVector : public cmCommandArgument
|
||||
{
|
||||
public:
|
||||
cmCAStringVector(cmCommandArgumentsHelper* args, const char* key,
|
||||
cmCommandArgumentGroup* group = nullptr);
|
||||
|
||||
/// Return the vector of strings
|
||||
const std::vector<std::string>& GetVector() const { return this->Vector; }
|
||||
|
||||
/** Is there a keyword which should be skipped in
|
||||
the arguments (e.g. ARGS for ADD_CUSTOM_COMMAND) ? */
|
||||
void SetIgnore(const char* ignore) { this->Ignore = ignore; }
|
||||
|
||||
private:
|
||||
std::vector<std::string> Vector;
|
||||
unsigned int DataStart;
|
||||
const char* Ignore;
|
||||
bool DoConsume(const std::string& arg, unsigned int index) override;
|
||||
void DoReset() override;
|
||||
};
|
||||
|
||||
/** cmCAString is to be used for arguments which consist of one value,
|
||||
e.g. the executable name in ADD_EXECUTABLE(). */
|
||||
class cmCAString : public cmCommandArgument
|
||||
{
|
||||
public:
|
||||
cmCAString(cmCommandArgumentsHelper* args, const char* key,
|
||||
cmCommandArgumentGroup* group = nullptr);
|
||||
|
||||
/// Return the string
|
||||
const std::string& GetString() const { return this->String; }
|
||||
const char* GetCString() const { return this->String.c_str(); }
|
||||
|
||||
private:
|
||||
std::string String;
|
||||
unsigned int DataStart;
|
||||
bool DoConsume(const std::string& arg, unsigned int index) override;
|
||||
void DoReset() override;
|
||||
};
|
||||
|
||||
/** cmCAEnabler is to be used for options which are off by default and can be
|
||||
enabled using a special argument, e.g. EXCLUDE_FROM_ALL in ADD_EXECUTABLE(). */
|
||||
class cmCAEnabler : public cmCommandArgument
|
||||
{
|
||||
public:
|
||||
cmCAEnabler(cmCommandArgumentsHelper* args, const char* key,
|
||||
cmCommandArgumentGroup* group = nullptr);
|
||||
|
||||
/// Has it been enabled ?
|
||||
bool IsEnabled() const { return this->Enabled; }
|
||||
|
||||
private:
|
||||
bool Enabled;
|
||||
bool DoConsume(const std::string& arg, unsigned int index) override;
|
||||
void DoReset() override;
|
||||
};
|
||||
|
||||
/** cmCADisable is to be used for options which are on by default and can be
|
||||
disabled using a special argument.*/
|
||||
class cmCADisabler : public cmCommandArgument
|
||||
{
|
||||
public:
|
||||
cmCADisabler(cmCommandArgumentsHelper* args, const char* key,
|
||||
cmCommandArgumentGroup* group = nullptr);
|
||||
|
||||
/// Is it still enabled ?
|
||||
bool IsEnabled() const { return this->Enabled; }
|
||||
|
||||
private:
|
||||
bool Enabled;
|
||||
bool DoConsume(const std::string& arg, unsigned int index) override;
|
||||
void DoReset() override;
|
||||
};
|
||||
|
||||
/** Group of arguments, needed for ordering. E.g. WIN32, EXCLUDE_FROM_ALL and
|
||||
MACSOX_BUNDLE from ADD_EXECUTABLE() are a group.
|
||||
*/
|
||||
class cmCommandArgumentGroup
|
||||
{
|
||||
friend class cmCommandArgument;
|
||||
|
||||
public:
|
||||
/// All members of this group may follow the given argument
|
||||
void Follows(const cmCommandArgument* arg);
|
||||
|
||||
/// All members of this group may follow all members of the given group
|
||||
void FollowsGroup(const cmCommandArgumentGroup* group);
|
||||
|
||||
private:
|
||||
std::vector<cmCommandArgument*> ContainedArguments;
|
||||
};
|
||||
|
||||
class cmCommandArgumentsHelper
|
||||
{
|
||||
public:
|
||||
/// Parse the argument list
|
||||
void Parse(const std::vector<std::string>* args,
|
||||
std::vector<std::string>* unconsumedArgs);
|
||||
/// Add an argument.
|
||||
void AddArgument(cmCommandArgument* arg);
|
||||
|
||||
private:
|
||||
std::vector<cmCommandArgument*> Arguments;
|
||||
};
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user