diff options
-rw-r--r-- | Help/manual/cmake-presets.7.rst | 9 | ||||
-rw-r--r-- | Help/manual/presets/schema.json | 23 | ||||
-rw-r--r-- | Help/release/dev/presets-schema.rst | 5 | ||||
-rw-r--r-- | Source/cmCMakePresetsErrors.cxx | 5 | ||||
-rw-r--r-- | Source/cmCMakePresetsErrors.h | 2 | ||||
-rw-r--r-- | Source/cmCMakePresetsGraphInternal.h | 3 | ||||
-rw-r--r-- | Source/cmCMakePresetsGraphReadJSON.cxx | 19 | ||||
-rw-r--r-- | Tests/RunCMake/CMakePresets/RunCMakeTest.cmake | 7 | ||||
-rw-r--r-- | Tests/RunCMake/CMakePresets/SchemaNotSupported-result.txt | 1 | ||||
-rw-r--r-- | Tests/RunCMake/CMakePresets/SchemaNotSupported-stderr.txt | 3 | ||||
-rw-r--r-- | Tests/RunCMake/CMakePresets/SchemaNotSupported.json.in | 4 | ||||
-rw-r--r-- | Tests/RunCMake/CMakePresets/SchemaSupported-result.txt | 1 | ||||
-rw-r--r-- | Tests/RunCMake/CMakePresets/SchemaSupported.json.in | 4 |
13 files changed, 84 insertions, 2 deletions
diff --git a/Help/manual/cmake-presets.7.rst b/Help/manual/cmake-presets.7.rst index e2366da..46b5fc7 100644 --- a/Help/manual/cmake-presets.7.rst +++ b/Help/manual/cmake-presets.7.rst @@ -41,6 +41,15 @@ The files are a JSON document with an object as the root: The root object recognizes the following fields: +``$schema`` + An optional string that provides a URI to the JSON schema that describes the + structure of this JSON document. This field is used for validation and + autocompletion in editors that support JSON schema. It doesn't affect the + behavior of the document itself. If this field is not specified, the JSON + document will still be valid, but tools that use JSON schema for validation + and autocompletion may not function correctly. + This is allowed in preset files specifying version ``8`` or above. + ``version`` A required integer representing the version of the JSON schema. The supported versions are: diff --git a/Help/manual/presets/schema.json b/Help/manual/presets/schema.json index 71db769..d27faa1 100644 --- a/Help/manual/presets/schema.json +++ b/Help/manual/presets/schema.json @@ -106,12 +106,35 @@ "include": { "$ref": "#/definitions/include" } }, "additionalProperties": false + }, + { + "properties": { + "$schema": { "$ref": "#/definitions/$schema" }, + "version": { + "const": 8, + "description": "A required integer representing the version of the JSON schema." + }, + "cmakeMinimumRequired": { "$ref": "#/definitions/cmakeMinimumRequired" }, + "vendor": { "$ref": "#/definitions/vendor" }, + "configurePresets": { "$ref": "#/definitions/configurePresetsV7" }, + "buildPresets": { "$ref": "#/definitions/buildPresetsV4" }, + "testPresets": { "$ref": "#/definitions/testPresetsV6" }, + "packagePresets": { "$ref": "#/definitions/packagePresetsV6" }, + "workflowPresets": { "$ref": "#/definitions/workflowPresetsV6" }, + "include": { "$ref": "#/definitions/include" } + }, + "additionalProperties": false } ], "required": [ "version" ], "definitions": { + "$schema": { + "type": "string", + "description": "The schema against which to verify this document.", + "format": "uri-reference" + }, "cmakeMinimumRequired": { "type": "object", "description": "An optional object representing the minimum version of CMake needed to build this project.", diff --git a/Help/release/dev/presets-schema.rst b/Help/release/dev/presets-schema.rst new file mode 100644 index 0000000..964373c --- /dev/null +++ b/Help/release/dev/presets-schema.rst @@ -0,0 +1,5 @@ +presets-schema +-------------- + +* :manual:`cmake-presets(7)` files now support schema version ``8``. + It adds support for a ``$schema`` field. diff --git a/Source/cmCMakePresetsErrors.cxx b/Source/cmCMakePresetsErrors.cxx index e0ff0c6..1b88a0c 100644 --- a/Source/cmCMakePresetsErrors.cxx +++ b/Source/cmCMakePresetsErrors.cxx @@ -302,4 +302,9 @@ void PRESET_MISSING_FIELD(const std::string& presetName, state->AddError(cmStrCat("Preset \"", presetName, "\" missing field \"", missingField, "\"")); } + +void SCHEMA_UNSUPPORTED(cmJSONState* state) +{ + state->AddError("File version must be 8 or higher for $schema support"); +} } diff --git a/Source/cmCMakePresetsErrors.h b/Source/cmCMakePresetsErrors.h index 14aaed7..b755c25 100644 --- a/Source/cmCMakePresetsErrors.h +++ b/Source/cmCMakePresetsErrors.h @@ -113,4 +113,6 @@ JsonErrors::ErrorGenerator INVALID_ROOT_OBJECT( void PRESET_MISSING_FIELD(const std::string& presetName, const std::string& missingField, cmJSONState* state); + +void SCHEMA_UNSUPPORTED(cmJSONState* state); } diff --git a/Source/cmCMakePresetsGraphInternal.h b/Source/cmCMakePresetsGraphInternal.h index f133efb..5c76e0e 100644 --- a/Source/cmCMakePresetsGraphInternal.h +++ b/Source/cmCMakePresetsGraphInternal.h @@ -2,6 +2,7 @@ file Copyright.txt or https://cmake.org/licensing for details. */ #pragma once +#include <cstddef> #include <memory> #include <string> #include <vector> @@ -179,4 +180,6 @@ bool PresetVectorOneOrMoreStringHelper(std::vector<std::string>& out, bool EnvironmentMapHelper( std::map<std::string, cm::optional<std::string>>& out, const Json::Value* value, cmJSONState* state); + +cmJSONHelper<std::nullptr_t> SchemaHelper(); } diff --git a/Source/cmCMakePresetsGraphReadJSON.cxx b/Source/cmCMakePresetsGraphReadJSON.cxx index 8d63441..0d8ec63 100644 --- a/Source/cmCMakePresetsGraphReadJSON.cxx +++ b/Source/cmCMakePresetsGraphReadJSON.cxx @@ -38,7 +38,7 @@ using MacroExpander = cmCMakePresetsGraphInternal::MacroExpander; using cmCMakePresetsGraphInternal::ExpandMacros; constexpr int MIN_VERSION = 1; -constexpr int MAX_VERSION = 7; +constexpr int MAX_VERSION = 8; struct CMakeVersion { @@ -294,7 +294,9 @@ auto const RootPresetsHelper = .Bind<std::nullptr_t>("vendor"_s, nullptr, cmCMakePresetsGraphInternal::VendorHelper( cmCMakePresetsErrors::INVALID_ROOT), - false); + false) + .Bind<std::nullptr_t>("$schema"_s, nullptr, + cmCMakePresetsGraphInternal::SchemaHelper(), false); } namespace cmCMakePresetsGraphInternal { @@ -413,6 +415,13 @@ bool EnvironmentMapHelper( return helper(out, value, state); } + +cmJSONHelper<std::nullptr_t> SchemaHelper() +{ + return [](std::nullptr_t&, const Json::Value*, cmJSONState*) -> bool { + return true; + }; +} } bool cmCMakePresetsGraph::ReadJSONFile(const std::string& filename, @@ -488,6 +497,12 @@ bool cmCMakePresetsGraph::ReadJSONFile(const std::string& filename, return false; } + // Support for $schema added in version 8. + if (v < 8 && root.isMember("$schema")) { + cmCMakePresetsErrors::SCHEMA_UNSUPPORTED(&this->parseState); + return false; + } + RootPresets presets; if ((result = RootPresetsHelper(presets, &root, &parseState)) != true) { return result; diff --git a/Tests/RunCMake/CMakePresets/RunCMakeTest.cmake b/Tests/RunCMake/CMakePresets/RunCMakeTest.cmake index c4a8b3f..88027fb 100644 --- a/Tests/RunCMake/CMakePresets/RunCMakeTest.cmake +++ b/Tests/RunCMake/CMakePresets/RunCMakeTest.cmake @@ -153,6 +153,13 @@ run_cmake_presets(ConditionFuture) run_cmake_presets(SubConditionNull) run_cmake_presets(TraceNotSupported) +set(CMakePresets_NO_PRESET 1) +set(CMakePresets_SCHEMA_EXPECTED_RESULT 0) +run_cmake_presets(SchemaSupported --list-presets) +set(CMakePresets_SCHEMA_EXPECTED_RESULT 1) +run_cmake_presets(SchemaNotSupported --list-presets) +unset(CMakePresets_NO_PRESET) + # Test cmakeMinimumRequired field run_cmake_presets(MinimumRequiredInvalid) set(CMakePresets_SCHEMA_EXPECTED_RESULT 0) diff --git a/Tests/RunCMake/CMakePresets/SchemaNotSupported-result.txt b/Tests/RunCMake/CMakePresets/SchemaNotSupported-result.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/Tests/RunCMake/CMakePresets/SchemaNotSupported-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/CMakePresets/SchemaNotSupported-stderr.txt b/Tests/RunCMake/CMakePresets/SchemaNotSupported-stderr.txt new file mode 100644 index 0000000..2df4b3d --- /dev/null +++ b/Tests/RunCMake/CMakePresets/SchemaNotSupported-stderr.txt @@ -0,0 +1,3 @@ +^CMake Error: Could not read presets from [^ +]*/Tests/RunCMake/CMakePresets/SchemaNotSupported: +File version must be 8 or higher for [$]schema support$ diff --git a/Tests/RunCMake/CMakePresets/SchemaNotSupported.json.in b/Tests/RunCMake/CMakePresets/SchemaNotSupported.json.in new file mode 100644 index 0000000..736f307 --- /dev/null +++ b/Tests/RunCMake/CMakePresets/SchemaNotSupported.json.in @@ -0,0 +1,4 @@ +{ + "version": 7, + "$schema": "https://example.com/schema.json" +} diff --git a/Tests/RunCMake/CMakePresets/SchemaSupported-result.txt b/Tests/RunCMake/CMakePresets/SchemaSupported-result.txt new file mode 100644 index 0000000..573541a --- /dev/null +++ b/Tests/RunCMake/CMakePresets/SchemaSupported-result.txt @@ -0,0 +1 @@ +0 diff --git a/Tests/RunCMake/CMakePresets/SchemaSupported.json.in b/Tests/RunCMake/CMakePresets/SchemaSupported.json.in new file mode 100644 index 0000000..5426131 --- /dev/null +++ b/Tests/RunCMake/CMakePresets/SchemaSupported.json.in @@ -0,0 +1,4 @@ +{ + "version": 8, + "$schema": "https://example.com/schema.json" +} |