Esta página descreve como fazer a integração com regras C++ em vários níveis.
Como acessar o conjunto de ferramentas do C++
Devido à migração contínua de regras do C++ para plataformas e conjuntos de ferramentas, use a função auxiliar disponível em @bazel_tools//tools/cpp:toolchain_utils.bzl (links em inglês), que funciona quando os conjuntos de ferramentas estão desativados e ativados. Para depender de um conjunto de ferramentas
C++ na sua regra, adicione um atributo
Label
chamado _cc_toolchain
e aponte-o
para @bazel_tools//tools/cpp:current_cc_toolchain
(uma instância da
regra cc_toolchain_alias
, que aponta para o conjunto de ferramentas do C++ selecionado no momento).
Em seguida, na implementação da regra, use
find_cpp_toolchain(ctx)
para acessar a
CcToolchainInfo
.
Um exemplo completo de funcionamento pode ser encontrado nos exemplos de rules_cc.
gerar linhas de comando e variáveis de ambiente usando o conjunto de ferramentas do C++;
Normalmente, você se integraria ao conjunto de ferramentas do C++ para ter as mesmas flags de linha de comando que as regras do C++, mas sem usar ações do C++ diretamente. Isso ocorre porque, ao programar nossas próprias ações, elas precisam se comportar de maneira consistente com o conjunto de ferramentas do C++. Por exemplo, transmitir sinalizações de linha de comando C++ para uma ferramenta que invoca o compilador C++ nos bastidores.
As regras do C++ usam uma maneira especial de criar linhas de comando com base na configuração de recursos. Para criar uma linha de comando, você precisa do seguinte:
features
eaction_configs
: vêm doCcToolchainConfigInfo
e são encapsulados emCcToolchainInfo
.FeatureConfiguration
: retornado por cc_common.configure_features.- Variáveis de configuração do conjunto de ferramentas cc: retornadas por cc_common.create_compile_variables ou cc_common.create_link_variables.
Ainda há getters específicos da ferramenta, como
compiler_executable.
Prefira get_tool_for_action
em vez desses, já que getters específicos da ferramenta serão removidos no futuro.
Um exemplo completo de funcionamento pode ser encontrado nos exemplos de rules_cc.
Implementar regras do Starlark que dependem das regras do C++ e/ou das quais as regras do C++ podem depender
A maioria das regras de C++ fornece
CcInfo
,
um provedor que contém CompilationContext
e
LinkingContext
.
Com elas, é possível acessar informações como todos os cabeçalhos transitivos
ou bibliotecas a serem vinculadas. De CcInfo
e das regras do Starlark
personalizadas por CcToolchainInfo
, elas poderão receber todas as informações necessárias.
Se uma regra Starlark personalizada fornecer CcInfo
, isso será um sinal para as regras C++ de que
elas também podem depender dele. No entanto, tenha cuidado: se você só precisar propagar
CcInfo
pelo gráfico para a regra binária que o usa, una
CcInfo
em um provedor diferente. Por exemplo, se a regra java_library
quiser
propagar dependências nativas até o java_binary
, ela não precisa fornecer
CcInfo
diretamente (cc_binary
dependendo de java_library
não faz sentido),
ela precisa envolver as dependências, por exemplo, JavaCcInfo
.
Um exemplo completo de funcionamento pode ser encontrado nos exemplos de rules_cc.
Reutilizar lógica e ações de regras C++
Ainda não está estável. Esta seção vai ser atualizada assim que a API estiver estabilizada. Consulte a seção No 4570 para ver informações atualizadas.