En esta página, se describe cómo realizar integraciones con reglas de C++ en varios niveles.
Cómo acceder a la cadena de herramientas de C++
Debido a
migración continua de reglas de C++
a las plataformas y
cadenas de herramientas,
debes usar la función auxiliar disponible en
@bazel_tools//tools/cpp:toolchain_utils.bzl,
que funciona cuando las cadenas de herramientas están inhabilitadas y habilitadas. Depender de una instancia de C++
en tu regla, agrega una
Label
atributo llamado _cc_toolchain
y señalarlo
a @bazel_tools//tools/cpp:current_cc_toolchain
(una instancia de
cc_toolchain_alias
, que apunta a la cadena de herramientas de C++ seleccionada actualmente).
Luego, en la implementación de reglas, usa
find_cpp_toolchain(ctx)
para obtener la
CcToolchainInfo
Puedes encontrar un ejemplo funcional completo
en los ejemplos de rules_cc.
Generar líneas de comandos y variables de entorno con la cadena de herramientas de C++
Por lo general, la integración con la cadena de herramientas de C++ para tener la misma como las reglas de C++, pero sin usar directamente las acciones de C++. Esto se debe a que, al escribir nuestras propias acciones, deben comportarse de forma coherente con la cadena de herramientas de C++; por ejemplo, pasar la línea de comandos de C++ indicadores a una herramienta que invoca el compilador C++ en segundo plano.
Las reglas C++ usan una forma especial de construir líneas de comandos basadas en feature actual. Para construir una línea de comandos, necesitas lo siguiente:
features
yaction_configs
provienen deCcToolchainConfigInfo
. y se encapsula enCcToolchainInfo
FeatureConfiguration
: lo devuelve cc_common.configure_features.- CC de variables de configuración de la cadena de herramientas: mostradas por cc_common.create_compile_variables o cc_common.create_link_variables.
Aún hay métodos get específicos de la herramienta, como
compiler_executable.
Prefiere get_tool_for_action
en lugar de estos, ya que los métodos get específicos de la herramienta lo harán
en el futuro.
Puedes encontrar un ejemplo funcional completo en los ejemplos de rules_cc.
Cómo implementar reglas de Starlark que dependan de reglas C++ o de las que puedan depender las reglas C++
La mayoría de las reglas C++ proporcionan
CcInfo
,
un proveedor que contiene CompilationContext
y
LinkingContext
A través de ellas, es posible acceder a información como todos los encabezados transitivos
o bibliotecas para vincular. Desde CcInfo
y desde CcToolchainInfo
personalizados
Las reglas de Starlark deberían poder obtener toda la información que necesitan.
Si una regla de Starlark personalizada proporciona CcInfo
, es una señal para las reglas de C++ que
también pueden confiar en él. Sin embargo, ten cuidado: si solo necesitas propagar
CcInfo
a través del gráfico hasta la regla binaria que luego lo usa; une
CcInfo
en otro proveedor. Por ejemplo, si la regla java_library
quisiera
para propagar dependencias nativas hasta java_binary
, no debería proporcionar
CcInfo
directamente (cc_binary
según java_library
no tiene sentido)
debe encapsularla, por ejemplo, JavaCcInfo
.
Puedes encontrar un ejemplo funcional completo en los ejemplos de rules_cc.
Reutiliza la lógica y las acciones de las reglas de C++
Aún no es estable; Esta sección se actualizará cuando la API se estabilice. Seguir #4570 para actualizar información.