diff options
author | Ben Boeckel <ben.boeckel@kitware.com> | 2023-07-19 22:55:59 (GMT) |
---|---|---|
committer | Ben Boeckel <ben.boeckel@kitware.com> | 2023-07-31 15:37:47 (GMT) |
commit | c9ca5f6326136d02c8d12b0a749076ff375dae4c (patch) | |
tree | ed631bddd296a08787bca2bb0d2cd87e347d1b03 /Source | |
parent | 07551f35de4e5d4aef40f1646f699785ab741128 (diff) | |
download | CMake-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.cxx | 40 | ||||
-rw-r--r-- | Source/cmCoreTryCompile.h | 19 |
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; |