Integración con reglas de C++

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 en curso de las reglas de C++ a 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. Para depender de una cadena de herramientas de C++ en tu 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 reglas, usa find_cpp_toolchain(ctx) para obtener CcToolchainInfo. Puedes encontrar un ejemplo de funcionamiento completo 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, integrarías la cadena de herramientas de C++ para tener las mismas marcas de línea de comandos que las reglas de C++, pero sin usar las acciones de C++ directamente. Esto se debe a que, cuando se escriben nuestras propias acciones, estas deben comportarse de manera coherente con la cadena de herramientas de C++; por ejemplo, al pasar marcas de la 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 crear líneas de comandos basadas en la configuración de funciones. Para crear una línea de comandos, necesitas lo siguiente:

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, en algún momento, se quitarán los métodos get específicos de la herramienta.

Puedes encontrar un ejemplo de funcionamiento completo en los ejemplos de rules_cc.

Implementación de reglas de Starlark que dependen de reglas de C++ o de las que pueden depender las reglas de C++

La mayoría de las reglas de C++ proporcionan CcInfo, un proveedor que contiene CompilationContext y LinkingContext. De esta manera, es posible acceder a información como todos los encabezados transitivos o las bibliotecas que se vincularán. Desde CcInfo y desde las reglas personalizadas de Starlark, CcToolchainInfo 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++ de 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 con 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, según java_library, no tiene sentido), debería unirla, por ejemplo, JavaCcInfo.

Puedes encontrar un ejemplo de funcionamiento completo en los ejemplos de rules_cc.

Reutilización de 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 el código #4570 para obtener información actualizada.