Nesta página, descrevemos como fazer a integração com regras de C++ em vários níveis.
Acessar a cadeia de ferramentas C++
Devido à migração contínua de regras de C++ para plataformas e conjuntos de ferramentas, use a função auxiliar disponível em @bazel_tools//tools/cpp:toolchain_utils.bzl, que funciona com conjuntos de ferramentas ativados e desativados. Para depender de uma cadeia de ferramentas
C++ na sua regra, adicione um
atributo Label
chamado _cc_toolchain
e direcione-o
para @bazel_tools//tools/cpp:current_cc_toolchain
(uma instância da
regra cc_toolchain_alias
, que aponta para a cadeia de ferramentas C++ selecionada no momento).
Em seguida, na implementação da regra, use
find_cpp_toolchain(ctx)
para receber o
CcToolchainInfo
.
Um exemplo completo pode ser encontrado nos exemplos de rules_cc.
Gerar linhas de comando e variáveis de ambiente usando a cadeia de ferramentas do C++
Normalmente, você se integraria à cadeia de ferramentas C++ para ter as mesmas flags de linha de comando que as regras de C++, mas sem usar ações de C++ diretamente. Isso porque, ao escrever nossas próprias ações, elas precisam se comportar de maneira consistente com a cadeia de ferramentas C++. Por exemplo, transmitindo flags de linha de comando C++ para uma ferramenta que invoca o compilador C++ nos bastidores.
As regras de C++ usam uma maneira especial de construir 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
, já que os getters específicos da ferramenta serão
removidos eventualmente.
Um exemplo completo pode ser encontrado nos exemplos de rules_cc.
Implementar regras do Starlark que dependem de regras do C++ e/ou que as regras do C++ podem depender
A maioria das regras de C++ fornece
CcInfo
,
um provedor que contém CompilationContext
e
LinkingContext
.
Com eles, é possível acessar informações como todos os cabeçalhos transitivos ou bibliotecas a serem vinculadas. De CcInfo
e das regras personalizadas do CcToolchainInfo
Starlark, é possível extrair todas as informações necessárias.
Se uma regra personalizada do Starlark fornecer CcInfo
, isso vai indicar às regras do C++ que elas também podem depender dele. No entanto, tenha cuidado: se você só precisar propagar CcInfo
pelo gráfico até a regra binária que o usa, encapsule CcInfo
em um provedor diferente. Por exemplo, se uma regra java_library
quiser propagar dependências nativas até o java_binary
, ela não poderá fornecer CcInfo
diretamente (cc_binary
dependendo de java_library
não faz sentido). Ela precisa encapsular, por exemplo, em JavaCcInfo
.
Um exemplo completo pode ser encontrado nos exemplos de rules_cc.
Reutilizar a lógica e as ações das regras do C++
Ainda não está estável. Esta seção será atualizada quando a API estiver estável. Siga #4570 para informações atualizadas.