Integra en C++ Rules

Informa un problema Ver código fuente

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:

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.