En esta página, se describe cómo realizar la integración con reglas de C++ en varios niveles.
Cómo acceder a la cadena de herramientas de C++
Debido a la
migración continua de las reglas de C++
a las plataformas y
cadenas de herramientas, debes
usar la función de ayuda disponible en
@bazel_tools//tools/cpp:toolchain_utils.bzl,
que funciona tanto cuando las cadenas de herramientas están inhabilitadas como habilitadas. Para depender de una cadena de herramientas de C++ en tu regla, agrega un atributo Label
llamado _cc_toolchain
y diríjalo 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 CcToolchainInfo
.
Puedes encontrar un ejemplo completo y funcional en los ejemplos de rules_cc.
Cómo generar líneas de comandos y variables de entorno con la cadena de herramientas de C++
Por lo general, te integrarías con la cadena de herramientas de C++ para tener las mismas marcas de línea de comandos que las reglas de C++, pero sin usar acciones de C++ directamente. Esto se debe a que, cuando escribimos nuestras propias acciones, estas deben comportarse de manera coherente con la cadena de herramientas de C++, por ejemplo, pasar marcas de línea de comandos de C++ a una herramienta que invoque el compilador de C++ en segundo plano.
Las reglas de C++ usan una forma especial de construir líneas de comandos según la configuración de atributos. Para crear una línea de comandos, necesitas lo siguiente:
features
yaction_configs
: provienen deCcToolchainConfigInfo
y se encapsulan enCcToolchainInfo
.FeatureConfiguration
: Devuelve cc_common.configure_features.- Variables de configuración de la cadena de herramientas de cc que devuelve cc_common.create_compile_variables o cc_common.create_link_variables.
Aún hay getters específicos de la herramienta, como compiler_executable.
Prefiere get_tool_for_action
en lugar de estos, ya que los getters específicos de la herramienta se quitarán con el tiempo.
Puedes encontrar un ejemplo completo y funcional en los ejemplos de rules_cc.
Implementar reglas de Starlark que dependen de reglas de C++ o de las que las reglas de C++ pueden depender
La mayoría de las reglas de C++ proporcionan CcInfo
, un proveedor que contiene CompilationContext
y LinkingContext
.
A través de ellos, es posible acceder a información como todos los encabezados o bibliotecas transitivos para vincular. Desde CcInfo
y desde las reglas personalizadas de Starlark de CcToolchainInfo
, deberían poder obtener toda la información que necesitan.
Si una regla Starlark personalizada proporciona CcInfo
, es un indicador para las reglas de C++ que también pueden depender de ella. Sin embargo, ten cuidado. Si solo necesitas propagar CcInfo
a través del gráfico a la regla binaria que luego la usa, une CcInfo
en un proveedor diferente. Por ejemplo, si la regla java_library
quisiera propagar dependencias nativas hasta java_binary
, no debería proporcionar CcInfo
directamente (cc_binary
no tiene sentido en función de java_library
), sino que debería unirla, por ejemplo, en JavaCcInfo
.
Puedes encontrar un ejemplo completo y funcional en los ejemplos de rules_cc.
Cómo volver a usar la lógica y las acciones de las reglas de C++
Aún no es estable. Esta sección se actualizará una vez que la API se estabilice. Sigue el caso#4570 para obtener información actualizada.