Esta página descreve como fazer a integração com as regras C++ em vários níveis.
Como acessar o conjunto de ferramentas C++
Devido à migração contínua de regras C++ para plataformas e conjuntos de ferramentas, use a função auxiliar disponível em @bazel_tools//tools/cpp:toolchain_utils.bzl (link 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 C++ selecionado.
Em seguida, na implementação da regra, use
find_cpp_toolchain(ctx)
para acessar
CcToolchainInfo.
Um exemplo completo de trabalho pode ser encontrado nos exemplos de rules_cc.
Gerar linhas de comando e variáveis de ambiente usando o conjunto de ferramentas C++
Normalmente, você se integra ao conjunto de ferramentas do C++ para ter as mesmas flags de linha de comando que as regras C++, mas sem usar as ações C++ diretamente. Isso ocorre porque, ao gravar nossas próprias ações, elas precisam se comportar de maneira consistente com o conjunto de ferramentas do C++, por exemplo, transmitindo sinalizações de linha de comando C++ para uma ferramenta que invoca o compilador C++ em segundo plano.
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:
featureseaction_configs: vêm doCcToolchainConfigInfoe são encapsulados emCcToolchainInfo.FeatureConfiguration: retornado por cc_common.configure_features.- cc variáveis de configuração do conjunto de ferramentas: retornadas por cc_common.create_compile_variables ou cc_common.create_link_variables.
Ainda há getters específicos da ferramenta, como
compiler_executable.
Dê preferência a get_tool_for_action em vez deles, já que getters específicos da ferramenta
serão removidos em algum momento.
Um exemplo completo de trabalho pode ser encontrado nos exemplos de rules_cc.
Como implementar regras do Starlark que dependem das regras do C++ e/ou das quais as regras C++ podem depender
A maioria das regras C++ fornece
CcInfo,
um provedor que contém CompilationContext
e
LinkingContext.
Por meio deles, é possível acessar informações como todos os cabeçalhos ou bibliotecas transitivos a serem vinculados. De CcInfo e das regras CcToolchainInfo personalizadas
do Starlark, elas podem receber todas as informações necessárias.
Se uma regra personalizada do Starlark fornecer CcInfo, 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, envolva
CcInfo em um provedor diferente. Por exemplo, se a regra java_library quiser
propagar dependências nativas até o java_binary, ela não vai fornecer
CcInfo diretamente (cc_binary, dependendo de java_library não faz sentido),
ela vai precisar envolvê-la, por exemplo, JavaCcInfo.
Um exemplo completo de trabalho pode ser encontrado nos exemplos de rules_cc.
Como reutilizar lógica e ações de regras C++
Ainda não está estável. Esta seção será atualizada quando a API se estabilizar. Consulte 4570 para ver informações atualizadas.