Integración con reglas de C++

Informar un problema Ver código fuente Nightly · 8.0 · 7.5 · 7.4 · 7.3 · 7.2

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 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 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 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:

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 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 de 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 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.