diff --git a/peps/pep-0739.rst b/peps/pep-0739.rst index c0f6a70ea5e..d8b898592ca 100644 --- a/peps/pep-0739.rst +++ b/peps/pep-0739.rst @@ -1,5 +1,5 @@ PEP: 739 -Title: Static description file for build details of Python installations +Title: ``build-details.json`` 1.0 — a static description file for Python build details Author: Filipe Laíns PEP-Delegate: Paul Moore Discussions-To: https://discuss.python.org/t/pep-739-static-description-file-for-build-details-of-python-installations/44572 @@ -13,16 +13,19 @@ Python-Version: 3.14 Abstract ======== -Introduce a standard format for a static description file with build details -of Python installations. +This PEP introduces ``build-details.json``, a static description file containing +build details of Python installations. + +It includes the definition of version 1.0 of the file format, and defines the +standard location for this file. Rationale ========= When introspecting a Python installation, running code is often undesirable or -impossible. Having a static description file makes various of Python build -details available without having to run the interpreter. +impossible. Having a static description file makes various build details of the +Python installation available without having to run the interpreter. This is helpful for use-cases such as cross-compilation, Python launchers, etc. @@ -30,31 +33,34 @@ This is helpful for use-cases such as cross-compilation, Python launchers, etc. Scope ===== -This PEP defines a format for the description file, and a standard location for -where to place it. - - -Location -======== +``build-details.json`` is an installation-wide file, meaning that it **MUST** +only contain information that is constant across all environments of the Python +installation. -When possible, Python installations should install the static description file -inside the standard library directory, with the name ``build-details.json`` -(Eg. ``/usr/lib/python3.14/build-details.json``). +Information specific to a Python environment, such as the ``site-packages`` +path, is outside the scope for this file, and the PEP authors expect that a +static environment description file will be introduced via a future PEP. -.. important:: +Specification +============= - Given that there may be technical challenges, Python implementations are not - required to provide the file if not feasable. In such scenarios, they may - choose to provide it in a different maner. +Starting from Python 3.14, a file named ``build-details.json`` following the +format specified in this PEP, or a future version, **MUST** be installed in the +platform-independent standard library directory (``stdlib``, eg. +``/usr/lib/python3.14/build-details.json``), **UNLESS** unfeasible due to +technical limitations. .. attention:: - Notwithstanding the standard location specified here, it does not prevent the - file from **additionally** being provided in another location, and with a - different name. In fact, the PEP authors expect future PEPs to define - additional locations to install this file, for better discoverability. + In addition to the standard location specified by this PEP, the + ``build-details.json`` file **MAY** also be installed into **additional** + locations, and under a different name. Notwithstanding, the file **SHOULD** + still be available at the standard location. + + In actuality, the PEP authors expect future PEPs to define additional + install locations with better discoverability. Format @@ -76,8 +82,8 @@ below, which is rendered in an human-readable format here. * - ``$id`` - https://github.com/python/peps/blob/main/peps/pep-0739/python-build-info-v1.0.schema.json * - Title - - Static description file for the build details of Python - installations + - build-details.json — a static description file with build + details of Python installations * - Type - ``object`` * - Additional properties @@ -97,15 +103,15 @@ below, which is rendered in an human-readable format here. This is a string following the format ``.``, where ```` and ```` are unpaded numbers and represent the **major** and **minor** components of the version. Versions - may be arithmetic compared by intrepreting the version string as - a decimal number. + may be arithmetically compared by intrepreting the version + string as a decimal number. - For this specification version, this value is constant and MUST - be ``1.0``. + For this specification version, this value is constant and + **MUST** be ``1.0``. - Future versions of this schema MUST use a higher version number. - Future versions of this schema MUST NOT use the same **major** - version component as other schema version unless its + Future versions of this schema **MUST** use a higher version + number. Future versions of this schema **MUST NOT** use the same + **major** version component as other schema version unless its specification is deemed backwards-compatible with them — it can't change, or extend, any parts of the current specification in such a way as the semantics of the interpreted data differ, @@ -115,8 +121,8 @@ below, which is rendered in an human-readable format here. * - Required - **True** -``base_interpreter`` --------------------- +``base_prefix`` +--------------- .. list-table:: :widths: 25 75 @@ -124,18 +130,17 @@ below, which is rendered in an human-readable format here. * - Type - ``string`` * - Description - - The path to the Python interprer of the base installation. - Either an absolute path, or a relative path to the path defined - in the ``base_prefix`` key. + - Base prefix of the Python installation. + + Either an absolute path, or a path relative to directory where + this file is contained. * - Examples - - - ``/usr/bin/python`` - - ``bin/python`` - - etc. + - ``/usr``, ``../..``, etc. * - Required - - **False** + - **True** -``base_prefix`` ---------------- +``base_interpreter`` +-------------------- .. list-table:: :widths: 25 75 @@ -143,12 +148,16 @@ below, which is rendered in an human-readable format here. * - Type - ``string`` * - Description - - Base prefix of the Python installation. + - The path to the Python interprer of the base installation. - Either an absolute path, or a relative path to directory where - this file is contained. + Either an absolute path, or a path relative to ``base_prefix``. + + This field **MUST** be present if the installation provides an + interpreter executable. * - Examples - - ``/usr``, ``../..``, etc. + - - ``/usr/bin/python`` + - ``bin/python`` + - etc. * - Required - **False** @@ -163,7 +172,8 @@ below, which is rendered in an human-readable format here. * - Description - System platform string. - This field SHOULD be equivalent to ``sysconfig.get_platform()``. + This field **SHOULD** be equivalent to + ``sysconfig.get_platform()``. * - Examples - - ``linux-x86_64`` - etc. @@ -181,9 +191,6 @@ below, which is rendered in an human-readable format here. * - Description - Object containing details related to the Python language specification. - - In addition to the required keys, implementations may choose to - include extra keys with implementation-specific details. * - Required - **True** * - Additional properties @@ -201,7 +208,7 @@ below, which is rendered in an human-readable format here. - String representation the Python language version — a version string consisting only of the *major* and *minor* components. - This field SHOULD be equivalent to + This field **SHOULD** be equivalent to ``sysconfig.get_python_version()``. * - Examples - ``3.14``, etc. @@ -219,7 +226,7 @@ below, which is rendered in an human-readable format here. * - Description - Object in the format of :py:data:`sys.version_info`. - This section SHOULD be equivalent to + This section **SHOULD** be equivalent to :py:data:`sys.version_info`. * - Examples - - ``{'major': 3, 'minor': 14, 'micro': 1, 'releaselevel': 'final', 'serial': 0}`` @@ -295,7 +302,7 @@ below, which is rendered in an human-readable format here. * - Description - Object containing details related to Python implementation. - This section SHOULD be equivalent to + This section **SHOULD** be equivalent to :py:data:`sys.implementation`. It follows specification defined in PEP 421, meaning that on top of the required keys, implementation-specific keys can also exist, but must be @@ -422,7 +429,7 @@ below, which is rendered in an human-readable format here. - Build configuration flags, used to calculate the extension suffix. - The flags MUST be defined in the order they appear on the + The flags **MUST** be defined in the order they appear on the extension suffix. * - Examples - ``['t', 'd']``, etc. @@ -441,8 +448,8 @@ below, which is rendered in an human-readable format here. - Suffix used for extensions built against the current implementation version. - This field MUST be present if the Python implementation supports - extensions, otherwise this entry will be missing. + This field **MUST** be present if the Python implementation + supports extensions, otherwise this entry will be missing. * - Examples - - ``.cpython-314-x86_64-linux-gnu.so`` - etc. @@ -460,8 +467,8 @@ below, which is rendered in an human-readable format here. * - Description - Suffix used for extensions built against the stable ABI. - This field MUST be present if the Python implementation has a - stable ABI extension suffix, otherwise this entry will be + This field **MUST** be present if the Python implementation has + a stable ABI extension suffix, otherwise this entry will be missing. * - Examples - ``.abi3.so``, etc. @@ -479,15 +486,13 @@ below, which is rendered in an human-readable format here. * - Description - Valid module suffixes grouped by type. - This section SHOULD be equivalent to the - ``importlib.machinery.*_SUFFIXES`` attributes, if the - implementation provides such suffixes. However, if the Python - implementation does not provide suffixes of the kind specified - by any of the attributes, the equivalent sub-section is not - required to be present. Additionally, if a Python implementation - provides extension kinds other than the ones listed on - ``importlib.machinery`` module, they MAY add a sub-section for - them. + This section **MUST** be present if the Python installation + supports importing external files, and it **SHOULD** be + equivalent to the ``importlib.machinery.*_SUFFIXES`` attributes. + + Additionally, if a Python implementation provides extension + kinds other than the ones listed on ``importlib.machinery`` + module, they **MAY** add a sub-section for them. * - Examples - - ``{'source': ['.py'], 'bytecode': ['.pyc'], 'optimized_bytecode': ['.pyc'], 'debug_bytecode': ['.pyc'], 'extensions': ['.cpython-313-x86_64-linux-gnu.so', '.abi3.so', '.so']}`` - etc. @@ -507,8 +512,8 @@ below, which is rendered in an human-readable format here. * - Description - Object containing details related to the ``libpython`` library. - This section MUST by present if Python installation provides a - ``libpython`` library, otherwise this section will be missing. + This section **MUST** by present if Python installation provides + a ``libpython`` library, otherwise this section will be missing. * - Required - **False** * - Additional properties @@ -523,13 +528,13 @@ below, which is rendered in an human-readable format here. * - Type - ``string`` * - Description - - The path to the dynamic ``libpython`` library. Either an - absolute path, or a relative path to the path defined in the - ``base_prefix`` key. + - The path to the dynamic ``libpython`` library. - This field MUST be present if the Python installation provides a - dynamic ``libpython`` library, otherwise this entry will be - missing. + Either an absolute path, or a path relative to ``base_prefix``. + + This field **MUST** be present if the Python installation + provides a dynamic ``libpython`` library, otherwise this entry + will be missing. * - Examples - - ``/usr/lib/libpython3.14.so.1.0`` - ``lib/libpython3.14.so.1.0`` @@ -547,14 +552,15 @@ below, which is rendered in an human-readable format here. - ``string`` * - Description - The path to the dynamic ``libpython`` library for the stable - ABI. Either an absolute path, or a relative path to the path - defined in the ``base_prefix`` key. + ABI. + + Either an absolute path, or a path relative to ``base_prefix``. - This field MUST be present if the Python installation provides a - dynamic ``libpython`` library targetting the Stable ABI, - otherwise this entry will be missing. + This field **MUST** be present if the Python installation + provides a dynamic ``libpython`` library targetting the Stable + ABI, otherwise this entry will be missing. - If this key is present ``dynamic`` MUST also be set. + If this key is present ``dynamic`` **MUST** also be set. * - Examples - - ``/usr/lib/libpython3.so`` - ``lib/libpython3.so`` @@ -571,13 +577,13 @@ below, which is rendered in an human-readable format here. * - Type - ``string`` * - Description - - The path to the static ``libpython`` library. Either an absolute - path, or a relative path to the path defined in the - ``base_prefix`` key. + - The path to the static ``libpython`` library. - This field MUST be present if the Python installation provides a - static ``libpython`` library, otherwise this entry will be - missing. + Either an absolute path, or a path relative to ``base_prefix``. + + This field **MUST** be present if the Python installation + provides a static ``libpython`` library, otherwise this entry + will be missing. * - Examples - - ``/usr/lib/python3.14/config-3.14-x86_64-linux-gnu/libpython3.14.a`` - ``lib/python3.14/config-3.14-x86_64-linux-gnu/libpython3.14.a`` @@ -597,9 +603,9 @@ below, which is rendered in an human-readable format here. - Should extensions built against a dynamic ``libpython`` link to it? - This field MUST be present if the Python installation provides a - dynamic ``libpython`` library, otherwise this entry will be - missing. + This field **MUST** be present if the Python installation + provides a dynamic ``libpython`` library, otherwise this entry + will be missing. * - Required - **False** @@ -612,10 +618,9 @@ below, which is rendered in an human-readable format here. * - Type - ``object`` * - Description - - Object containing details related to the Python C API, if - available. + - Object containing details related to the Python C API. - This section MUST be present if the Python implementation + This section **MUST** be present if the Python implementation provides a C API, otherwise this section will be missing. * - Required - **False** @@ -631,8 +636,9 @@ below, which is rendered in an human-readable format here. * - Type - ``string`` * - Description - - The path to the C API headers. Either an absolute path, or a - relative path to the path defined in the ``base_prefix`` key. + - The path to the C API headers. + + Either an absolute path, or a path relative to ``base_prefix``. * - Examples - - ``/usr/include/python3.14`` - ``include/python3.14`` @@ -649,13 +655,13 @@ below, which is rendered in an human-readable format here. * - Type - ``string`` * - Description - - The path to the pkg-config definition files. Either an absolute - path, or a relative path to the path defined in the - ``base_prefix`` key. + - The path to the pkg-config definition files. + + Either an absolute path, or a path relative to ``base_prefix``. - This field MUST be present if the Python implementation provides - pkg-config definition files for the C API, otherwise this - section will be missing. + This field **MUST** be present if the Python implementation + provides pkg-config definition files, otherwise this section + will be missing. * - Examples - - ``/usr/lib/pkgconfig`` - ``lib/pkgconfig`` @@ -676,7 +682,7 @@ below, which is rendered in an human-readable format here. This is meant to be used as an escape-hatch, to include any relevant data that is not covered by this specification. - Implamentations may choose what data to provide in this section. + Implementations may choose what data to provide in this section. * - Required - **False** * - Additional properties @@ -706,15 +712,27 @@ JSON Schema Rejected Ideas ============== -Having a larger scope ---------------------- +Including environment-specific data +----------------------------------- One of the main requests in the discussion of this PEP was the inclusion of other kind of information, such as the ``site-packages`` path. It is the opinion of the PEP authors that information regarding the Python environment should be -provided by a separate file, creating the a clear separation between the build -details, which should be immutable across any interpreter instance, and details -that can change, such as environment details. +provided by a separate file. + +Including environment-specific data in the config file means that it would be +environment-specific, so virtual environments would need their own config file. +This is problematic because virtual environments survive updates of the base +Python installation, creating the possibily for the static config file to be +outdated, and making its data unreliable, which defeats its purpose. + +The proposed solution, partially implemented in this PEP, is to have a +``build-details.json`` file, referent to the base Python installation, and a +``environment.json`` file, referent to the specific environment. + +With ``build-details.json`` being part of the Python distribution, when the base +Python installation gets updated, ``build-details.json`` does too, ensuring the +static description files are never outdated. Copyright diff --git a/peps/pep-0739/python-build-info-v1.0.schema.json b/peps/pep-0739/python-build-info-v1.0.schema.json index 8f8648b52c9..a2b0e9c6563 100644 --- a/peps/pep-0739/python-build-info-v1.0.schema.json +++ b/peps/pep-0739/python-build-info-v1.0.schema.json @@ -2,9 +2,10 @@ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://github.com/python/peps/blob/main/peps/pep-0739/python-build-info-v1.0.schema.json", "type": "object", - "title": "Static description file for the build details of Python installations", + "title": "build-details.json — a static description file with build details of Python installations", "required": [ "schema_version", + "base_prefix", "platform", "language", "implementation" @@ -13,35 +14,35 @@ "properties": { "schema_version": { "type": "string", - "description": "Schema version.\n\nThis is a string following the format ``.``, where ```` and ```` are unpaded numbers and represent the **major** and **minor** components of the version. Versions may be arithmetic compared by intrepreting the version string as a decimal number.\n\nFor this specification version, this value is constant and MUST be ``1.0``.\n\nFuture versions of this schema MUST use a higher version number. Future versions of this schema MUST NOT use the same **major** version component as other schema version unless its specification is deemed backwards-compatible with them — it can't change, or extend, any parts of the current specification in such a way as the semantics of the interpreted data differ, or that data valid under the new specification is invalid under the older specification, with the exception of additional properties (errors caused by ``additionalProperties``).", + "description": "Schema version.\n\nThis is a string following the format ``.``, where ```` and ```` are unpaded numbers and represent the **major** and **minor** components of the version. Versions may be arithmetically compared by intrepreting the version string as a decimal number.\n\nFor this specification version, this value is constant and **MUST** be ``1.0``.\n\nFuture versions of this schema **MUST** use a higher version number. Future versions of this schema **MUST NOT** use the same **major** version component as other schema version unless its specification is deemed backwards-compatible with them — it can't change, or extend, any parts of the current specification in such a way as the semantics of the interpreted data differ, or that data valid under the new specification is invalid under the older specification, with the exception of additional properties (errors caused by ``additionalProperties``).", "const": "1.0" }, - "base_interpreter": { - "type": "string", - "description": "The path to the Python interprer of the base installation. Either an absolute path, or a relative path to the path defined in the ``base_prefix`` key.", - "examples": [ - "/usr/bin/python", - "bin/python" - ] - }, "base_prefix": { "type": "string", - "description": "Base prefix of the Python installation.\n\nEither an absolute path, or a relative path to directory where this file is contained.", + "description": "Base prefix of the Python installation.\n\nEither an absolute path, or a path relative to directory where this file is contained.", "examples": [ "/usr", "../.." ] }, + "base_interpreter": { + "type": "string", + "description": "The path to the Python interprer of the base installation.\n\nEither an absolute path, or a path relative to ``base_prefix``.\n\nThis field **MUST** be present if the installation provides an interpreter executable.", + "examples": [ + "/usr/bin/python", + "bin/python" + ] + }, "platform": { "type": "string", - "description": "System platform string.\n\nThis field SHOULD be equivalent to ``sysconfig.get_platform()``.", + "description": "System platform string.\n\nThis field **SHOULD** be equivalent to ``sysconfig.get_platform()``.", "examples": [ "linux-x86_64" ] }, "language": { "type": "object", - "description": "Object containing details related to the Python language specification.\n\nIn addition to the required keys, implementations may choose to include extra keys with implementation-specific details.", + "description": "Object containing details related to the Python language specification.", "required": [ "version" ], @@ -49,12 +50,12 @@ "properties": { "version": { "type": "string", - "description": "String representation the Python language version — a version string consisting only of the *major* and *minor* components.\n\nThis field SHOULD be equivalent to ``sysconfig.get_python_version()``.", + "description": "String representation the Python language version — a version string consisting only of the *major* and *minor* components.\n\nThis field **SHOULD** be equivalent to ``sysconfig.get_python_version()``.", "examples": ["3.14"] }, "version_info": { "type": "object", - "description": "Object in the format of :py:data:`sys.version_info`.\n\nThis section SHOULD be equivalent to :py:data:`sys.version_info`.", + "description": "Object in the format of :py:data:`sys.version_info`.\n\nThis section **SHOULD** be equivalent to :py:data:`sys.version_info`.", "required": ["major", "minor", "micro", "releaselevel", "serial"], "additionalProperties": false, "examples": [ @@ -89,7 +90,7 @@ }, "implementation": { "type": "object", - "description": "Object containing details related to Python implementation.\n\nThis section SHOULD be equivalent to :py:data:`sys.implementation`. It follows specification defined in PEP 421, meaning that on top of the required keys, implementation-specific keys can also exist, but must be prefixed with an underscore.", + "description": "Object containing details related to Python implementation.\n\nThis section **SHOULD** be equivalent to :py:data:`sys.implementation`. It follows specification defined in PEP 421, meaning that on top of the required keys, implementation-specific keys can also exist, but must be prefixed with an underscore.", "required": [ "name", "version", @@ -156,7 +157,7 @@ "properties": { "flags": { "type": "array", - "description": "Build configuration flags, used to calculate the extension suffix.\n\nThe flags MUST be defined in the order they appear on the extension suffix.", + "description": "Build configuration flags, used to calculate the extension suffix.\n\nThe flags **MUST** be defined in the order they appear on the extension suffix.", "additionalProperties": true, "examples": [ ["t", "d"] @@ -164,14 +165,14 @@ }, "extension_suffix": { "type": "string", - "description": "Suffix used for extensions built against the current implementation version.\n\nThis field MUST be present if the Python implementation supports extensions, otherwise this entry will be missing.", + "description": "Suffix used for extensions built against the current implementation version.\n\nThis field **MUST** be present if the Python implementation supports extensions, otherwise this entry will be missing.", "examples": [ ".cpython-314-x86_64-linux-gnu.so" ] }, "stable_abi_suffix": { "type": "string", - "description": "Suffix used for extensions built against the stable ABI.\n\nThis field MUST be present if the Python implementation has a stable ABI extension suffix, otherwise this entry will be missing.", + "description": "Suffix used for extensions built against the stable ABI.\n\nThis field **MUST** be present if the Python implementation has a stable ABI extension suffix, otherwise this entry will be missing.", "examples": [ ".abi3.so" ] @@ -180,7 +181,7 @@ }, "suffixes": { "type": "object", - "description": "Valid module suffixes grouped by type.\n\nThis section SHOULD be equivalent to the ``importlib.machinery.*_SUFFIXES`` attributes, if the implementation provides such suffixes. However, if the Python implementation does not provide suffixes of the kind specified by any of the attributes, the equivalent sub-section is not required to be present. Additionally, if a Python implementation provides extension kinds other than the ones listed on ``importlib.machinery`` module, they MAY add a sub-section for them.", + "description": "Valid module suffixes grouped by type.\n\nThis section **MUST** be present if the Python installation supports importing external files, and it **SHOULD** be equivalent to the ``importlib.machinery.*_SUFFIXES`` attributes.\n\nAdditionally, if a Python implementation provides extension kinds other than the ones listed on ``importlib.machinery`` module, they **MAY** add a sub-section for them.", "examples": [ { "source": [".py"], @@ -193,12 +194,12 @@ }, "libpython": { "type": "object", - "description": "Object containing details related to the ``libpython`` library.\n\nThis section MUST by present if Python installation provides a ``libpython`` library, otherwise this section will be missing.", + "description": "Object containing details related to the ``libpython`` library.\n\nThis section **MUST** by present if Python installation provides a ``libpython`` library, otherwise this section will be missing.", "additionalProperties": false, "properties": { "dynamic": { "type": "string", - "description": "The path to the dynamic ``libpython`` library. Either an absolute path, or a relative path to the path defined in the ``base_prefix`` key.\n\nThis field MUST be present if the Python installation provides a dynamic ``libpython`` library, otherwise this entry will be missing.", + "description": "The path to the dynamic ``libpython`` library.\n\nEither an absolute path, or a path relative to ``base_prefix``.\n\nThis field **MUST** be present if the Python installation provides a dynamic ``libpython`` library, otherwise this entry will be missing.", "examples": [ "/usr/lib/libpython3.14.so.1.0", "lib/libpython3.14.so.1.0" @@ -206,7 +207,7 @@ }, "dynamic_stableabi": { "type": "string", - "description": "The path to the dynamic ``libpython`` library for the stable ABI. Either an absolute path, or a relative path to the path defined in the ``base_prefix`` key.\n\nThis field MUST be present if the Python installation provides a dynamic ``libpython`` library targetting the Stable ABI, otherwise this entry will be missing.\n\nIf this key is present ``dynamic`` MUST also be set.", + "description": "The path to the dynamic ``libpython`` library for the stable ABI.\n\nEither an absolute path, or a path relative to ``base_prefix``.\n\nThis field **MUST** be present if the Python installation provides a dynamic ``libpython`` library targetting the Stable ABI, otherwise this entry will be missing.\n\nIf this key is present ``dynamic`` **MUST** also be set.", "examples": [ "/usr/lib/libpython3.so", "lib/libpython3.so" @@ -214,7 +215,7 @@ }, "static": { "type": "string", - "description": "The path to the static ``libpython`` library. Either an absolute path, or a relative path to the path defined in the ``base_prefix`` key.\n\nThis field MUST be present if the Python installation provides a static ``libpython`` library, otherwise this entry will be missing.", + "description": "The path to the static ``libpython`` library.\n\nEither an absolute path, or a path relative to ``base_prefix``.\n\nThis field **MUST** be present if the Python installation provides a static ``libpython`` library, otherwise this entry will be missing.", "examples": [ "/usr/lib/python3.14/config-3.14-x86_64-linux-gnu/libpython3.14.a", "lib/python3.14/config-3.14-x86_64-linux-gnu/libpython3.14.a" @@ -222,13 +223,13 @@ }, "link_extensions": { "type": "boolean", - "description": "Should extensions built against a dynamic ``libpython`` link to it?\n\nThis field MUST be present if the Python installation provides a dynamic ``libpython`` library, otherwise this entry will be missing." + "description": "Should extensions built against a dynamic ``libpython`` link to it?\n\nThis field **MUST** be present if the Python installation provides a dynamic ``libpython`` library, otherwise this entry will be missing." } } }, "c_api": { "type": "object", - "description": "Object containing details related to the Python C API, if available.\n\nThis section MUST be present if the Python implementation provides a C API, otherwise this section will be missing.", + "description": "Object containing details related to the Python C API.\n\nThis section **MUST** be present if the Python implementation provides a C API, otherwise this section will be missing.", "required": [ "headers" ], @@ -236,7 +237,7 @@ "properties": { "headers": { "type": "string", - "description": "The path to the C API headers. Either an absolute path, or a relative path to the path defined in the ``base_prefix`` key.", + "description": "The path to the C API headers.\n\nEither an absolute path, or a path relative to ``base_prefix``.", "examples": [ "/usr/include/python3.14", "include/python3.14" @@ -244,7 +245,7 @@ }, "pkgconfig_path": { "type": "string", - "description": "The path to the pkg-config definition files. Either an absolute path, or a relative path to the path defined in the ``base_prefix`` key.\n\nThis field MUST be present if the Python implementation provides pkg-config definition files for the C API, otherwise this section will be missing.", + "description": "The path to the pkg-config definition files.\n\nEither an absolute path, or a path relative to ``base_prefix``.\n\nThis field **MUST** be present if the Python implementation provides pkg-config definition files, otherwise this section will be missing.", "examples": [ "/usr/lib/pkgconfig", "lib/pkgconfig" @@ -254,7 +255,7 @@ }, "arbitrary_data": { "type": "object", - "description": "Object containing extra arbitrary data.\n\nThis is meant to be used as an escape-hatch, to include any relevant data that is not covered by this specification. Implamentations may choose what data to provide in this section.", + "description": "Object containing extra arbitrary data.\n\nThis is meant to be used as an escape-hatch, to include any relevant data that is not covered by this specification. Implementations may choose what data to provide in this section.", "additionalProperties": true } }