Reglas de plataformas y cadenas de herramientas

Informar un problema Ver fuente Por la noche · 7.2 · 7.1 · 7.0 · 6.5 · 6.4

Este conjunto de reglas existe para permitirte modelar plataformas de hardware específicas compilar y especificar las herramientas específicas que podrías necesitar para compilar código para esas plataformas. El usuario debe estar familiarizado con los conceptos que se explican aquí.

Reglas

constraint_setting

Ver el código fuente de la regla
constraint_setting(name, default_constraint_value, deprecation, distribs, features, licenses, tags, testonly, visibility)

Esta regla se usa para ingresar un nuevo tipo de restricción para el cual una plataforma puede especificar un valor. Por ejemplo, puedes definir un constraint_setting llamado "glibc_version" para representar la capacidad de las plataformas de tener diferentes versiones de la biblioteca glibc instaladas. Para obtener más detalles, consulta la Plataformas.

Cada constraint_setting tiene un conjunto extensible de servicios constraint_value Por lo general, se definen en el mismo paquete, pero a veces un cada paquete ingresará valores nuevos para un parámetro de configuración existente. Por ejemplo, el rol predefinido la configuración de @platforms//cpu:cpu se puede extender con un valor personalizado para definir una plataforma dirigida a una arquitectura de CPU desconocida

Argumentos

Atributos
name

Nombre: obligatorio.

Un nombre único para este destino.

default_constraint_value

Nombre: no configurable; el valor predeterminado es None

Es la etiqueta del valor predeterminado para esta configuración, que se usará si no se proporciona ningún valor. Si esta está presente, el constraint_value al que apunta debe definirse en el mismo paquete que este constraint_setting.

Si la configuración de una restricción tiene un valor predeterminado, cada vez que una plataforma no incluya cualquier valor de restricción para esa configuración, es lo mismo que si la plataforma hubiera especificado la el valor predeterminado. De lo contrario, si no hay un valor predeterminado, se considera la configuración de la restricción. que la plataforma no especifica. En ese caso, la plataforma no coincidiría con ninguna lista de restricciones (como para un config_setting) que requiere un valor particular para ese parámetro de configuración.

constraint_value

Ver el código fuente de la regla
constraint_value(name, constraint_setting, deprecation, distribs, features, licenses, tags, testonly, visibility)
Esta regla agrega un valor nuevo para un tipo de restricción determinado. Para obtener más detalles, consulta la Plataformas.

Ejemplo

Lo siguiente crea un nuevo valor posible para el constraint_value predefinido que representan la arquitectura de la CPU.

constraint_value(
    name = "mips",
    constraint_setting = "@platforms//cpu:cpu",
)
Luego, las plataformas pueden declarar que tienen la arquitectura mips como alternativa a x86_64, arm, etcétera.

Argumentos

Atributos
name

Nombre: obligatorio.

Un nombre único para este destino.

constraint_setting

Etiqueta; no configurable; obligatorio.

El constraint_setting para el que este constraint_value es un la mejor opción posible.

plataforma

Ver el código fuente de la regla
platform(name, constraint_values, deprecation, distribs, exec_properties, features, licenses, parents, remote_execution_properties, tags, testonly, visibility)

Esta regla define una nueva plataforma: una colección con nombre de opciones de restricciones (como la arquitectura de CPU o la versión del compilador) y describir un entorno en qué parte de la compilación se puede ejecutar. Para obtener más información, consulta la página Plataformas.

Ejemplo

Esto define una plataforma que describe cualquier entorno que ejecute Linux en ARM.

platform(
    name = "linux_arm",
    constraint_values = [
        "@platforms//os:linux",
        "@platforms//cpu:arm",
    ],
)

Herencia de la plataforma

Las plataformas pueden usar el atributo parents para especificar otra plataforma con la que del que heredan los valores de las restricciones. Aunque el atributo parents toma una lista, no se admite más de un solo valor, y un error especificar varios elementos superiores es un error.

Cuando verifiques el valor de una configuración de restricciones en una plataforma, primero, los valores establecen (mediante el atributo constraint_values) y, luego, los valores de la restricción en el elemento superior. Esto continúa de forma recurrente en la cadena de plataformas superiores. De esta manera, cualquier de forma directa en una plataforma anularán los valores establecidos en la plataforma superior.

Las plataformas heredan el atributo exec_properties de la plataforma superior. Las entradas del diccionario en exec_properties de las plataformas superiores y secundarias se combinarán. Si aparece la misma clave en el exec_properties del elemento superior y el secundario, se usará el valor del elemento secundario. Si la plataforma secundaria especifica una cadena vacía como valor, el la propiedad correspondiente.

Las plataformas también pueden heredar el atributo remote_execution_properties (obsoleto) desde la plataforma principal. Nota: El código nuevo debe usar exec_properties en su lugar. El descrita a continuación se mantiene para que sea compatible con el comportamiento heredado, pero se quitará en el futuro. La lógica para configurar remote_execution_platform es la siguiente cuando hay es una plataforma principal:

  1. Si remote_execution_property no se configura en la plataforma secundaria, el directorio superior Se usará remote_execution_properties.
  2. Si remote_execution_property se configura en la plataforma secundaria y contiene el elemento literal {PARENT_REMOTE_EXECUTION_PROPERTIES}, esa macro se Se reemplazará por el contenido del atributo remote_execution_property del elemento superior.
  3. Si remote_execution_property se configura en la plataforma secundaria y no contiene la macro, el remote_execution_property del elemento secundario se usará sin cambios.

Dado que remote_execution_properties dejó de estar disponible y se eliminará de forma gradual, la combinación remote_execution_properties y exec_properties en el mismo cadena de herencia no permitida. Es preferible usar exec_properties en lugar de la versión obsoleta. remote_execution_properties

Ejemplo: valores de restricción

platform(
    name = "parent",
    constraint_values = [
        "@platforms//os:linux",
        "@platforms//cpu:arm",
    ],
)
platform(
    name = "child_a",
    parents = [":parent"],
    constraint_values = [
        "@platforms//cpu:x86_64",
    ],
)
platform(
    name = "child_b",
    parents = [":parent"],
)

En este ejemplo, las plataformas secundarias tienen las siguientes propiedades:

  • child_a tiene los valores de restricción @platforms//os:linux (heredados). del elemento superior) y @platforms//cpu:x86_64 (configurado directamente en la plataforma).
  • child_b hereda todos los valores de restricción del elemento superior y no establece ninguno de por sí solos.

Ejemplo: Propiedades de ejecución

platform(
    name = "parent",
    exec_properties = {
      "k1": "v1",
      "k2": "v2",
    },
)
platform(
    name = "child_a",
    parents = [":parent"],
)
platform(
    name = "child_b",
    parents = [":parent"],
    exec_properties = {
      "k1": "child"
    }
)
platform(
    name = "child_c",
    parents = [":parent"],
    exec_properties = {
      "k1": ""
    }
)
platform(
    name = "child_d",
    parents = [":parent"],
    exec_properties = {
      "k3": "v3"
    }
)

En este ejemplo, las plataformas secundarias tienen las siguientes propiedades:

  • child_a hereda las "exec_properties" del elemento superior y no establece el suyo.
  • child_b hereda el exec_properties del elemento superior y anula el valor de k1. Su exec_properties será: { "k1": "child", "k2": "v2" }
  • child_c hereda el exec_properties del elemento superior y no lo establece. k1 Su exec_properties será: { "k2": "v2" }
  • child_d hereda el exec_properties del elemento superior y agrega un nuevo propiedad. Su exec_properties será: { "k1": "v1", "k2": "v2", "k3": "v3" }

Argumentos

Atributos
name

Nombre: obligatorio.

Un nombre único para este destino.

constraint_values

Lista de etiquetas; no configurable; el valor predeterminado es []

Es la combinación de opciones de restricciones que incluye esta plataforma. Para que una plataforma para que se apliquen a un entorno determinado, este debe tener al menos los valores de esta lista.

Cada constraint_value de esta lista debe corresponder a una constraint_setting Por ejemplo, no puedes definir una plataforma que requiera el que la arquitectura de CPU sea @platforms//cpu:x86_64 y @platforms//cpu:arm

exec_properties

Diccionario: Cadena -> String; no configurable; el valor predeterminado es {}

Un mapa de cadenas que afectan la forma en que las acciones se ejecutan de forma remota. Bazel no hace ningún intento. para interpretar esto, se tratan como datos opacos que se reenvían a través del campo Plataforma de el protocolo de ejecución remota. Esto incluye cualquier dato de los atributos exec_properties de la plataforma superior. Si la plataforma secundaria y la plataforma superior definen las mismas claves, se conservan los valores del elemento secundario. Cualquiera las claves asociadas con un valor que es una cadena vacía se quitan del diccionario. Este atributo reemplaza por completo el atributo obsoleto remote_execution_properties
parents

Lista de etiquetas; no configurable; el valor predeterminado es []

Es la etiqueta de un destino platform del que esta plataforma debe heredar. Si bien el atributo toma una lista, no debe haber más de una plataforma presente. Cualquiera La configuración constraint_settings no establecida directamente en esta plataforma se encontrará en la plataforma superior. Consulta la sección Herencia de la plataforma para obtener más detalles.
remote_execution_properties

String; no configurable; el valor predeterminado es ""

OBSOLETO. En su lugar, usa el atributo exec_properties. Una cadena que se usa para configurar una plataforma de ejecución remota. Las compilaciones reales no intentan interpretan esto, se tratan como datos opacos que un SpawnRunner específico puede usar. Puede incluir datos de "remote_execution_properties" de la plataforma superior. atributo, con la macro “{PARENT_REMOTE_EXECUTION_PROPERTIES}”. Consulta la sección sobre Consulta Herencia de la plataforma para obtener más detalles.

cadena de herramientas

Ver el código fuente de la regla
toolchain(name, deprecation, distribs, exec_compatible_with, features, licenses, tags, target_compatible_with, target_settings, testonly, toolchain, toolchain_type, visibility)

Esta regla declara las restricciones y el tipo de una cadena de herramientas específica para que se pueda seleccionar. durante la resolución de la cadena de herramientas. Consulta la Cadenas de herramientas para obtener más información más detalles.

Argumentos

Atributos
name

Nombre: obligatorio.

Un nombre único para este destino.

exec_compatible_with

Lista de etiquetas; no configurable; el valor predeterminado es []

Una lista de constraint_value que una plataforma de ejecución debe cumplir en a fin de que se seleccione esta cadena de herramientas para una compilación objetivo en esa plataforma.
target_compatible_with

Lista de etiquetas; no configurable; el valor predeterminado es []

Una lista de constraint_value que la plataforma de segmentación debe cumplir en a fin de que se seleccione esta cadena de herramientas para una compilación objetivo de esa plataforma.
target_settings

Lista de etiquetas; el valor predeterminado es []

Una lista de config_setting que la configuración de destino debe satisfacer para que se seleccione esta cadena de herramientas durante su resolución.
toolchain

Nombre: obligatorio.

El objetivo que representa la herramienta o el paquete de herramientas real que está disponible cuando este la cadena de herramientas.
toolchain_type

Etiqueta; no configurable; obligatorio.

La etiqueta de un destino toolchain_type que representa el rol que este la cadena de herramientas.

toolchain_type

Ver el código fuente de la regla
toolchain_type(name, compatible_with, deprecation, features, restricted_to, tags, target_compatible_with, testonly, visibility)

Esta regla define un nuevo tipo de cadena de herramientas: un objetivo simple que representa una clase de herramientas que tienen la misma función en distintas plataformas.

Consulta la página Cadenas de herramientas para obtener más detalles.

Ejemplo

Esto define un tipo de cadena de herramientas para una regla personalizada.

toolchain_type(
    name = "bar_toolchain_type",
)

Se puede utilizar en un archivo bzl.

bar_binary = rule(
    implementation = _bar_binary_impl,
    attrs = {
        "srcs": attr.label_list(allow_files = True),
        ...
        # No `_compiler` attribute anymore.
    },
    toolchains = ["//bar_tools:toolchain_type"]
)

Argumentos

Atributos
name

Nombre: obligatorio.

Un nombre único para este destino.