Integración con reglas de C++

Informar un problema Ver código fuente Nightly 8.1 · 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++

Debes usar las funciones de ayuda disponibles en @rules_cc//cc:find_cc_toolchain.bzl para depender de una cadena de herramientas de CC desde una regla de Starlark.

Para depender de una cadena de herramientas de C++ en tu regla, configura el parámetro toolchains como use_cc_toolchain(). Luego, en la implementación de la regla, usa find_cpp_toolchain(ctx) para obtener CcToolchainInfo. Puedes encontrar un ejemplo completo que funcione 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 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 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 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.