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 em andamento 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 quando os conjuntos de ferramentas estão desativados e ativados. Para depender de um conjunto de ferramentas C++ na regra, adicione um atributo Label
chamado _cc_toolchain
e aponte-o para @bazel_tools//tools/cpp:current_cc_toolchain
(uma instância de regra cc_toolchain_alias
, que aponta para o conjunto de ferramentas C++ selecionado).
Em seguida, na implementação da regra, use
find_cpp_toolchain(ctx)
para acessar
CcToolchainInfo
.
Veja um exemplo prático e completo
nos exemplos de Rules_cc.
Como gerar linhas de comando e variáveis de ambiente usando o conjunto de ferramentas do C++
Normalmente, a integração com o conjunto de ferramentas C++ teria as mesmas sinalizações de linha de comando que as regras C++, mas sem usar as ações do C++ diretamente. Isso ocorre porque, ao escrever nossas próprias ações, elas precisam se comportar de maneira consistente com o conjunto de ferramentas C++. Por exemplo, transmitir sinalizações de linha de comando C++ para uma ferramenta que invoca o compilador C++ em segundo plano.
As regras C++ usam uma maneira especial de construir linhas de comando com base na configuração do recurso. Para criar uma linha de comando, você precisa do seguinte:
features
eaction_configs
: vêm daCcToolchainConfigInfo
e 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_execble.
Prefira get_tool_for_action
a essas opções, porque getters específicos de ferramentas serão
removidos em algum momento.
Veja um exemplo prático e completo nos exemplos de Rules_cc.
Implementar regras Starlark que dependem de regras C++ e/ou que podem exigir
A maioria das regras de C++ fornece
CcInfo
,
um provedor contendo CompilationContext
e
LinkingContext
.
Através deles, é possível acessar informações, como todos os cabeçalhos ou bibliotecas
transicionais, para a vinculação. A partir da CcInfo
e da CcToolchainInfo
personalizada, as regras do Starlark precisam conseguir todas as informações necessárias.
Se uma regra personalizada do Starlark fornecer CcInfo
, isso indica que as regras C++ também podem depender dela. No entanto, tenha cuidado. Se você só precisar propagar
CcInfo
pelo gráfico para a regra binária que o usa, envolva
CcInfo
em um provedor diferente. Por exemplo, se a regra java_library
quisesse propagar as dependências nativas até o java_binary
, ela não forneceria CcInfo
diretamente (cc_binary
dependendo do java_library
não faz sentido), mas sim em JavaCcInfo
.
Veja um exemplo prático e completo nos exemplos de Rules_cc.
Como reutilizar lógica e ações de regras em C++
Ainda não está estável. Esta seção será atualizada quando a API se estabilizar. Siga #4570 para ver informações atualizadas.