Esse conjunto de regras permite modelar plataformas de hardware específicas que você está criando e especificar as ferramentas específicas que você pode precisar para compilar o código para essas plataformas. O usuário precisa conhecer os conceitos explicados aqui.
Regras
constraint_setting
Acessar a origem da regraconstraint_setting(name, default_constraint_value, deprecation, distribs, features, licenses, tags, testonly, visibility)
Essa regra é usada para introduzir um novo tipo de restrição em que uma plataforma pode especificar um valor.
Por exemplo, é possível definir um constraint_setting
com o nome "glibc_version" para representar
a capacidade de plataformas terem diferentes versões da biblioteca glibc instaladas.
Para mais detalhes, consulte a página
Plataformas.
Cada constraint_setting
tem um conjunto extensível de constraint_value
s
associados. Normalmente, elas são definidas no mesmo pacote, mas às vezes um
pacote diferente introduz novos valores para uma configuração existente. Por exemplo, a configuração
predefinida @platforms//cpu:cpu
pode ser estendida com um valor personalizado para
definir uma plataforma com foco em uma arquitetura de CPU obscura.
Argumentos
Atributos | |
---|---|
name |
Nome: obrigatório Um nome exclusivo para essa segmentação. |
default_constraint_value
|
Nome: não configurável; o padrão é constraint_value para o qual ele aponta precisa ser definido no
mesmo pacote que este constraint_setting .
Se uma configuração de restrição tiver um valor padrão, sempre que uma plataforma não incluir
nenhum valor de restrição para essa configuração, será como se a plataforma tivesse especificado o
valor padrão. Caso contrário, se não houver um valor padrão, a configuração de restrição será considerada
não especificada por essa plataforma. Nesse caso, a plataforma não corresponderia a nenhuma
lista de restrições (como para um |
constraint_value
Acessar a origem da regraconstraint_value(name, constraint_setting, deprecation, distribs, features, licenses, tags, testonly, visibility)
Exemplo
O código a seguir cria um novo valor possível para o constraint_value
predefinido
que representa a arquitetura da CPU.
constraint_value( name = "mips", constraint_setting = "@platforms//cpu:cpu", )
mips
como alternativa a
x86_64
, arm
e assim por diante.
Argumentos
Atributos | |
---|---|
name |
Nome: obrigatório Um nome exclusivo para essa segmentação. |
constraint_setting
|
Rótulo: não configurável; obrigatório Oconstraint_setting para o qual este constraint_value é uma
opção possível.
|
plataforma
Acessar a origem da regraplatform(name, constraint_values, deprecation, distribs, exec_properties, features, flags, licenses, parents, remote_execution_properties, required_settings, tags, testonly, visibility)
Essa regra define uma nova plataforma, uma coleção nomeada de escolhas de restrição (como arquitetura de CPU ou versão do compilador) que descreve um ambiente em que parte do build pode ser executada. Para mais detalhes, consulte a página Plataformas.
Exemplo
Isso define uma plataforma que descreve qualquer ambiente que executa o Linux no ARM.
platform( name = "linux_arm", constraint_values = [ "@platforms//os:linux", "@platforms//cpu:arm", ], )
Flags da plataforma
As plataformas podem usar o atributo flags
para especificar uma lista de flags que serão adicionadas
à configuração sempre que a plataforma for usada como a plataforma de destino (ou seja, como o valor da
flag --platforms
).
As flags definidas pela plataforma têm a maior precedência e substituem qualquer valor anterior da flag, seja na linha de comando, no arquivo rc ou na transição.
Exemplo
platform( name = "foo", flags = [ "--dynamic_mode=fully", "--//bool_flag", "--no//package:other_bool_flag", ], )
Isso define uma plataforma chamada foo
. Quando essa é a plataforma de destino (porque
o usuário especificou --platforms//:foo
, porque uma transição definiu a
flag //command_line_option:platforms
como ["//:foo"]
ou porque
//:foo
foi usado como uma plataforma de execução), as flags serão definidas na
configuração.
Plataformas e flags repetíveis
Algumas flags acumulam valores quando são repetidas, como --features
,
--copt
e qualquer flag do Starlark criada como config.string(repeatable = True)
.
Essas flags não são compatíveis com a configuração das flags da plataforma. Em vez disso, todos os valores anteriores serão removidos e substituídos pelos valores da plataforma.
Como exemplo, considerando a plataforma a seguir, a invocação build --platforms=//:repeat_demo
--features feature_a --features feature_b
vai resultar em ["feature_c", "feature_d"]
como o valor da
flag --feature
, removendo os recursos
definidos na linha de comando.
platform( name = "repeat_demo", flags = [ "--features=feature_c", "--features=feature_d", ], )
Por esse motivo, não é recomendável usar flags repetíveis no atributo flags
.
Herança de plataforma
As plataformas podem usar o atributo parents
para especificar outra plataforma de que vão
herdar os valores de restrição. Embora o atributo parents
receba uma lista, atualmente só é possível usar um único valor, e especificar vários pais é um erro.
Ao verificar o valor de uma configuração de restrição em uma plataforma, primeiro os valores definidos diretamente
(pelo atributo constraint_values
) são verificados e, em seguida, os valores de restrição no
elemento pai. Isso continua de maneira recorrente na cadeia de plataformas principais. Dessa forma, todos os
valores definidos diretamente em uma plataforma vão substituir os valores definidos na plataforma pai.
As plataformas herdam o atributo exec_properties
da plataforma mãe.
As entradas do dicionário em exec_properties
das plataformas pai e filho
serão combinadas.
Se a mesma chave aparecer na exec_properties
da entidade pai e da filha,
o valor da filha será usado. Se a plataforma filha especificar uma string vazia como um valor, a
propriedade correspondente será redefinida.
As plataformas também podem herdar o atributo remote_execution_properties
(descontinuado)
da plataforma pai. Observação: o novo código precisa usar exec_properties
. A
lógica descrita abaixo é mantida para ser compatível com o comportamento legado, mas será removida
no futuro.
A lógica para definir o remote_execution_platform
é a seguinte quando há
uma plataforma pai:
-
Se
remote_execution_property
não estiver definido na plataforma filha, oremote_execution_properties
da plataforma mãe será usado. -
Se
remote_execution_property
estiver definido na plataforma filha e contiver a string literal {PARENT_REMOTE_EXECUTION_PROPERTIES}, essa macro será substituída pelo conteúdo do atributoremote_execution_property
da plataforma mãe. -
Se
remote_execution_property
for definido na plataforma filha e não contiver a macro, oremote_execution_property
da filha será usado sem alterações.
Como remote_execution_properties
foi descontinuado e será removido, não é permitido misturar
remote_execution_properties
e exec_properties
na mesma
cadeia de herança.
Prefira usar exec_properties
em vez de remote_execution_properties
descontinuado.
Exemplo: valores de restrição
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"], )
Neste exemplo, as plataformas filhas têm as seguintes propriedades:
-
child_a
tem os valores de restrição@platforms//os:linux
(herdado do elemento pai) e@platforms//cpu:x86_64
(definido diretamente na plataforma). -
child_b
herda todos os valores de restrição do elemento pai e não define nenhum próprio.
Exemplo: propriedades de execução
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" } )
Neste exemplo, as plataformas filhas têm as seguintes propriedades:
-
child_a
herda o "exec_properties" do elemento pai e não define o próprio. -
child_b
herda oexec_properties
do pai e substitui o valor dek1
. Oexec_properties
será:{ "k1": "child", "k2": "v2" }
. -
child_c
herda oexec_properties
do pai e definek1
como "unset". Oexec_properties
será:{ "k2": "v2" }
. -
child_d
herda oexec_properties
do pai e adiciona uma nova propriedade. Oexec_properties
será:{ "k1": "v1", "k2": "v2", "k3": "v3" }
.
Argumentos
Atributos | |
---|---|
name |
Nome: obrigatório Um nome exclusivo para essa segmentação. |
constraint_values
|
Lista de rótulos; não configurável; o padrão é Cada |
exec_properties
|
Dicionário: String -> String; não configurável; o padrão é exec_properties da plataforma mãe.
Se a plataforma filha e a plataforma pai definirem as mesmas chaves, os valores da plataforma filha serão mantidos. Todas as chaves associadas a um valor que é uma string vazia são removidas do dicionário.
Esse atributo substitui totalmente o remote_execution_properties
descontinuado.
|
flags
|
Lista de strings não configuráveis; o padrão é |
parents
|
Lista de rótulos; não configurável; o padrão é platform que essa plataforma precisa herdar. Embora
o atributo receba uma lista, não pode haver mais de uma plataforma. Todas as
constraint_settings que não forem definidas diretamente nesta plataforma serão encontradas na plataforma pai.
Consulte a seção sobre Herança de plataforma para mais detalhes.
|
remote_execution_properties
|
String; não configurável; o padrão é |
required_settings
|
Lista de rótulos; o padrão é config_setting s que precisam ser atendidos pela configuração de destino
para que essa plataforma seja usada como uma plataforma de execução durante a resolução do conjunto de ferramentas.
As configurações obrigatórias não são herdadas das plataformas mãe.
|
conjunto de ferramentas
Acessar a origem da regratoolchain(name, deprecation, distribs, exec_compatible_with, features, licenses, tags, target_compatible_with, target_settings, testonly, toolchain, toolchain_type, visibility)
Essa regra declara o tipo e as restrições de um conjunto de ferramentas específico para que ele possa ser selecionado durante a resolução do conjunto de ferramentas. Consulte a página Toolchains para mais detalhes.
Argumentos
Atributos | |
---|---|
name |
Nome: obrigatório Um nome exclusivo para essa segmentação. |
exec_compatible_with
|
Lista de rótulos; não configurável; o padrão é constraint_value s que precisam ser atendidos por uma plataforma de execução para
que esse conjunto de ferramentas seja selecionado para um edifício de destino nessa plataforma.
|
target_compatible_with
|
Lista de rótulos; não configurável; o padrão é constraint_value s que precisam ser atendidos pela plataforma de destino para
que esse conjunto de ferramentas seja selecionado para um build de destino para essa plataforma.
|
target_settings
|
Lista de rótulos; o padrão é config_setting s que precisam ser atendidos pela configuração de destino
para que esse conjunto de ferramentas seja selecionado durante a resolução.
|
toolchain
|
Nome: obrigatório O destino que representa a ferramenta ou o conjunto de ferramentas real que é disponibilizado quando esse conjunto de ferramentas é selecionado. |
toolchain_type
|
Rótulo: não configurável; obrigatório O rótulo de um destinotoolchain_type que representa o papel que esse
conjunto de ferramentas atende.
|
toolchain_type
Acessar a origem da regratoolchain_type(name, compatible_with, deprecation, features, restricted_to, tags, target_compatible_with, testonly, visibility)
Essa regra define um novo tipo de toolchain, um destino simples que representa uma classe de ferramentas que desempenham a mesma função para plataformas diferentes.
Consulte a página Toolchains para mais detalhes.
Exemplo
Isso define um tipo de conjunto de ferramentas para uma regra personalizada.
toolchain_type( name = "bar_toolchain_type", )
Isso pode ser usado em um arquivo 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 |
Nome: obrigatório Um nome exclusivo para essa segmentação. |