Como integrar com regras C++

Informar um problema Ver código-fonte Nightly · 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

Esta página descreve como fazer a integração com as regras do C++ em vários níveis.

Como acessar a cadeia de ferramentas do C++

Devido à migração contínua das 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 uma cadeia de ferramentas C++ na regra, adicione um atributo Label chamado _cc_toolchain e o direcione 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.

Geração de linhas de comando e variáveis de ambiente usando a cadeia de ferramentas C++

Normalmente, você precisa integrar com a cadeia de ferramentas C++ para ter as mesmas flags de linha de comando que as regras C++ têm, mas sem usar ações C++ diretamente. Isso ocorre 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 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 de ferramentas, como compiler_executable. Prefira get_tool_for_action em vez desses, porque os getters específicos da ferramenta serão removidos.

Um exemplo completo 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. Por meio deles, é possível acessar informações como todos os cabeçalhos transitivos ou bibliotecas para vincular. Com CcInfo e as regras personalizadas do CcToolchainInfo, as regras do Starlark podem acessar todas as informações necessárias.

Se uma regra personalizada do Starlark fornecer CcInfo, será um indicador para as regras C++ de que elas 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, una CcInfo em um provedor diferente. Por exemplo, se a regra java_library quisesse propagar dependências nativas até o java_binary, ela não deveria fornecer CcInfo diretamente (cc_binary dependendo de java_library não faz sentido), ela precisa ser agrupada em, por exemplo, JavaCcInfo.

Um exemplo completo pode ser encontrado nos exemplos de rules_cc.

Reutilizar a lógica e as ações das regras em C++

Ainda não está estável. Esta seção será atualizada quando a API se estabilizar. Siga #4570 para receber informações atualizadas.