C++ y Bazel

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

Esta página contiene recursos que te ayudan a usar Bazel con proyectos de C++. En él, se vincula a un instructivo, reglas de compilación y otra información específica para compilar proyectos de C++ con Bazel.

Cómo trabajar con Bazel

Los siguientes recursos te ayudarán a trabajar con Bazel en proyectos de C++:

Prácticas recomendadas

Además de las prácticas recomendadas generales de Bazel, a continuación, se incluyen las prácticas recomendadas específicas de los proyectos de C++.

Archivos BUILD

Sigue los lineamientos que se indican a continuación cuando crees tus archivos BUILD:

  • Cada archivo BUILD debe contener un objetivo de regla cc_library por unidad de compilación en el directorio.

  • Debes desglosar tus bibliotecas de C++ tanto como sea posible para maximizar la incrementalidad y paralelizar la compilación.

  • Si hay un solo archivo de origen en srcs, asigna el mismo nombre a la biblioteca que al archivo C++. Esta biblioteca debe contener archivos C++, cualquier archivo de encabezado que coincida y las dependencias directas de la biblioteca. Por ejemplo:

    cc_library(
        name = "mylib",
        srcs = ["mylib.cc"],
        hdrs = ["mylib.h"],
        deps = [":lower-level-lib"]
    )
    
  • Usa un objetivo de regla cc_test por objetivo cc_library en el archivo. Asigna el nombre [library-name]_test al objetivo y [library-name]_test.cc al archivo fuente. Por ejemplo, un destino de prueba para el destino de la biblioteca mylib que se muestra arriba se vería de la siguiente manera:

    cc_test(
        name = "mylib_test",
        srcs = ["mylib_test.cc"],
        deps = [":mylib"]
    )
    

Incluir rutas

Sigue estos lineamientos para las instrucciones include:

  • Haz que todas las rutas de acceso de inclusión sean relativas al directorio del lugar de trabajo.

  • Usa comillas para incluir (#include "foo/bar/baz.h") en los encabezados que no son del sistema, no en los corchetes (#include <foo/bar/baz.h>).

  • Evita usar atajos de directorios de UNIX, como . (directorio actual) o .. (directorio superior).

  • Para el código heredado o third_party que requiere que se apunte fuera del repositorio del proyecto, como el repositorio externo que incluye un prefijo, usa los argumentos include_prefix y strip_include_prefix en el destino de la regla cc_library.

Funciones de la cadena de herramientas

Las siguientes funciones opcionales pueden mejorar la limpieza de un proyecto de C++. Se pueden habilitar con la marca de línea de comandos --features o el atributo features de las reglas repo, package o cc_*:

  • La función parse_headers hace que el compilador C++ se use para analizar (pero no compilar) todos los archivos de encabezado en los destinos compilados y sus dependencias cuando se usa la marca --process_headers_in_dependencies. Esto puede ayudar a detectar problemas en bibliotecas de solo encabezados y garantizar que los encabezados sean independientes y no dependan del orden en el que se incluyen.
  • La función layering_check aplica la regla de que los destinos solo incluyan encabezados proporcionados por sus dependencias directas. La cadena de herramientas predeterminada admite esta función en Linux con clang como compilador.