Integración con reglas de C++

Informar un problema Ver código fuente Nightly · 8.0 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

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