Esta página descreve como fazer a integração com regras de C++ em vários níveis.
Como acessar o conjunto de ferramentas de 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 um conjunto de ferramentas de 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 trabalho
pode ser encontrado nos exemplos rules_cc.
Como gerar linhas de comando e variáveis de ambiente usando a cadeia de ferramentas de C++
Normalmente, você faria a integração com o conjunto de ferramentas de C++ para ter as mesmas flags de linha de comando que as regras de C++, mas sem usar ações de C++ diretamente. Isso ocorre porque, ao escrever nossas próprias ações, elas precisam se comportar de maneira consistente com o conjunto de ferramentas de C++. Por exemplo, transmitindo flags de linha de comando de C++ para uma ferramenta que invoca o compilador de C++ em segundo plano.
As regras de C++ usam uma maneira especial de construir linhas de comando com base na configuração de recursos. Para construir uma linha de comando, você precisa do seguinte:
featureseaction_configs- vêm doCcToolchainConfigInfoe são encapsulados emCcToolchainInfoFeatureConfiguration- retornado por cc_common.configure_features- Variáveis de configuração do conjunto de ferramentas de CC: retornadas por cc_common.create_compile_variables ou cc_common.create_link_variables.
Ainda há getters específicos da ferramenta, como
compiler_executable.
Prefira get_tool_for_action a eles, já que os getters específicos da ferramenta serão removidos.
Um exemplo completo de trabalho pode ser encontrado nos exemplos rules_cc.
Como implementar regras do Starlark que dependem de regras de C++ e/ou que regras de 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 Starlark CcToolchainInfo, é possível receber todas as informações necessárias.
Se uma regra personalizada do Starlark fornecer CcInfo, isso será um sinal para as regras de 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 a usa, encapsule CcInfo em um provedor diferente. Por exemplo, se a regra java_library quisesse
propagardependências nativas até o java_binary, ela não deveria fornecer
CcInfo diretamente (depender de cc_binary em java_library não faz sentido).
Ela deveria encapsulá-la em, por exemplo, JavaCcInfo.
Um exemplo completo de trabalho pode ser encontrado nos exemplos rules_cc.
Como reutilizar a lógica e as ações das regras de C++
Ainda não está estável. Esta seção será atualizada quando a API for estabilizada. Siga o#4570 para informações atualizadas.