try_compile: Don't accept try_run arguments

Modify cmCoreTryCompile to only recognize try_run arguments when
actually parsing try_run. (The old behavior was to recognize try_run
arguments for try_compile also and then complain.)

This has a small chance that a try_run keyword will be consumed as part
of a multi-valued keyword argument. However, this behavior is more
consistent with other commands, as we don't normally treat keywords as
universally reserved. Also, the code is noticeably simplified.
This commit is contained in:
Matthew Woehlke 2022-08-17 12:37:42 -04:00 committed by Brad King
parent 24c83bb35b
commit b976b844d2
2 changed files with 19 additions and 34 deletions

View File

@ -145,6 +145,10 @@ auto const TryCompileArgParser =
.BIND_LANG_PROPS(HIP)
.BIND_LANG_PROPS(OBJC)
.BIND_LANG_PROPS(OBJCXX)
/* keep semicolon on own line */;
auto const TryRunArgParser =
cmArgumentParser<Arguments>{ TryCompileArgParser }
.Bind("COMPILE_OUTPUT_VARIABLE"_s, &Arguments::CompileOutputVariable)
.Bind("RUN_OUTPUT_VARIABLE"_s, &Arguments::RunOutputVariable)
.Bind("RUN_OUTPUT_STDOUT_VARIABLE"_s, &Arguments::RunOutputStdOutVariable)
@ -160,7 +164,8 @@ Arguments cmCoreTryCompile::ParseArgs(
cmRange<std::vector<std::string>::const_iterator> args, bool isTryRun)
{
std::vector<std::string> unparsedArguments;
auto arguments = TryCompileArgParser.Parse(args, &unparsedArguments, 0);
const auto& parser = (isTryRun ? TryRunArgParser : TryCompileArgParser);
auto arguments = parser.Parse(args, &unparsedArguments, 0);
if (!arguments.MaybeReportError(*(this->Makefile)) &&
!unparsedArguments.empty()) {
std::string m = "Unknown arguments:";
@ -194,31 +199,6 @@ Arguments cmCoreTryCompile::ParseArgs(
arguments.RunWorkingDirectory->empty()) {
arguments.RunWorkingDirectory = cm::nullopt;
}
} else {
std::string tryRunArgs;
if (arguments.CompileOutputVariable) {
tryRunArgs = cmStrCat(tryRunArgs, " COMPILE_OUTPUT_VARIABLE\n");
}
if (arguments.RunOutputVariable) {
tryRunArgs = cmStrCat(tryRunArgs, " RUN_OUTPUT_VARIABLE\n");
}
if (arguments.RunOutputStdOutVariable) {
tryRunArgs = cmStrCat(tryRunArgs, " RUN_OUTPUT_STDOUT_VARIABLE\n");
}
if (arguments.RunOutputStdErrVariable) {
tryRunArgs = cmStrCat(tryRunArgs, " RUN_OUTPUT_STDERR_VARIABLE\n");
}
if (arguments.RunWorkingDirectory) {
tryRunArgs = cmStrCat(tryRunArgs, " WORKING_DIRECTORY\n");
}
if (arguments.RunArgs) {
tryRunArgs = cmStrCat(tryRunArgs, " ARGS\n");
}
if (!tryRunArgs.empty()) {
this->Makefile->IssueMessage(
MessageType::AUTHOR_WARNING,
cmStrCat("Ignoring try_run arguments for try_compile:\n", tryRunArgs));
}
}
return arguments;
}

View File

@ -1,13 +1,18 @@
^CMake Warning \(dev\) at TryRunArgs.cmake:[0-9]+ \(try_compile\):
Ignoring try_run arguments for try_compile:
COMPILE_OUTPUT_VARIABLE
RUN_OUTPUT_VARIABLE
RUN_OUTPUT_STDOUT_VARIABLE
RUN_OUTPUT_STDERR_VARIABLE
WORKING_DIRECTORY
ARGS
Unknown arguments:
"COMPILE_OUTPUT_VARIABLE"
"compOutputVar"
"RUN_OUTPUT_VARIABLE"
"runOutputVar"
"RUN_OUTPUT_STDOUT_VARIABLE"
"runOutputStdOutVar"
"RUN_OUTPUT_STDERR_VARIABLE"
"runOutputStdErrVar"
"WORKING_DIRECTORY"
"runWorkDir"
"ARGS"
"runArgs"
Call Stack \(most recent call first\):
CMakeLists.txt:[0-9]+ \(include\)
This warning is for project developers. Use -Wno-dev to suppress it.$