Como integrar com regras C++

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:

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.