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 tanto cuando las cadenas de herramientas están inhabilitadas como cuando están habilitadas. Para depender de una cadena de herramientas de C++ en tu regla, agrega un atributo Label llamado _cc_toolchain y dirígelo 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 y funcional 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, las integrarías en la cadena de herramientas de C++ para tener las mismas funciones experimentales 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, deben comportarse de manera coherente con la cadena de herramientas de C++; por ejemplo, pasar funciones experimentales 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 crear líneas de comandos basadas en la configuración de funciones. Para crear una línea de comandos, necesitas lo siguiente:
- featuresy- action_configs: Provienen de- CcToolchainConfigInfoy se encapsulan en- CcToolchainInfo.
- FeatureConfiguration: Es el valor que devuelve cc_common.configure_features.
- Variables de configuración de la cadena de herramientas de cc, que devuelve cc_common.create_compile_variables o cc_common.create_link_variables.
Aún existen métodos get específicos de la herramienta, como compiler_executable.
Son preferibles los métodos get_tool_for_action en lugar de estos, ya que los métodos get 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 en las que pueden confiar las reglas de C++
La mayoría de las reglas de C++ proporcionan CcInfo, un proveedor que contiene CompilationContext y LinkingContext.
A través de estos dos valores, es posible acceder a información como todos los encabezados transitivos o las bibliotecas para vincular. Desde CcInfo y desde CcToolchainInfo, las reglas personalizadas de Starlark deberían poder obtener toda la información necesaria.
Si una regla personalizada de Starlark proporciona CcInfo, es un indicador 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 hasta la regla binaria que luego usa este valor, incluye 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 que depende de java_library no tiene sentido), sino que debería incluir este valor, por ejemplo, en JavaCcInfo.
Puedes encontrar un ejemplo completo y funcional en los ejemplos de rules_cc.
Cómo reutilizar la lógica y las acciones de las reglas de C++
La API aún no es estable; esta sección se actualizará cuando sea estable. Sigue #4570 para obtener información actualizada.