# Copyright 2013-2023 Lawrence Livermore National Security, LLC and other
# Spack Project Developers. See the top-level COPYRIGHT file for details.
#
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
"""Schema for a spec found in spec descriptor or database index.json files
TODO: This needs to be updated? Especially the hashes under properties.
.. literalinclude:: _spack_root/lib/spack/spack/schema/spec.py
:lines: 13-
"""
target = {
"oneOf": [
{"type": "string"},
{
"type": "object",
"additionalProperties": False,
"required": ["name", "vendor", "features", "generation", "parents"],
"properties": {
"name": {"type": "string"},
"vendor": {"type": "string"},
"features": {"type": "array", "items": {"type": "string"}},
"generation": {"type": "integer"},
"parents": {"type": "array", "items": {"type": "string"}},
},
},
]
}
arch = {
"type": "object",
"additionalProperties": False,
"properties": {"platform": {}, "platform_os": {}, "target": target},
}
dependencies = {
"type": "object",
"patternProperties": {
r"\w[\w-]*": { # package name
"type": "object",
"properties": {
"hash": {"type": "string"},
"type": {"type": "array", "items": {"type": "string"}},
},
}
},
}
build_spec = {
"type": "object",
"additionalProperties": False,
"required": ["name", "hash"],
"properties": {"name": {"type": "string"}, "hash": {"type": "string"}},
}
#: Properties for inclusion in other schemas
properties = {
"spec": {
"type": "object",
"additionalProperties": False,
"required": ["_meta", "nodes"],
"properties": {
"_meta": {"type": "object", "properties": {"version": {"type": "number"}}},
"nodes": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": False,
"required": ["version", "arch", "compiler", "namespace", "parameters"],
"properties": {
"name": {"type": "string"},
"hash": {"type": "string"},
"package_hash": {"type": "string"},
# these hashes were used on some specs prior to 0.18
"full_hash": {"type": "string"},
"build_hash": {"type": "string"},
"version": {"oneOf": [{"type": "string"}, {"type": "number"}]},
"arch": arch,
"compiler": {
"type": "object",
"additionalProperties": False,
"properties": {
"name": {"type": "string"},
"version": {"type": "string"},
},
},
"develop": {"anyOf": [{"type": "boolean"}, {"type": "string"}]},
"namespace": {"type": "string"},
"parameters": {
"type": "object",
"required": [
"cflags",
"cppflags",
"cxxflags",
"fflags",
"ldflags",
"ldlibs",
],
"additionalProperties": True,
"properties": {
"patches": {"type": "array", "items": {"type": "string"}},
"cflags": {"type": "array", "items": {"type": "string"}},
"cppflags": {"type": "array", "items": {"type": "string"}},
"cxxflags": {"type": "array", "items": {"type": "string"}},
"fflags": {"type": "array", "items": {"type": "string"}},
"ldflags": {"type": "array", "items": {"type": "string"}},
"ldlib": {"type": "array", "items": {"type": "string"}},
},
},
"patches": {"type": "array", "items": {}},
"dependencies": dependencies,
"build_spec": build_spec,
},
},
},
},
}
}
#: Full schema with metadata
schema = {
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Spack spec schema",
"type": "object",
"additionalProperties": False,
"patternProperties": properties,
}