project: warn on metadata arguments missing values

Warn if `DESCRIPTION` or `VERSION` is given without a following value.
This commit is contained in:
Alex Turbov
2018-03-03 12:45:56 +08:00
committed by Brad King
parent dc13ed1f84
commit 587bad7ba2
10 changed files with 64 additions and 3 deletions

View File

@@ -3,9 +3,11 @@
#include "cmProjectCommand.h"
#include "cmsys/RegularExpression.hxx"
#include <functional>
#include <sstream>
#include <stdio.h>
#include "cmAlgorithms.h"
#include "cmMakefile.h"
#include "cmPolicies.h"
#include "cmStateTypes.h"
@@ -69,6 +71,10 @@ bool cmProjectCommand::InitialPass(std::vector<std::string> const& args,
std::string version;
std::string description;
std::vector<std::string> languages;
std::function<void()> missedValueReporter;
auto resetReporter = [&missedValueReporter]() {
missedValueReporter = std::function<void()>();
};
enum Doing
{
DoingDescription,
@@ -85,7 +91,18 @@ bool cmProjectCommand::InitialPass(std::vector<std::string> const& args,
return true;
}
haveLanguages = true;
if (missedValueReporter) {
missedValueReporter();
}
doing = DoingLanguages;
if (!languages.empty()) {
std::string msg =
"the following parameters must be specified after LANGUAGES "
"keyword: ";
msg += cmJoin(languages, ", ");
msg += '.';
this->Makefile->IssueMessage(cmake::WARNING, msg);
}
} else if (args[i] == "VERSION") {
if (haveVersion) {
this->Makefile->IssueMessage(cmake::FATAL_ERROR,
@@ -94,7 +111,17 @@ bool cmProjectCommand::InitialPass(std::vector<std::string> const& args,
return true;
}
haveVersion = true;
if (missedValueReporter) {
missedValueReporter();
}
doing = DoingVersion;
missedValueReporter = [this, &resetReporter]() {
this->Makefile->IssueMessage(
cmake::WARNING,
"VERSION keyword not followed by a value or was followed by a "
"value that expanded to nothing.");
resetReporter();
};
} else if (args[i] == "DESCRIPTION") {
if (haveDescription) {
this->Makefile->IssueMessage(
@@ -103,23 +130,41 @@ bool cmProjectCommand::InitialPass(std::vector<std::string> const& args,
return true;
}
haveDescription = true;
if (missedValueReporter) {
missedValueReporter();
}
doing = DoingDescription;
missedValueReporter = [this, &resetReporter]() {
this->Makefile->IssueMessage(
cmake::WARNING,
"DESCRIPTION keyword not followed by a value or was followed "
"by a value that expanded to nothing.");
resetReporter();
};
} else if (doing == DoingVersion) {
doing = DoingLanguages;
version = args[i];
resetReporter();
} else if (doing == DoingDescription) {
doing = DoingLanguages;
description = args[i];
resetReporter();
} else // doing == DoingLanguages
{
languages.push_back(args[i]);
}
}
if (haveVersion && !haveLanguages && !languages.empty()) {
if (missedValueReporter) {
missedValueReporter();
}
if ((haveVersion || haveDescription) && !haveLanguages &&
!languages.empty()) {
this->Makefile->IssueMessage(
cmake::FATAL_ERROR,
"project with VERSION must use LANGUAGES before language names.");
"project with VERSION or DESCRIPTION must use LANGUAGES before "
"language names.");
cmSystemTools::SetFatalErrorOccured();
return true;
}