summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Help/manual/cmake-presets.7.rst9
-rw-r--r--Help/manual/presets/schema.json23
-rw-r--r--Help/release/dev/presets-schema.rst5
-rw-r--r--Source/cmCMakePresetsErrors.cxx5
-rw-r--r--Source/cmCMakePresetsErrors.h2
-rw-r--r--Source/cmCMakePresetsGraphInternal.h3
-rw-r--r--Source/cmCMakePresetsGraphReadJSON.cxx19
-rw-r--r--Tests/RunCMake/CMakePresets/RunCMakeTest.cmake7
-rw-r--r--Tests/RunCMake/CMakePresets/SchemaNotSupported-result.txt1
-rw-r--r--Tests/RunCMake/CMakePresets/SchemaNotSupported-stderr.txt3
-rw-r--r--Tests/RunCMake/CMakePresets/SchemaNotSupported.json.in4
-rw-r--r--Tests/RunCMake/CMakePresets/SchemaSupported-result.txt1
-rw-r--r--Tests/RunCMake/CMakePresets/SchemaSupported.json.in4
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"
+}