En esta página, se describe cómo realizar la integración con reglas C++ en varios niveles.
Accede a la cadena de herramientas de C++
Debido a la
migración continua de reglas de C++
a las plataformas y a las
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. Para depender de una cadena de herramientas C++ en la regla, agrega un atributo Label
llamado _cc_toolchain
y apúntalo a @bazel_tools//tools/cpp:current_cc_toolchain
(una instancia de la regla cc_toolchain_alias
, que apunta a la cadena de herramientas de C++ seleccionada actualmente).
Luego, en la implementación de la regla, usa find_cpp_toolchain(ctx)
para obtener el CcToolchainInfo
.
Puedes encontrar un ejemplo funcional completo en los ejemplos de rules_cc.
Genera 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++ tendrá las mismas marcas de línea de comandos que las reglas de C++, pero sin usar directamente las acciones de C++. Esto se debe a que cuando escribes nuestras propias acciones, deben comportarse de manera coherente con la cadena de herramientas de C++; por ejemplo, pasar marcas de línea de comandos C++ a una herramienta que invoca el compilador C++ en segundo plano.
Las reglas de C++ usan una forma especial de construir líneas de comandos según la configuración de funciones. Para construir una línea de comandos, necesitas lo siguiente:
features
yaction_configs
: estos provienen deCcToolchainConfigInfo
y se encapsulan enCcToolchainInfo
.FeatureConfiguration
: lo muestra cc_common.configure_features- Variables de configuración de la cadena de herramientas de cc: se muestran como cc_common.create_compile_variables o cc_common.create_link_variables.
Aún hay métodos get específicos de las herramientas, como compiler_executable.
Usa get_tool_for_action
en lugar de estos, ya que, con el tiempo, se quitarán los métodos get específicos de la herramienta.
Puedes encontrar un ejemplo funcional completo en los ejemplos de rules_cc.
Implementación de reglas de Starlark que dependen de reglas C++ o de las cuales C++ puede depender
La mayoría de las reglas de C++ proporcionan CcInfo
, un proveedor que contiene CompilationContext
y LinkingContext
.
A través de estos, es posible acceder a información como todos los encabezados o bibliotecas transitivas para vincular. Desde CcInfo
y desde las reglas personalizadas de Starlark de CcToolchainInfo
, debe poder obtener toda la información que necesita.
Si una regla personalizada de Starlark proporciona CcInfo
, es una señal de que las reglas de C++ también dependen de ella. Sin embargo, ten cuidado: si solo necesitas propagar CcInfo
a través del grafo a la regla binaria que luego la usa, une CcInfo
en un proveedor diferente. Por ejemplo, si la regla java_library
deseaba propagar dependencias nativas hasta el java_binary
, no debería proporcionar CcInfo
directamente (cc_binary
según java_library
no tiene sentido), debería unirlo, por ejemplo, JavaCcInfo
.
Puedes encontrar un ejemplo funcional completo en los ejemplos de rules_cc.
Vuelve a usar 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. Sigue #4570 para obtener la información actualizada.