summaryrefslogtreecommitdiffstats
path: root/Source/cmCMakePresetsFile.h
diff options
context:
space:
mode:
authorSam Freed <safreed@microsoft.com>2020-12-14 18:06:08 (GMT)
committerBrad King <brad.king@kitware.com>2021-02-01 16:59:40 (GMT)
commit676ecf0d37cf5cfda390f52ce60babcb5da78108 (patch)
tree79129100ed585db7a91b82778166c1e1d3d6f7e5 /Source/cmCMakePresetsFile.h
parent4f4f2028b8e2c45eb6940d1ec5069caad9b606a2 (diff)
downloadCMake-676ecf0d37cf5cfda390f52ce60babcb5da78108.zip
CMake-676ecf0d37cf5cfda390f52ce60babcb5da78108.tar.gz
CMake-676ecf0d37cf5cfda390f52ce60babcb5da78108.tar.bz2
cmake-presets: Add build and test presets
Fixes: #21391
Diffstat (limited to 'Source/cmCMakePresetsFile.h')
-rw-r--r--Source/cmCMakePresetsFile.h307
1 files changed, 251 insertions, 56 deletions
diff --git a/Source/cmCMakePresetsFile.h b/Source/cmCMakePresetsFile.h
index f6b159a..26810ad 100644
--- a/Source/cmCMakePresetsFile.h
+++ b/Source/cmCMakePresetsFile.h
@@ -2,6 +2,7 @@
file Copyright.txt or https://cmake.org/licensing for details. */
#pragma once
+#include <functional>
#include <map>
#include <string>
#include <utility>
@@ -12,6 +13,27 @@
class cmCMakePresetsFile
{
public:
+ enum class ReadFileResult
+ {
+ READ_OK,
+ FILE_NOT_FOUND,
+ JSON_PARSE_ERROR,
+ INVALID_ROOT,
+ NO_VERSION,
+ INVALID_VERSION,
+ UNRECOGNIZED_VERSION,
+ INVALID_CMAKE_VERSION,
+ UNRECOGNIZED_CMAKE_VERSION,
+ INVALID_PRESETS,
+ INVALID_PRESET,
+ INVALID_VARIABLE,
+ DUPLICATE_PRESETS,
+ CYCLIC_PRESET_INHERITANCE,
+ USER_PRESET_INHERITANCE,
+ INVALID_MACRO_EXPANSION,
+ BUILD_TEST_PRESETS_UNSUPPORTED,
+ };
+
enum class ArchToolsetStrategy
{
Set,
@@ -29,25 +51,51 @@ public:
{
public:
#if __cplusplus < 201703L && (!defined(_MSVC_LANG) || _MSVC_LANG < 201703L)
- Preset() = default;
- Preset(const Preset& /*other*/) = default;
- Preset(Preset&& /*other*/) = default;
-
- Preset& operator=(const Preset& /*other*/) = default;
-
// The move assignment operators for several STL classes did not become
// noexcept until C++17, which causes some tools to warn about this move
// assignment operator throwing an exception when it shouldn't. Disable the
// move assignment operator until C++17 is enabled.
- Preset& operator=(Preset&& /*other*/) = delete;
+ // Explicitly defining a copy assignment operator prevents the compiler
+ // from automatically generating a move assignment operator.
+ Preset& operator=(const Preset& /*other*/) = default;
#endif
+ virtual ~Preset() = default;
+
std::string Name;
std::vector<std::string> Inherits;
bool Hidden;
bool User;
std::string DisplayName;
std::string Description;
+
+ std::map<std::string, cm::optional<std::string>> Environment;
+
+ virtual ReadFileResult VisitPresetInherit(const Preset& parent) = 0;
+ virtual ReadFileResult VisitPresetBeforeInherit()
+ {
+ return ReadFileResult::READ_OK;
+ }
+
+ virtual ReadFileResult VisitPresetAfterInherit()
+ {
+ return ReadFileResult::READ_OK;
+ }
+ };
+
+ class ConfigurePreset : public Preset
+ {
+ public:
+#if __cplusplus < 201703L && (!defined(_MSVC_LANG) || _MSVC_LANG < 201703L)
+ // The move assignment operators for several STL classes did not become
+ // noexcept until C++17, which causes some tools to warn about this move
+ // assignment operator throwing an exception when it shouldn't. Disable the
+ // move assignment operator until C++17 is enabled.
+ // Explicitly defining a copy assignment operator prevents the compiler
+ // from automatically generating a move assignment operator.
+ ConfigurePreset& operator=(const ConfigurePreset& /*other*/) = default;
+#endif
+
std::string Generator;
std::string Architecture;
cm::optional<ArchToolsetStrategy> ArchitectureStrategy;
@@ -56,7 +104,6 @@ public:
std::string BinaryDir;
std::map<std::string, cm::optional<CacheVariable>> CacheVariables;
- std::map<std::string, cm::optional<std::string>> Environment;
cm::optional<bool> WarnDev;
cm::optional<bool> ErrorDev;
@@ -69,70 +116,183 @@ public:
cm::optional<bool> DebugOutput;
cm::optional<bool> DebugTryCompile;
cm::optional<bool> DebugFind;
+
+ ReadFileResult VisitPresetInherit(const Preset& parent) override;
+ ReadFileResult VisitPresetBeforeInherit() override;
+ ReadFileResult VisitPresetAfterInherit() override;
};
- class UnexpandedPreset : public Preset
+ class BuildPreset : public Preset
{
public:
- using Preset::Preset;
+#if __cplusplus < 201703L && (!defined(_MSVC_LANG) || _MSVC_LANG < 201703L)
+ // The move assignment operators for several STL classes did not become
+ // noexcept until C++17, which causes some tools to warn about this move
+ // assignment operator throwing an exception when it shouldn't. Disable the
+ // move assignment operator until C++17 is enabled.
+ // Explicitly defining a copy assignment operator prevents the compiler
+ // from automatically generating a move assignment operator.
+ BuildPreset& operator=(const BuildPreset& /*other*/) = default;
+#endif
- UnexpandedPreset() = default;
- UnexpandedPreset(const Preset& preset)
- : Preset(preset)
- {
- }
- UnexpandedPreset(Preset&& preset)
- : Preset(std::move(preset))
- {
- }
+ std::string ConfigurePreset;
+ cm::optional<bool> InheritConfigureEnvironment;
+ cm::optional<int> Jobs;
+ std::vector<std::string> Targets;
+ std::string Configuration;
+ cm::optional<bool> CleanFirst;
+ cm::optional<bool> Verbose;
+ std::vector<std::string> NativeToolOptions;
+
+ ReadFileResult VisitPresetInherit(const Preset& parent) override;
+ ReadFileResult VisitPresetAfterInherit() override;
};
- class ExpandedPreset : public Preset
+ class TestPreset : public Preset
{
public:
- using Preset::Preset;
+#if __cplusplus < 201703L && (!defined(_MSVC_LANG) || _MSVC_LANG < 201703L)
+ // The move assignment operators for several STL classes did not become
+ // noexcept until C++17, which causes some tools to warn about this move
+ // assignment operator throwing an exception when it shouldn't. Disable the
+ // move assignment operator until C++17 is enabled.
+ // Explicitly defining a copy assignment operator prevents the compiler
+ // from automatically generating a move assignment operator.
+ TestPreset& operator=(const TestPreset& /*other*/) = default;
+#endif
- ExpandedPreset() = default;
- ExpandedPreset(const Preset& preset)
- : Preset(preset)
+ struct OutputOptions
{
- }
- ExpandedPreset(Preset&& preset)
- : Preset(std::move(preset))
+ enum class VerbosityEnum
+ {
+ Default,
+ Verbose,
+ Extra
+ };
+
+ cm::optional<bool> ShortProgress;
+ cm::optional<VerbosityEnum> Verbosity;
+ cm::optional<bool> Debug;
+ cm::optional<bool> OutputOnFailure;
+ cm::optional<bool> Quiet;
+ std::string OutputLogFile;
+ cm::optional<bool> LabelSummary;
+ cm::optional<bool> SubprojectSummary;
+ cm::optional<int> MaxPassedTestOutputSize;
+ cm::optional<int> MaxFailedTestOutputSize;
+ cm::optional<int> MaxTestNameWidth;
+ };
+
+ struct IncludeOptions
{
- }
+ struct IndexOptions
+ {
+ cm::optional<int> Start;
+ cm::optional<int> End;
+ cm::optional<int> Stride;
+ std::vector<int> SpecificTests;
+
+ std::string IndexFile;
+ };
+
+ std::string Name;
+ std::string Label;
+ cm::optional<IndexOptions> Index;
+ cm::optional<bool> UseUnion;
+ };
+
+ struct ExcludeOptions
+ {
+ struct FixturesOptions
+ {
+ std::string Any;
+ std::string Setup;
+ std::string Cleanup;
+ };
+
+ std::string Name;
+ std::string Label;
+ cm::optional<FixturesOptions> Fixtures;
+ };
+
+ struct FilterOptions
+ {
+ cm::optional<IncludeOptions> Include;
+ cm::optional<ExcludeOptions> Exclude;
+ };
+
+ struct ExecutionOptions
+ {
+ enum class ShowOnlyEnum
+ {
+ Human,
+ JsonV1
+ };
+
+ struct RepeatOptions
+ {
+ enum class ModeEnum
+ {
+ UntilFail,
+ UntilPass,
+ AfterTimeout
+ };
+
+ ModeEnum Mode;
+ int Count;
+ };
+
+ enum class NoTestsActionEnum
+ {
+ Default,
+ Error,
+ Ignore
+ };
+
+ cm::optional<bool> StopOnFailure;
+ cm::optional<bool> EnableFailover;
+ cm::optional<int> Jobs;
+ std::string ResourceSpecFile;
+ cm::optional<int> TestLoad;
+ cm::optional<ShowOnlyEnum> ShowOnly;
+ cm::optional<bool> RerunFailed;
+
+ cm::optional<RepeatOptions> Repeat;
+ cm::optional<bool> InteractiveDebugging;
+ cm::optional<bool> ScheduleRandom;
+ cm::optional<int> Timeout;
+ cm::optional<NoTestsActionEnum> NoTestsAction;
+ };
+
+ std::string ConfigurePreset;
+ cm::optional<bool> InheritConfigureEnvironment;
+ std::string Configuration;
+ std::vector<std::string> OverwriteConfigurationFile;
+ cm::optional<OutputOptions> Output;
+ cm::optional<FilterOptions> Filter;
+ cm::optional<ExecutionOptions> Execution;
+
+ ReadFileResult VisitPresetInherit(const Preset& parent) override;
+ ReadFileResult VisitPresetAfterInherit() override;
};
+ template <class T>
class PresetPair
{
public:
- UnexpandedPreset Unexpanded;
- cm::optional<ExpandedPreset> Expanded;
+ T Unexpanded;
+ cm::optional<T> Expanded;
};
- std::string SourceDir;
- std::map<std::string, PresetPair> Presets;
- std::vector<std::string> PresetOrder;
+ std::map<std::string, PresetPair<ConfigurePreset>> ConfigurePresets;
+ std::map<std::string, PresetPair<BuildPreset>> BuildPresets;
+ std::map<std::string, PresetPair<TestPreset>> TestPresets;
- enum class ReadFileResult
- {
- READ_OK,
- FILE_NOT_FOUND,
- JSON_PARSE_ERROR,
- INVALID_ROOT,
- NO_VERSION,
- INVALID_VERSION,
- UNRECOGNIZED_VERSION,
- INVALID_CMAKE_VERSION,
- UNRECOGNIZED_CMAKE_VERSION,
- INVALID_PRESETS,
- INVALID_PRESET,
- INVALID_VARIABLE,
- DUPLICATE_PRESETS,
- CYCLIC_PRESET_INHERITANCE,
- USER_PRESET_INHERITANCE,
- INVALID_MACRO_EXPANSION,
- };
+ std::vector<std::string> ConfigurePresetOrder;
+ std::vector<std::string> BuildPresetOrder;
+ std::vector<std::string> TestPresetOrder;
+
+ std::string SourceDir;
static std::string GetFilename(const std::string& sourceDir);
static std::string GetUserFilename(const std::string& sourceDir);
@@ -140,9 +300,44 @@ public:
bool allowNoFiles = false);
static const char* ResultToString(ReadFileResult result);
+ std::string GetGeneratorForPreset(const std::string& presetName) const
+ {
+ auto configurePresetName = presetName;
+
+ auto buildPresetIterator = this->BuildPresets.find(presetName);
+ if (buildPresetIterator != this->BuildPresets.end()) {
+ configurePresetName =
+ buildPresetIterator->second.Unexpanded.ConfigurePreset;
+ } else {
+ auto testPresetIterator = this->TestPresets.find(presetName);
+ if (testPresetIterator != this->TestPresets.end()) {
+ configurePresetName =
+ testPresetIterator->second.Unexpanded.ConfigurePreset;
+ }
+ }
+
+ auto configurePresetIterator =
+ this->ConfigurePresets.find(configurePresetName);
+ if (configurePresetIterator != this->ConfigurePresets.end()) {
+ return configurePresetIterator->second.Unexpanded.Generator;
+ }
+
+ // This should only happen if the preset is hidden
+ // or (for build or test presets) if ConfigurePreset is invalid.
+ return "";
+ }
+
+ static void PrintPresets(
+ const std::vector<const cmCMakePresetsFile::Preset*>& presets);
+ void PrintConfigurePresetList() const;
+ void PrintConfigurePresetList(
+ const std::function<bool(const ConfigurePreset&)>& filter) const;
+ void PrintBuildPresetList() const;
+ void PrintTestPresetList() const;
+ void PrintAllPresets() const;
+
private:
- ReadFileResult ReadJSONFile(const std::string& filename,
- std::vector<std::string>& presetOrder,
- std::map<std::string, PresetPair>& presetMap,
- bool user);
+ ReadFileResult ReadProjectPresetsInternal(bool allowNoFiles);
+ ReadFileResult ReadJSONFile(const std::string& filename, bool user);
+ void ClearPresets();
};