Este conjunto de reglas existe para permitirte modelar plataformas de hardware específicas para las que compilas 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 reglaconstraint_setting(name, default_constraint_value, deprecation, distribs, features, licenses, tags, testonly, visibility)
Esta regla se usa para introducir un nuevo tipo de restricción para el que 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 instaladas diferentes versiones de la biblioteca glibc.
Para obtener más detalles, consulta la
página Plataformas.
Cada constraint_setting tiene un conjunto extensible de constraint_values asociadas. Por lo general, se definen en el mismo paquete, pero, a veces, un paquete diferente introduce valores nuevos para un parámetro de configuración existente. Por ejemplo, el parámetro de configuración predefinido @platforms//cpu:cpu se puede extender con un valor personalizado para definir una plataforma que se oriente a una arquitectura de CPU oscura.
Argumentos
| Atributos | |
|---|---|
name |
Nombre; obligatorio Un nombre único para este destino. |
default_constraint_value
|
Nombre; no configurable; el valor predeterminado es constraint_value al que apunta debe definirse en el
mismo paquete que este constraint_setting.
Si un parámetro de configuración de restricción tiene un valor predeterminado, cada vez que una plataforma no incluya
ningún valor de restricción para ese parámetro de configuración, será lo mismo que si la plataforma hubiera especificado el
valor predeterminado. De lo contrario, si no hay un valor predeterminado, la plataforma considera que el parámetro de configuración de restricción no está especificado. En ese caso, la plataforma no coincidirá con ninguna
lista de restricciones (como para un |
constraint_value
Ver el código fuente de la reglaconstraint_value(name, constraint_setting, deprecation, distribs, features, licenses, tags, testonly, visibility)
Ejemplo
A continuación, se crea un nuevo valor posible para el constraint_value predefinido que representa la arquitectura de CPU.
constraint_value(
name = "mips",
constraint_setting = "@platforms//cpu:cpu",
)
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 Elconstraint_setting para el que este constraint_value es una
opción posible.
|
platform
Ver el código fuente de la reglaplatform(name, constraint_values, deprecation, distribs, exec_properties, features, licenses, parents, remote_execution_properties, tags, testonly, visibility)
Esta regla define una plataforma nueva: una colección con nombre de opciones de restricción (como la arquitectura de CPU o la versión del compilador) que describe un entorno en el que se puede ejecutar parte de la compilación. Para obtener más detalles, 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 plataformas
Las plataformas pueden usar el atributo parents para especificar otra plataforma de la que heredarán los valores de restricción. Aunque el atributo parents toma una lista, actualmente no
se admite más de un valor, y especificar varios elementos superiores es un error.
Cuando se verifica el valor de un parámetro de configuración de restricción en una plataforma, primero se verifican los valores establecidos directamente
(a través del atributo constraint_values) y, luego, los valores de restricción en
el elemento superior. Esto continúa de forma recursiva en la cadena de plataformas superiores. De esta manera, cualquier
valor establecido directamente en una plataforma anulará los valores establecidos en el elemento superior.
Las plataformas heredan el atributo exec_properties de la plataforma superior.
Se combinarán las entradas de diccionario en exec_properties de las plataformas superiores y secundarias.
Si la misma clave aparece en exec_properties del elemento superior y del elemento secundario,
se usará el valor del elemento secundario. Si la plataforma secundaria especifica una cadena vacía como valor, se
anulará la propiedad correspondiente.
Las plataformas también pueden heredar el atributo (obsoleto) remote_execution_properties
de la plataforma superior. Nota: El código nuevo debe usar exec_properties en su lugar. La
lógica que se describe a continuación se mantiene para que sea compatible con el comportamiento heredado, pero se quitará
en el futuro.
La lógica para establecer remote_execution_platform es la siguiente cuando hay
una plataforma superior:
-
Si
remote_execution_propertyno está configurado en la plataforma secundaria, se usaráremote_execution_propertiesdel elemento superior. -
Si
remote_execution_propertyestá configurado en la plataforma secundaria y contiene la cadena literal {PARENT_REMOTE_EXECUTION_PROPERTIES}, esa macro se reemplazará por el contenido del atributoremote_execution_propertydel elemento superior. -
Si
remote_execution_propertyestá configurado en la plataforma secundaria y no contiene la macro, se usaráremote_execution_propertydel elemento secundario sin cambios.
Dado que remote_execution_properties está obsoleto y se dejará de usar, no se permite combinar
remote_execution_properties y exec_properties en la misma
cadena de herencia.
Es preferible usar exec_properties en lugar de
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_atiene los valores de restricción@platforms//os:linux(heredado del elemento superior) y@platforms//cpu:x86_64(establecido directamente en la plataforma). -
child_bhereda todos los valores de restricción del elemento superior y no establece ninguno propio.
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_ahereda las "exec_properties" del elemento superior y no establece las suyas. -
child_bhereda elexec_propertiesdel elemento superior y anula el valor dek1. Suexec_propertiesserá:{ "k1": "child", "k2": "v2" }. -
child_cheredaexec_propertiesdel elemento superior y anulak1. Suexec_propertiesserá:{ "k2": "v2" }. -
child_dheredaexec_propertiesdel elemento superior y agrega una propiedad nueva. Suexec_propertiesserá:{ "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 Cada |
exec_properties
|
Diccionario: String -> String; no configurable; el valor predeterminado es exec_properties de la plataforma superior.
Si la plataforma secundaria y superior definen las mismas claves, se conservan los valores del elemento secundario. Se quitan del diccionario las claves asociadas con un valor que es una cadena vacía.
Este atributo es un reemplazo completo de
remote_execution_properties obsoleta.
|
parents
|
Lista de etiquetas; no configurable; el valor predeterminado es platform del que debe heredar esta plataforma. Aunque
el atributo toma una lista, no debe haber más de una plataforma presente. Cualquier
constraint_settings que no se establezca directamente en esta plataforma se encontrará en la plataforma superior.
Consulta la sección sobre herencia de plataformas para obtener más detalles.
|
remote_execution_properties
|
Cadena; no configurable; el valor predeterminado es |
toolchain
Ver el código fuente de la reglatoolchain(name, deprecation, distribs, exec_compatible_with, features, licenses, tags, target_compatible_with, target_settings, testonly, toolchain, toolchain_type, visibility)
Esta regla declara el tipo y las restricciones de una cadena de herramientas específica para que se pueda seleccionar durante la resolución de la cadena de herramientas. Consulta la página Cadenas de herramientas para obtener 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 constraint_values que debe satisfacer una plataforma de ejecución para que se seleccione esta cadena de herramientas para un destino que se compila en esa plataforma.
|
target_compatible_with
|
Lista de etiquetas; no configurable; el valor predeterminado es constraint_values que debe satisfacer la plataforma de destino para que se seleccione esta cadena de herramientas para un destino que se compila para esa plataforma.
|
target_settings
|
Lista de etiquetas; el valor predeterminado es config_settings que debe satisfacer la configuración de destino
para que se seleccione esta cadena de herramientas durante la resolución de la cadena de herramientas.
|
toolchain
|
Nombre; obligatorio El destino que representa la herramienta o el conjunto de herramientas reales que se ponen a disposición cuando se selecciona esta cadena de herramientas. |
toolchain_type
|
Etiqueta; no configurable; obligatorio La etiqueta de un destinotoolchain_type que representa el rol que cumple esta
cadena de herramientas.
|
toolchain_type
Ver el código fuente de la reglatoolchain_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 destino simple que representa una clase de herramientas que cumplen el mismo rol para diferentes 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 usar 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. |