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++
Use as funções auxiliares disponíveis em
@rules_cc//cc:find_cc_toolchain.bzl
para depender de uma cadeia de ferramentas 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
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 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:
features
eaction_configs
: vêm doCcToolchainConfigInfo
e são encapsulados emCcToolchainInfo
.FeatureConfiguration
: retornado por cc_common.configure_features.- Variáveis de configuração do conjunto de ferramentas cc - retornadas por cc_common.create_compile_variables ou cc_common.create_link_variables.
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 de regras do C++ e/ou que regras do C++ podem depender de
A maioria das regras em 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ó precisa propagar
CcInfo
pelo gráfico para a regra binária que a usa, envolva
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.