Como integrar com regras C++

Reportar um problema Ver a fonte Nightly · 8.4 · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

Nesta página, descrevemos como fazer a integração com regras de C++ em vários níveis.

Acessar a cadeia de ferramentas C++

Use as funções auxiliares disponíveis em @rules_cc//cc:find_cc_toolchain.bzl para depender de uma cadeia de ferramentas de CC de uma regra do Starlark.

Para depender de uma cadeia de ferramentas C++ na sua regra, defina o parâmetro toolchains como use_cc_toolchain(). Em seguida, na implementação da regra, use find_cpp_toolchain(ctx) para receber o CcToolchainInfo. Um exemplo completo de funcionamento pode ser encontrado nos exemplos do 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:

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.