summaryrefslogtreecommitdiffstats
path: root/Source
diff options
context:
space:
mode:
authorBen Boeckel <ben.boeckel@kitware.com>2023-07-19 22:55:59 (GMT)
committerBen Boeckel <ben.boeckel@kitware.com>2023-07-31 15:37:47 (GMT)
commitc9ca5f6326136d02c8d12b0a749076ff375dae4c (patch)
treeed631bddd296a08787bca2bb0d2cd87e347d1b03 /Source
parent07551f35de4e5d4aef40f1646f699785ab741128 (diff)
downloadCMake-c9ca5f6326136d02c8d12b0a749076ff375dae4c.zip
CMake-c9ca5f6326136d02c8d12b0a749076ff375dae4c.tar.gz
CMake-c9ca5f6326136d02c8d12b0a749076ff375dae4c.tar.bz2
cmCoreTryCompile: parse `SOURCES_TYPE` argument
This will serve to add context for the source listing in order to properly mark sources as `FILE_SET TYPE CXX_MODULES` in the generated code.
Diffstat (limited to 'Source')
-rw-r--r--Source/cmCoreTryCompile.cxx40
-rw-r--r--Source/cmCoreTryCompile.h19
2 files changed, 58 insertions, 1 deletions
diff --git a/Source/cmCoreTryCompile.cxx b/Source/cmCoreTryCompile.cxx
index 32f2e3b..57a9180 100644
--- a/Source/cmCoreTryCompile.cxx
+++ b/Source/cmCoreTryCompile.cxx
@@ -167,6 +167,7 @@ auto const TryCompileBaseArgParser =
auto const TryCompileBaseSourcesArgParser =
cmArgumentParser<Arguments>{ TryCompileBaseArgParser }
+ .Bind("SOURCES_TYPE"_s, &Arguments::SetSourceType)
.Bind("SOURCES"_s, &Arguments::Sources)
.Bind("COMPILE_DEFINITIONS"_s, TryCompileCompileDefs,
ArgumentParser::ExpectAtLeast{ 0 })
@@ -221,12 +222,44 @@ auto const TryRunOldArgParser = makeTryRunParser(TryCompileOldArgParser);
std::string const TryCompileDefaultConfig = "DEBUG";
}
+ArgumentParser::Continue cmCoreTryCompile::Arguments::SetSourceType(
+ cm::string_view sourceType)
+{
+ bool matched = false;
+ if (sourceType == "NORMAL"_s) {
+ this->SourceTypeContext = SourceType::Normal;
+ matched = true;
+ } else if (sourceType == "CXX_MODULE"_s) {
+ bool const supportCxxModuleSources = cmExperimental::HasSupportEnabled(
+ *this->Makefile, cmExperimental::Feature::CxxModuleCMakeApi);
+ if (supportCxxModuleSources) {
+ this->SourceTypeContext = SourceType::CxxModule;
+ matched = true;
+ }
+ }
+
+ if (!matched && this->SourceTypeError.empty()) {
+ bool const supportCxxModuleSources = cmExperimental::HasSupportEnabled(
+ *this->Makefile, cmExperimental::Feature::CxxModuleCMakeApi);
+ auto const* message = "'SOURCE'";
+ if (supportCxxModuleSources) {
+ message = "one of 'SOURCE' or 'CXX_MODULE'";
+ }
+ // Only remember one error at a time; all other errors related to argument
+ // parsing are "indicate one error and return" anyways.
+ this->SourceTypeError =
+ cmStrCat("Invalid 'SOURCE_TYPE' '", sourceType, "'; must be ", message);
+ }
+ return ArgumentParser::Continue::Yes;
+}
+
Arguments cmCoreTryCompile::ParseArgs(
const cmRange<std::vector<std::string>::const_iterator>& args,
const cmArgumentParser<Arguments>& parser,
std::vector<std::string>& unparsedArguments)
{
- auto arguments = parser.Parse(args, &unparsedArguments, 0);
+ Arguments arguments{ this->Makefile };
+ parser.Parse(arguments, args, &unparsedArguments, 0);
if (!arguments.MaybeReportError(*(this->Makefile)) &&
!unparsedArguments.empty()) {
std::string m = "Unknown arguments:";
@@ -434,6 +467,11 @@ cm::optional<cmTryCompileResult> cmCoreTryCompile::TryCompileCode(
"SOURCE_FROM_FILE requires exactly two arguments");
return cm::nullopt;
}
+ if (!arguments.SourceTypeError.empty()) {
+ this->Makefile->IssueMessage(MessageType::FATAL_ERROR,
+ arguments.SourceTypeError);
+ return cm::nullopt;
+ }
} else {
// only valid for srcfile signatures
if (!arguments.LangProps.empty()) {
diff --git a/Source/cmCoreTryCompile.h b/Source/cmCoreTryCompile.h
index c185c68..7d5a4f8 100644
--- a/Source/cmCoreTryCompile.h
+++ b/Source/cmCoreTryCompile.h
@@ -9,6 +9,7 @@
#include <vector>
#include <cm/optional>
+#include <cm/string_view>
#include "cmArgumentParser.h"
#include "cmArgumentParserTypes.h"
@@ -51,6 +52,20 @@ public:
struct Arguments : public ArgumentParser::ParseResult
{
+ Arguments(cmMakefile const* mf)
+ : Makefile(mf)
+ {
+ }
+
+ cmMakefile const* Makefile;
+
+ enum class SourceType
+ {
+ Normal,
+ CxxModule,
+ Directory,
+ };
+
cm::optional<std::string> CompileResultVariable;
cm::optional<std::string> BinaryDirectory;
cm::optional<std::string> SourceDirectoryOrFile;
@@ -79,6 +94,10 @@ public:
bool NoCache = false;
bool NoLog = false;
+ ArgumentParser::Continue SetSourceType(cm::string_view sourceType);
+ SourceType SourceTypeContext = SourceType::Normal;
+ std::string SourceTypeError;
+
// Argument for try_run only.
// Keep in sync with warnings in cmCoreTryCompile::ParseArgs.
cm::optional<std::string> CompileOutputVariable;