mirror of
https://github.com/Kitware/CMake.git
synced 2026-01-08 14:50:10 -06:00
cmPackageInfoArguments: Simplify argument checking
Refactor cmPackageInfoArguments::Check to use helper macros for repetitive argument validation.
This commit is contained in:
@@ -17,80 +17,73 @@
|
||||
template void cmPackageInfoArguments::Bind<void>(cmArgumentParser<void>&,
|
||||
cmPackageInfoArguments*);
|
||||
|
||||
namespace {
|
||||
|
||||
bool ArgWasSpecified(bool value)
|
||||
{
|
||||
return value;
|
||||
}
|
||||
|
||||
bool ArgWasSpecified(std::string const& value)
|
||||
{
|
||||
return !value.empty();
|
||||
}
|
||||
|
||||
bool ArgWasSpecified(std::vector<std::string> const& value)
|
||||
{
|
||||
return !value.empty();
|
||||
}
|
||||
|
||||
} // anonymous namespace
|
||||
|
||||
#define ENFORCE_REQUIRES(req, value, arg) \
|
||||
do { \
|
||||
if (ArgWasSpecified(value)) { \
|
||||
status.SetError(arg " requires " req "."); \
|
||||
return false; \
|
||||
} \
|
||||
} while (false)
|
||||
|
||||
#define ENFORCE_EXCLUSIVE(arg1, value, arg2) \
|
||||
do { \
|
||||
if (ArgWasSpecified(value)) { \
|
||||
status.SetError(arg1 " and " arg2 " are mutually exclusive."); \
|
||||
return false; \
|
||||
} \
|
||||
} while (false)
|
||||
|
||||
bool cmPackageInfoArguments::Check(cmExecutionStatus& status,
|
||||
bool enable) const
|
||||
{
|
||||
if (!enable) {
|
||||
// Check if any options were given.
|
||||
if (this->LowerCase) {
|
||||
status.SetError("LOWER_CASE_FILE requires PACKAGE_INFO.");
|
||||
return false;
|
||||
}
|
||||
if (!this->Appendix.empty()) {
|
||||
status.SetError("APPENDIX requires PACKAGE_INFO.");
|
||||
return false;
|
||||
}
|
||||
if (!this->Version.empty()) {
|
||||
status.SetError("VERSION requires PACKAGE_INFO.");
|
||||
return false;
|
||||
}
|
||||
if (!this->DefaultTargets.empty()) {
|
||||
status.SetError("DEFAULT_TARGETS requires PACKAGE_INFO.");
|
||||
return false;
|
||||
}
|
||||
if (!this->DefaultConfigs.empty()) {
|
||||
status.SetError("DEFAULT_CONFIGURATIONS requires PACKAGE_INFO.");
|
||||
return false;
|
||||
}
|
||||
if (!this->ProjectName.empty()) {
|
||||
status.SetError("PROJECT requires PACKAGE_INFO.");
|
||||
return false;
|
||||
}
|
||||
if (this->NoProjectDefaults) {
|
||||
status.SetError("NO_PROJECT_METADATA requires PACKAGE_INFO.");
|
||||
return false;
|
||||
}
|
||||
ENFORCE_REQUIRES("PACKAGE_INFO", this->LowerCase, "LOWER_CASE_FILE");
|
||||
ENFORCE_REQUIRES("PACKAGE_INFO", this->Appendix, "APPENDIX");
|
||||
ENFORCE_REQUIRES("PACKAGE_INFO", this->Version, "VERSION");
|
||||
ENFORCE_REQUIRES("PACKAGE_INFO", this->DefaultTargets, "DEFAULT_TARGETS");
|
||||
ENFORCE_REQUIRES("PACKAGE_INFO", this->DefaultConfigs,
|
||||
"DEFAULT_CONFIGURATIONS");
|
||||
ENFORCE_REQUIRES("PACKAGE_INFO", this->ProjectName, "PROJECT");
|
||||
ENFORCE_REQUIRES("PACKAGE_INFO", this->NoProjectDefaults,
|
||||
"NO_PROJECT_METADATA");
|
||||
}
|
||||
|
||||
// Check for incompatible options.
|
||||
if (!this->Appendix.empty()) {
|
||||
if (!this->Version.empty()) {
|
||||
status.SetError("APPENDIX and VERSION are mutually exclusive.");
|
||||
return false;
|
||||
}
|
||||
if (!this->DefaultTargets.empty()) {
|
||||
status.SetError("APPENDIX and DEFAULT_TARGETS "
|
||||
"are mutually exclusive.");
|
||||
return false;
|
||||
}
|
||||
if (!this->DefaultConfigs.empty()) {
|
||||
status.SetError("APPENDIX and DEFAULT_CONFIGURATIONS "
|
||||
"are mutually exclusive.");
|
||||
return false;
|
||||
}
|
||||
if (!this->ProjectName.empty()) {
|
||||
status.SetError("APPENDIX and PROJECT are mutually exclusive.");
|
||||
return false;
|
||||
}
|
||||
ENFORCE_EXCLUSIVE("APPENDIX", this->Version, "VERSION");
|
||||
ENFORCE_EXCLUSIVE("APPENDIX", this->DefaultTargets, "DEFAULT_TARGETS");
|
||||
ENFORCE_EXCLUSIVE("APPENDIX", this->DefaultConfigs,
|
||||
"DEFAULT_CONFIGURATIONS");
|
||||
ENFORCE_EXCLUSIVE("APPENDIX", this->ProjectName, "PROJECT");
|
||||
}
|
||||
if (this->NoProjectDefaults) {
|
||||
if (!this->ProjectName.empty()) {
|
||||
status.SetError("PROJECT and NO_PROJECT_METADATA "
|
||||
"are mutually exclusive.");
|
||||
return false;
|
||||
}
|
||||
ENFORCE_EXCLUSIVE("PROJECT", this->ProjectName, "NO_PROJECT_METADATA");
|
||||
}
|
||||
|
||||
// Check for options that require other options.
|
||||
if (this->Version.empty()) {
|
||||
if (!this->VersionCompat.empty()) {
|
||||
status.SetError("COMPAT_VERSION requires VERSION.");
|
||||
return false;
|
||||
}
|
||||
if (!this->VersionSchema.empty()) {
|
||||
status.SetError("VERSION_SCHEMA requires VERSION.");
|
||||
return false;
|
||||
}
|
||||
ENFORCE_REQUIRES("VERSION", this->VersionCompat, "COMPAT_VERSION");
|
||||
ENFORCE_REQUIRES("VERSION", this->VersionSchema, "VERSION_SCHEMA");
|
||||
}
|
||||
|
||||
// Validate the package name.
|
||||
@@ -107,6 +100,9 @@ bool cmPackageInfoArguments::Check(cmExecutionStatus& status,
|
||||
return true;
|
||||
}
|
||||
|
||||
#undef ENFORCE_REQUIRES
|
||||
#undef ENFORCE_EXCLUSIVE
|
||||
|
||||
bool cmPackageInfoArguments::SetMetadataFromProject(cmExecutionStatus& status)
|
||||
{
|
||||
// Determine what project to use for inherited metadata.
|
||||
|
||||
Reference in New Issue
Block a user