Reglas C y C++

Reglas

cc_binary

cc_binary(name, deps, srcs, data, additional_linker_inputs, args, compatible_with, copts, defines, deprecation, distribs, env, exec_compatible_with, exec_properties, features, includes, licenses, linkopts, linkshared, linkstatic, local_defines, malloc, nocopts, output_licenses, restricted_to, stamp, tags, target_compatible_with, testonly, toolchains, visibility, win_def_file)

Objetivos de salida implícitos

  • name.stripped (solo se compila si se solicita de manera explícita): Es una versión reducida del objeto binario. strip -g se ejecuta en el objeto binario para quitar los símbolos de depuración. Se pueden proporcionar opciones de eliminación adicionales en la línea de comandos mediante --stripopt=-foo. Este resultado solo se compila si se solicita de manera explícita.
  • name.dwp (solo se compila si se solicita explícitamente): Si está habilitada la Fission, se trata de un archivo de paquete de información de depuración adecuado para depurar los objetos binarios implementados de forma remota. De lo contrario, un archivo vacío

Argumentos

Atributos
name

Name; required

Un nombre único para este destino.

deps

List of labels; optional

Es la lista de otras bibliotecas que se vincularán al destino binario.

Estos pueden ser objetivos cc_library o objc_library.

srcs

List of labels; optional

La lista de archivos C y C++ que se procesan para crear el destino. Estos son archivos fuente y de encabezado C/C++, ya sean no generados (código fuente normal) o generados.

Se compilarán todos los archivos .cc, .c y .cpp. Estos pueden ser archivos generados: si un archivo con nombre está en el outs de alguna otra regla, esta dependerá de forma automática de esa otra regla.

No se compilará un archivo .h, pero estará disponible para que las fuentes lo incluyan en esta regla. Los archivos .cc y .h pueden incluir directamente encabezados enumerados en estas srcs o en hdrs de cualquier regla enumerada en el argumento deps.

Todos los archivos #included deben mencionarse en el atributo srcs de esta regla o en el atributo hdrs de los cc_library() a los que se hace referencia. El estilo recomendado es que los encabezados asociados con una biblioteca se incluyan en el atributo hdrs de esa biblioteca y que los encabezados restantes asociados con las fuentes de esta regla se enumeren en srcs. Consulta "Comprobación de inclusión de encabezado" para obtener una descripción más detallada.

Si el nombre de una regla está en srcs, esta regla dependerá automáticamente de esa regla. Si los outs de la regla con nombre son archivos de origen C o C++, se compilan en esta regla. Si son archivos de biblioteca, están vinculados.

Tipos de archivo srcs permitidos:

  • Archivos de origen C y C++: .c, .cc, .cpp, .cxx, .c++, .C
  • Archivos de encabezado C y C++: .h, .hh, .hpp, .hxx, .inc, .inl y .H
  • Ensamblador con preprocesador de C: .S
  • Archivo: .a, .pic.a
  • Biblioteca "Vincular siempre": .lo, .pic.lo
  • Biblioteca compartida, con versiones o sin versiones: .so, .so.version
  • Archivo de objeto: .o, .pic.o

...y las reglas que producen esos archivos. Diferentes extensiones denotan distintos lenguajes de programación de acuerdo con la convención de GCC.

additional_linker_inputs

List of labels; optional

Pasa estos archivos al comando del vinculador de C++.

Por ejemplo, se pueden proporcionar archivos .res de Windows compilados aquí para incorporarlos en el destino binario.

copts

List of strings; optional

Agrega estas opciones al comando de compilación de C++. Sujeto a la sustitución "Make variable" y la tokenización de shell Bourne.

Cada cadena de este atributo se agrega en el orden dado a COPTS antes de compilar el objetivo binario. Las marcas solo se aplican para compilar este destino, no sus dependencias, por lo que debes tener cuidado con los archivos de encabezado incluidos en otros lugares. Todas las rutas de acceso deben estar relacionadas con el lugar de trabajo, no con el paquete actual.

Si el paquete declara que feature no_copts_tokenization, la asignación de token de la shell Bourne solo se aplica a las strings que constan de una sola variable "Make".

defines

List of strings; optional

Lista de definiciones para agregar a la línea de compilación. Sujeto a la sustitución de la variable"Make" y la tokenización de la shell Bourne. Cada string, que debe constar de un solo token de shell Bourne, se antepone -D y se agrega a la línea de comandos de compilación de este destino y a cada regla que dependa de él. Ten mucho cuidado, ya que esto puede tener efectos de gran alcance. Si tienes dudas, agrega valores definidos a local_defines.
includes

List of strings; optional

Es la lista de dirs de inclusión que se agregarán a la línea de compilación.

Sujeto a la sustitución "Make variable". Cada cadena está precedida por -isystem y se agrega a COPTS. A diferencia de COPTS, estas marcas se agregan para esta regla y para cada regla que depende de ella. (Nota: No son las reglas de las que depende). Ten mucho cuidado, ya que esto puede tener efectos de gran alcance. Si tienes dudas, agrega las marcas "-I" a COPTS.

Los encabezados deben agregarse a srcs o hdrs; de lo contrario, no estarán disponibles para las reglas dependientes cuando la compilación esté en zona de pruebas (configuración predeterminada).

linkopts

List of strings; optional

Agrega estas marcas al comando del vinculador de C++. Sujeto a la sustitución de la variable"Make", la tokenización de shell Bourne y la expansión de etiquetas. Cada string de este atributo se agrega a LINKOPTS antes de vincular el destino binario.

Se supone que cada elemento de esta lista que no comienza con $ o - es la etiqueta de destino en deps. La lista de archivos que genera ese destino se agrega a las opciones del vinculador. Se informa un error si la etiqueta no es válida o no se declara en deps.

linkshared

Boolean; optional; nonconfigurable; default is False

Crear una biblioteca compartida Para habilitar este atributo, incluye linkshared=True en tu regla. De forma predeterminada, esta opción está desactivada.

La presencia de esta marca significa que la vinculación se produce con la marca -shared a gcc, y la biblioteca compartida resultante es adecuada para cargar en, por ejemplo, un programa Java. Sin embargo, para fines de compilación, nunca se vinculará al objeto binario dependiente, ya que se supone que otros programas solo cargan las bibliotecas compartidas compiladas con una regla cc_binary de forma manual, por lo que no debe considerarse un sustituto de la regla cc_library. Para fines de escalabilidad, te recomendamos que evites este enfoque por completo y simplemente permitas que java_library dependa de las reglas cc_library.

Si especificas tanto linkopts=['-static'] como linkshared=True, obtendrás una sola unidad completamente independiente. Si especificas linkstatic=True y linkshared=True, obtendrás una sola unidad, mayormente independiente.

linkstatic

Boolean; optional; default is True

Para cc_binary y cc_test: vincula el objeto binario en modo estático. Para cc_library.linkstatic: consulta a continuación.

De forma predeterminada, esta opción está activada para cc_binary y desactivada para el resto.

Si se habilita y es un objeto binario o de prueba, esta opción le indica a la herramienta de compilación que se vincule con las bibliotecas de usuario de .a en lugar de .so para las bibliotecas de usuario siempre que sea posible. Es posible que algunas bibliotecas del sistema sigan vinculadas de forma dinámica, al igual que aquellas para las que no hay una biblioteca estática. Por lo tanto, el ejecutable resultante seguirá vinculado de forma dinámica, por lo que es casi estático.

Existen tres formas diferentes de vincular un archivo ejecutable:

  • ESTÁTICO con la función full_static_link, en la que todo está vinculado de forma estática (p.ej., "gcc -static foo.o libbar.a libbaz.a -lm").
    Para habilitar este modo, se especifica fully_static_link en el atributo features.
  • ESTÁTICA, en el que todas las bibliotecas de usuario están vinculadas de forma estática (si hay una versión estática disponible), pero las bibliotecas del sistema (excepto las bibliotecas de tiempo de ejecución C/C++) se vinculan de forma dinámica, p.ej., "gcc foo.o libfoo.a libbaz.a -lm".
    Este modo se habilita especificando linkstatic=True.
  • DYNAMIC, en el que todas las bibliotecas se vinculan de forma dinámica (si hay una versión dinámica disponible), p.ej., "gcc foo.o libfoo.so libbaz.so -lm".
    Este modo se habilita especificando linkstatic=False.

El atributo linkstatic tiene un significado diferente si se usa en una regla cc_library(). En el caso de una biblioteca de C++, linkstatic=True indica que solo se permite la vinculación estática, por lo que no se producirá ninguna .so. linkstatic=False no impide que se creen bibliotecas estáticas. El atributo está diseñado para controlar la creación de bibliotecas dinámicas.

Si es linkstatic=False, la herramienta de compilación creará symlinks a las bibliotecas compartidas dependientes en el área *.runfiles.

local_defines

List of strings; optional

Lista de definiciones para agregar a la línea de compilación. Sujeto a la sustitución de la variable"Make" y la tokenización de la shell Bourne. Cada string, que debe consistir en un único token de shell Bourne, se antepone -D y se agrega a la línea de comandos de compilación para este destino, pero no a sus dependientes.
malloc

Label; optional; default is @bazel_tools//tools/cpp:malloc

Anula la dependencia predeterminada de malloc.

De forma predeterminada, los objetos binarios de C++ están vinculados con //tools/cpp:malloc, que es una biblioteca vacía, por lo que el objeto binario termina usando libc malloc. Esta etiqueta debe hacer referencia a un cc_library. Si la compilación es para una regla que no es de C++, esta opción no tiene efecto. El valor de este atributo se ignora si se especifica linkshared=True.

nocopts

String; optional

Se quitaron las opciones coincidentes del comando de compilación de C++. Sujeto a la sustitución de la variable"Make". El valor de este atributo se interpreta como una expresión regular. Cualquier COPTS preexistente que coincida con esta expresión regular (incluidos los valores especificados de forma explícita en el atributo copts de la regla) se quitará de COPTS para compilar esta regla. Rara vez se necesita este atributo.
stamp

Integer; optional; default is -1

Indica si se debe codificar la información de compilación en el objeto binario. Valores posibles:
  • stamp = 1: Siempre marca la información de compilación en el objeto binario, incluso en compilaciones de --nostamp. Esta configuración debe evitarse, ya que podría finalizar el almacenamiento en caché remoto del objeto binario y todas las acciones descendentes que dependen de él.
  • stamp = 0: Siempre reemplaza la información de compilación por valores constantes. Esto proporciona un buen almacenamiento en caché de resultados de compilación.
  • stamp = -1: La marca --[no]stamp controla la incorporación de la información de compilación.

Los objetos binarios sellados no se vuelven a compilar, a menos que cambien sus dependencias.

win_def_file

Label; optional

El archivo DEF de Windows que se pasará al vinculador.

Este atributo solo debe usarse cuando Windows es la plataforma seleccionada. Se puede usar para exportar símbolos durante la vinculación de una biblioteca compartida.

cc_import

cc_import(name, data, hdrs, alwayslink, compatible_with, deprecation, distribs, features, interface_library, licenses, restricted_to, shared_library, static_library, system_provided, tags, target_compatible_with, testonly, visibility)

Las reglas cc_import permiten a los usuarios importar bibliotecas C/C++ precompiladas.

Estos son los casos de uso típicos:
1. Vinculación de una biblioteca estática

cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  static_library = "libmylib.a",
  # If alwayslink is turned on,
  # libmylib.a will be forcely linked into any binary that depends on it.
  # alwayslink = 1,
)
2. Vincular una biblioteca compartida (Unix)
cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  shared_library = "libmylib.so",
)
3. Vinculación de una biblioteca compartida con la biblioteca de interfaz (Windows)
cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  # mylib.lib is a import library for mylib.dll which will be passed to linker
  interface_library = "mylib.lib",
  # mylib.dll will be available for runtime
  shared_library = "mylib.dll",
)
4. Vinculación de una biblioteca compartida con system_provided=True (Windows)
cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  # mylib.lib is an import library for mylib.dll which will be passed to linker
  interface_library = "mylib.lib",
  # mylib.dll is provided by system environment, for example it can be found in PATH.
  # This indicates that Bazel is not responsible for making mylib.dll available.
  system_provided = 1,
)
5. Vinculación a una biblioteca estática o compartida
En Unix:
cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  static_library = "libmylib.a",
  shared_library = "libmylib.so",
)

# first will link to libmylib.a
cc_binary(
  name = "first",
  srcs = ["first.cc"],
  deps = [":mylib"],
  linkstatic = 1, # default value
)

# second will link to libmylib.so
cc_binary(
  name = "second",
  srcs = ["second.cc"],
  deps = [":mylib"],
  linkstatic = 0,
)
En Windows:
cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  static_library = "libmylib.lib", # A normal static library
  interface_library = "mylib.lib", # An import library for mylib.dll
  shared_library = "mylib.dll",
)

# first will link to libmylib.lib
cc_binary(
  name = "first",
  srcs = ["first.cc"],
  deps = [":mylib"],
  linkstatic = 1, # default value
)

# second will link to mylib.dll through mylib.lib
cc_binary(
  name = "second",
  srcs = ["second.cc"],
  deps = [":mylib"],
  linkstatic = 0,
)

Argumentos

Atributos
name

Name; required

Un nombre único para este destino.

hdrs

List of labels; optional

Es la lista de archivos de encabezado que publica esta biblioteca precompilada para que las fuentes incluyan directamente en reglas dependientes.

Boolean; optional; default is False

Si es 1, cualquier objeto binario que dependa (directa o indirectamente) de esta biblioteca C++ precompilada se vinculará con todos los archivos de objetos archivados en la biblioteca estática, incluso si algunos no contienen símbolos al que hace referencia el objeto binario. Esto resulta útil si tu código no se llama explícitamente mediante código en el objeto binario, p.ej., si se registra para recibir una devolución de llamada proporcionada por algún servicio.

Si Alwayslink no funciona con VS 2017 en Windows, debido a un problema conocido, actualiza VS 2017 a la versión más reciente.

interface_library

Label; optional

Una biblioteca de interfaz única para vincular la biblioteca compartida.

Tipos de archivo permitidos: .ifso, .tbd, .lib, .so o .dylib

shared_library

Label; optional

Una sola biblioteca compartida precompilada. Bazel se asegura de que esté disponible para el objeto binario que depende de él durante el tiempo de ejecución.

Tipos de archivo permitidos: .so, .dll o .dylib

static_library

Label; optional

Una sola biblioteca estática precompilada.

Tipos de archivo permitidos: .a, .pic.a o .lib

system_provided

Boolean; optional; default is False

Si es 1, indica que el sistema proporciona la biblioteca compartida requerida en el tiempo de ejecución. En este caso, se debe especificar interface_library y shared_library debe estar vacío.

cc_library

cc_library(name, deps, srcs, data, hdrs, alwayslink, compatible_with, copts, defines, deprecation, distribs, exec_compatible_with, exec_properties, features, implementation_deps, include_prefix, includes, licenses, linkopts, linkstamp, linkstatic, local_defines, nocopts, restricted_to, strip_include_prefix, tags, target_compatible_with, testonly, textual_hdrs, toolchains, visibility, win_def_file)

Verificación de inclusión de encabezado

Todos los archivos de encabezado que se usan en la compilación deben declararse en las reglas hdrs o srcs de cc_*. Esto se aplica de manera forzosa.

En el caso de las reglas cc_library, los encabezados de hdrs comprenden la interfaz pública de la biblioteca y se pueden incluir directamente desde los archivos en hdrs y srcs de la biblioteca, así como desde archivos en hdrs y srcs de las reglas de cc_* que enumeran la biblioteca en su deps. Los encabezados en srcs solo deben incluirse directamente desde los archivos en hdrs y srcs de la biblioteca misma. A la hora de decidir si colocar un encabezado en hdrs o srcs, debes preguntar si quieres que los consumidores de esta biblioteca puedan incluirlo directamente. Esta es aproximadamente la misma decisión que la que se utiliza entre la visibilidad de public y private en los lenguajes de programación.

Las reglas cc_binary y cc_test no tienen una interfaz exportada, por lo que tampoco tienen un atributo hdrs. Todos los encabezados que pertenecen al objeto binario o de prueba directamente deben enumerarse en el srcs.

Para ilustrar estas reglas, observa el siguiente ejemplo.

cc_binary(
    name = "foo",
    srcs = [
        "foo.cc",
        "foo.h",
    ],
    deps = [":bar"],
)

cc_library(
    name = "bar",
    srcs = [
        "bar.cc",
        "bar-impl.h",
    ],
    hdrs = ["bar.h"],
    deps = [":baz"],
)

cc_library(
    name = "baz",
    srcs = [
        "baz.cc",
        "baz-impl.h",
    ],
    hdrs = ["baz.h"],
)

En la siguiente tabla, se enumeran las inclusiones directas permitidas en este ejemplo. Por ejemplo, foo.cc puede incluir directamente foo.h y bar.h, pero no baz.h.

Incluye el archivoInclusiones permitidas
foo.hbar.h
foo.ccfoo.h bar.h
bar.hbar-impl.h baz.h
bar-impl.hbar.h baz.h
bar.ccbar.h bar-impl.h baz.h
baz.hbaz-impl.h
baz-impl.hbaz.h
baz.ccbaz.h baz-impl.h

Las reglas de verificación de inclusión solo se aplican a las inclusiones directas. En el ejemplo anterior, foo.cc puede incluir bar.h, que puede incluir baz.h, que, a su vez, puede incluir baz-impl.h. Técnicamente, la compilación de un archivo .cc puede incluir de forma transitiva cualquier archivo de encabezado en hdrs o srcs en cualquier cc_library en el cierre transitivo deps. En este caso, el compilador puede leer baz.h y baz-impl.h cuando compila foo.cc, pero foo.cc no debe contener #include "baz.h". Para que eso esté permitido, se debe agregar baz a deps de foo.

Lamentablemente, en la actualidad, Bazel no puede distinguir entre inclusiones directas y transitivas, por lo que no puede detectar casos de error en los que un archivo incluya directamente un encabezado al que solo se le permita incluir de forma transitiva. Por ejemplo, Bazel no se quejaría si, en el ejemplo anterior, foo.cc incluye directamente baz.h. Esta acción sería ilegal, ya que foo no depende directamente de baz. Actualmente, no se produce ningún error en ese caso, pero esa verificación de errores se puede agregar en el futuro.

Argumentos

Atributos
name

Name; required

Un nombre único para este destino.

deps

List of labels; optional

Es la lista de otras bibliotecas que se vincularán al destino binario.

Estos pueden ser objetivos cc_library o objc_library.

srcs

List of labels; optional

La lista de archivos C y C++ que se procesan para crear el destino. Estos son archivos fuente y de encabezado C/C++, ya sean no generados (código fuente normal) o generados.

Se compilarán todos los archivos .cc, .c y .cpp. Estos pueden ser archivos generados: si un archivo con nombre está en el outs de alguna otra regla, esta dependerá de forma automática de esa otra regla.

No se compilará un archivo .h, pero estará disponible para que las fuentes lo incluyan en esta regla. Los archivos .cc y .h pueden incluir directamente encabezados enumerados en estas srcs o en hdrs de cualquier regla enumerada en el argumento deps.

Todos los archivos #included deben mencionarse en el atributo srcs de esta regla o en el atributo hdrs de los cc_library() a los que se hace referencia. El estilo recomendado es que los encabezados asociados con una biblioteca se incluyan en el atributo hdrs de esa biblioteca y que los encabezados restantes asociados con las fuentes de esta regla se enumeren en srcs. Consulta "Comprobación de inclusión de encabezado" para obtener una descripción más detallada.

Si el nombre de una regla está en srcs, esta regla dependerá automáticamente de esa regla. Si los outs de la regla con nombre son archivos de origen C o C++, se compilan en esta regla. Si son archivos de biblioteca, están vinculados.

Tipos de archivo srcs permitidos:

  • Archivos de origen C y C++: .c, .cc, .cpp, .cxx, .c++, .C
  • Archivos de encabezado C y C++: .h, .hh, .hpp, .hxx, .inc, .inl y .H
  • Ensamblador con preprocesador de C: .S
  • Archivo: .a, .pic.a
  • Biblioteca "Vincular siempre": .lo, .pic.lo
  • Biblioteca compartida, con versiones o sin versiones: .so, .so.version
  • Archivo de objeto: .o, .pic.o

...y las reglas que producen esos archivos. Diferentes extensiones denotan distintos lenguajes de programación de acuerdo con la convención de GCC.

hdrs

List of labels; optional

Es la lista de archivos de encabezado publicados por esta biblioteca que deben incluirse directamente en las fuentes en reglas dependientes.

Esta es la ubicación preferida para declarar archivos de encabezado que describen la interfaz de la biblioteca. Estos encabezados estarán disponibles para que se incluyan en esta regla o en reglas dependientes. Los encabezados que no estén diseñados para un cliente de esta biblioteca deben enumerarse en el atributo srcs, incluso si están incluidos en un encabezado publicado. Consulta "Comprobación de inclusión de encabezado" para obtener una descripción más detallada.

Boolean; optional; default is False

Si es 1, cualquier objeto binario que dependa (de manera directa o indirecta) de esta biblioteca de C++ se vinculará en todos los archivos de objetos de los archivos enumerados en srcs, incluso si algunos no contienen símbolos al que hace referencia el objeto binario. Esto resulta útil si tu código no se llama explícitamente mediante código en el objeto binario, p.ej., si se registra para recibir una devolución de llamada proporcionada por algún servicio.

Si Alwayslink no funciona con VS 2017 en Windows, debido a un problema conocido, actualiza VS 2017 a la versión más reciente.

copts

List of strings; optional

Agrega estas opciones al comando de compilación de C++. Sujeto a la sustitución "Make variable" y la tokenización de shell Bourne.

Cada cadena de este atributo se agrega en el orden dado a COPTS antes de compilar el objetivo binario. Las marcas solo se aplican para compilar este destino, no sus dependencias, por lo que debes tener cuidado con los archivos de encabezado incluidos en otros lugares. Todas las rutas de acceso deben estar relacionadas con el lugar de trabajo, no con el paquete actual.

Si el paquete declara que feature no_copts_tokenization, la asignación de token de la shell Bourne solo se aplica a las strings que constan de una sola variable "Make".

defines

List of strings; optional

Lista de definiciones para agregar a la línea de compilación. Sujeto a la sustitución de la variable"Make" y la tokenización de la shell Bourne. Cada string, que debe constar de un solo token de shell Bourne, se antepone -D y se agrega a la línea de comandos de compilación de este destino y a cada regla que dependa de él. Ten mucho cuidado, ya que esto puede tener efectos de gran alcance. Si tienes dudas, agrega valores definidos a local_defines.
implementation_deps

List of labels; optional

Es la lista de otras bibliotecas de las que depende el destino de la biblioteca. A diferencia de deps, las rutas de inclusión y los encabezados de estas bibliotecas (y todas sus dependencias transitivas) solo se utilizan para la compilación de esta biblioteca, y no las bibliotecas que dependen de ella. Las bibliotecas especificadas con implementation_deps siguen vinculadas en objetivos binarios que dependen de esta biblioteca.

Por ahora, el uso se limita a cc_library y está protegido por la marca --experimental_cc_implementation_deps.

include_prefix

String; optional

El prefijo que se agregará a las rutas de acceso de los encabezados de esta regla.

Cuando se configura, se puede acceder a los encabezados en el atributo hdrs de esta regla desde el valor de este atributo antepuesto a su ruta relativa de repositorio.

Antes de agregar este prefijo, se quita el prefijo del atributo strip_include_prefix.

includes

List of strings; optional

Es la lista de dirs de inclusión que se agregarán a la línea de compilación.

Sujeto a la sustitución "Make variable". Cada cadena está precedida por -isystem y se agrega a COPTS. A diferencia de COPTS, estas marcas se agregan para esta regla y para cada regla que depende de ella. (Nota: No son las reglas de las que depende). Ten mucho cuidado, ya que esto puede tener efectos de gran alcance. Si tienes dudas, agrega las marcas "-I" a COPTS.

Los encabezados deben agregarse a srcs o hdrs; de lo contrario, no estarán disponibles para las reglas dependientes cuando la compilación esté en zona de pruebas (configuración predeterminada).

linkopts

List of strings; optional

Agrega estas marcas al comando del vinculador de C++. Sujeto a la sustitución de la variable"Make", la tokenización de shell Bourne y la expansión de etiquetas. Cada string de este atributo se agrega a LINKOPTS antes de vincular el destino binario.

Se supone que cada elemento de esta lista que no comienza con $ o - es la etiqueta de destino en deps. La lista de archivos que genera ese destino se agrega a las opciones del vinculador. Se informa un error si la etiqueta no es válida o no se declara en deps.

linkstamp

Label; optional

Compila y vincula de forma simultánea el archivo fuente C++ especificado en el objeto binario final. Se requiere esta trampa para introducir información de marca de tiempo en los objetos binarios; si compilamos el archivo de origen en un archivo de objeto de la manera habitual, la marca de tiempo sería incorrecta. Es posible que una compilación de linktamp no incluya ningún conjunto particular de indicadores de compilador, por lo que no debe depender de ningún encabezado, opción del compilador ni de ninguna otra variable de compilación en particular. Esta opción solo debería ser necesaria en el paquete base.
linkstatic

Boolean; optional; default is False

Para cc_binary y cc_test: vincula el objeto binario en modo estático. Para cc_library.linkstatic: consulta a continuación.

De forma predeterminada, esta opción está activada para cc_binary y desactivada para el resto.

Si se habilita y es un objeto binario o de prueba, esta opción le indica a la herramienta de compilación que se vincule con las bibliotecas de usuario de .a en lugar de .so para las bibliotecas de usuario siempre que sea posible. Es posible que algunas bibliotecas del sistema sigan vinculadas de forma dinámica, al igual que aquellas para las que no hay una biblioteca estática. Por lo tanto, el ejecutable resultante seguirá vinculado de forma dinámica, por lo que es casi estático.

Existen tres formas diferentes de vincular un archivo ejecutable:

  • ESTÁTICO con la función full_static_link, en la que todo está vinculado de forma estática (p.ej., "gcc -static foo.o libbar.a libbaz.a -lm").
    Para habilitar este modo, se especifica fully_static_link en el atributo features.
  • ESTÁTICA, en el que todas las bibliotecas de usuario están vinculadas de forma estática (si hay una versión estática disponible), pero las bibliotecas del sistema (excepto las bibliotecas de tiempo de ejecución C/C++) se vinculan de forma dinámica, p.ej., "gcc foo.o libfoo.a libbaz.a -lm".
    Este modo se habilita especificando linkstatic=True.
  • DYNAMIC, en el que todas las bibliotecas se vinculan de forma dinámica (si hay una versión dinámica disponible), p.ej., "gcc foo.o libfoo.so libbaz.so -lm".
    Este modo se habilita especificando linkstatic=False.

El atributo linkstatic tiene un significado diferente si se usa en una regla cc_library(). En el caso de una biblioteca de C++, linkstatic=True indica que solo se permite la vinculación estática, por lo que no se producirá ninguna .so. linkstatic=False no impide que se creen bibliotecas estáticas. El atributo está diseñado para controlar la creación de bibliotecas dinámicas.

Si es linkstatic=False, la herramienta de compilación creará symlinks a las bibliotecas compartidas dependientes en el área *.runfiles.

local_defines

List of strings; optional

Lista de definiciones para agregar a la línea de compilación. Sujeto a la sustitución de la variable"Make" y la tokenización de la shell Bourne. Cada string, que debe consistir en un único token de shell Bourne, se antepone -D y se agrega a la línea de comandos de compilación para este destino, pero no a sus dependientes.
nocopts

String; optional

Se quitaron las opciones coincidentes del comando de compilación de C++. Sujeto a la sustitución de la variable"Make". El valor de este atributo se interpreta como una expresión regular. Cualquier COPTS preexistente que coincida con esta expresión regular (incluidos los valores especificados de forma explícita en el atributo copts de la regla) se quitará de COPTS para compilar esta regla. Rara vez se necesita este atributo.
strip_include_prefix

String; optional

El prefijo que se quita de las rutas de acceso de los encabezados de esta regla.

Cuando se configura, se puede acceder a los encabezados en el atributo hdrs de esta regla en su ruta de acceso con este prefijo cortado.

Si es una ruta relativa, se toma como relativa al paquete. Si es una absoluta, se entiende como una ruta relativa de repositorio.

El prefijo del atributo include_prefix se agrega después de quitar este prefijo.

textual_hdrs

List of labels; optional

Es la lista de archivos de encabezado que publica esta biblioteca para que las fuentes incluyan de forma textual en reglas dependientes.

Esta es la ubicación para declarar archivos de encabezado que no pueden compilarse por sí solos; es decir, siempre deben incluirse de forma textual por otros archivos fuente para compilar un código válido.

win_def_file

Label; optional

El archivo DEF de Windows que se pasará al vinculador.

Este atributo solo debe usarse cuando Windows es la plataforma seleccionada. Se puede usar para exportar símbolos durante la vinculación de una biblioteca compartida.

cc_proto_library

cc_proto_library(name, deps, data, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, licenses, restricted_to, tags, target_compatible_with, testonly, visibility)

cc_proto_library genera código C++ a partir de archivos .proto.

deps debe apuntar a reglas proto_library .

Ejemplo:

cc_library(
    name = "lib",
    deps = [":foo_cc_proto"],
)

cc_proto_library(
    name = "foo_cc_proto",
    deps = [":foo_proto"],
)

proto_library(
    name = "foo_proto",
)

Argumentos

Atributos
name

Name; required

Un nombre único para este destino.

deps

List of labels; optional

Es la lista de reglas proto_library para las que se genera el código de C++.

fdo_prefetch_hints

fdo_prefetch_hints(name, compatible_with, deprecation, distribs, features, licenses, profile, restricted_to, tags, target_compatible_with, testonly, visibility)

Representa un perfil de sugerencias de carga previa de FDO que se encuentra en el lugar de trabajo o en una ruta de acceso absoluta especificada. Ejemplos:

fdo_prefetch_hints(
    name = "hints",
    profile = "//path/to/hints:profile.afdo",
)

fdo_profile(
  name = "hints_abs",
  absolute_path_profile = "/absolute/path/profile.afdo",
)

Argumentos

Atributos
name

Name; required

Un nombre único para este destino.

profile

Label; optional

Etiqueta del perfil de sugerencias. El archivo de sugerencias tiene la extensión .afdo. La etiqueta también puede apuntar a una regla fdo_Absolute_path_profile.

fdo_profile

fdo_profile(name, absolute_path_profile, compatible_with, deprecation, distribs, features, licenses, profile, proto_profile, restricted_to, tags, target_compatible_with, testonly, visibility)

Representa un perfil de FDO que se encuentra en el lugar de trabajo o en una ruta de acceso absoluta especificada. Ejemplos:

fdo_profile(
    name = "fdo",
    profile = "//path/to/fdo:profile.zip",
)

fdo_profile(
  name = "fdo_abs",
  absolute_path_profile = "/absolute/path/profile.zip",
)

Argumentos

Atributos
name

Name; required

Un nombre único para este destino.

absolute_path_profile

String; optional

Ruta de acceso absoluta al perfil de FDO. El archivo FDO puede tener una de las siguientes extensiones: .profraw para un perfil de LLVM no indexado, .profdata para un perfil de LLVM indexado, .zip que contiene un perfil profraw de LLVM o .afdo para el perfil de AutoFDO.
profile

Label; optional

Etiqueta del perfil de FDO o una regla que lo genera. El archivo FDO puede tener una de las siguientes extensiones: .profraw para el perfil de LLVM no indexado, .profdata para el perfil de LLVM indexado, .zip que contiene un perfil profraw de LLVM, .afdo para el perfil de AutoFDO o .xfdo para el perfil XBinary La etiqueta también puede apuntar a una regla fdo_Absolute_path_profile.
proto_profile

Label; optional

Etiqueta del perfil de protobuf.

propeller_optimize

propeller_optimize(name, compatible_with, deprecation, distribs, features, ld_profile, licenses, restricted_to, tags, target_compatible_with, testonly, visibility)

Representa un perfil de optimización de la hélice en el lugar de trabajo. Ejemplo:

propeller_optimize(
    name = "layout",
    cc_profile = "//path:cc_profile.txt",
    ld_profile = "//path:ld_profile.txt"
)

propeller_optimize(
    name = "layout_absolute",
    absolute_cc_profile = "/absolute/cc_profile.txt",
    absolute_ld_profile = "/absolute/ld_profile.txt"
)

Argumentos

Atributos
name

Name; required

Un nombre único para este destino.

ld_profile

Label; optional

Etiqueta del perfil que se pasa a la acción de vínculo. Este archivo tiene la extensión .txt.

cc_test

cc_test(name, deps, srcs, data, additional_linker_inputs, args, compatible_with, copts, defines, deprecation, distribs, env, env_inherit, exec_compatible_with, exec_properties, features, flaky, includes, licenses, linkopts, linkstatic, local, local_defines, malloc, nocopts, restricted_to, shard_count, size, stamp, tags, target_compatible_with, testonly, timeout, toolchains, visibility, win_def_file)

Argumentos

Atributos
name

Name; required

Un nombre único para este destino.

deps

List of labels; optional

Es la lista de otras bibliotecas que se vincularán al destino binario.

Estos pueden ser objetivos cc_library o objc_library.

srcs

List of labels; optional

La lista de archivos C y C++ que se procesan para crear el destino. Estos son archivos fuente y de encabezado C/C++, ya sean no generados (código fuente normal) o generados.

Se compilarán todos los archivos .cc, .c y .cpp. Estos pueden ser archivos generados: si un archivo con nombre está en el outs de alguna otra regla, esta dependerá de forma automática de esa otra regla.

No se compilará un archivo .h, pero estará disponible para que las fuentes lo incluyan en esta regla. Los archivos .cc y .h pueden incluir directamente encabezados enumerados en estas srcs o en hdrs de cualquier regla enumerada en el argumento deps.

Todos los archivos #included deben mencionarse en el atributo srcs de esta regla o en el atributo hdrs de los cc_library() a los que se hace referencia. El estilo recomendado es que los encabezados asociados con una biblioteca se incluyan en el atributo hdrs de esa biblioteca y que los encabezados restantes asociados con las fuentes de esta regla se enumeren en srcs. Consulta "Comprobación de inclusión de encabezado" para obtener una descripción más detallada.

Si el nombre de una regla está en srcs, esta regla dependerá automáticamente de esa regla. Si los outs de la regla con nombre son archivos de origen C o C++, se compilan en esta regla. Si son archivos de biblioteca, están vinculados.

Tipos de archivo srcs permitidos:

  • Archivos de origen C y C++: .c, .cc, .cpp, .cxx, .c++, .C
  • Archivos de encabezado C y C++: .h, .hh, .hpp, .hxx, .inc, .inl y .H
  • Ensamblador con preprocesador de C: .S
  • Archivo: .a, .pic.a
  • Biblioteca "Vincular siempre": .lo, .pic.lo
  • Biblioteca compartida, con versiones o sin versiones: .so, .so.version
  • Archivo de objeto: .o, .pic.o

...y las reglas que producen esos archivos. Diferentes extensiones denotan distintos lenguajes de programación de acuerdo con la convención de GCC.

additional_linker_inputs

List of labels; optional

Pasa estos archivos al comando del vinculador de C++.

Por ejemplo, se pueden proporcionar archivos .res de Windows compilados aquí para incorporarlos en el destino binario.

copts

List of strings; optional

Agrega estas opciones al comando de compilación de C++. Sujeto a la sustitución "Make variable" y la tokenización de shell Bourne.

Cada cadena de este atributo se agrega en el orden dado a COPTS antes de compilar el objetivo binario. Las marcas solo se aplican para compilar este destino, no sus dependencias, por lo que debes tener cuidado con los archivos de encabezado incluidos en otros lugares. Todas las rutas de acceso deben estar relacionadas con el lugar de trabajo, no con el paquete actual.

Si el paquete declara que feature no_copts_tokenization, la asignación de token de la shell Bourne solo se aplica a las strings que constan de una sola variable "Make".

defines

List of strings; optional

Lista de definiciones para agregar a la línea de compilación. Sujeto a la sustitución de la variable"Make" y la tokenización de la shell Bourne. Cada string, que debe constar de un solo token de shell Bourne, se antepone -D y se agrega a la línea de comandos de compilación de este destino y a cada regla que dependa de él. Ten mucho cuidado, ya que esto puede tener efectos de gran alcance. Si tienes dudas, agrega valores definidos a local_defines.
includes

List of strings; optional

Es la lista de dirs de inclusión que se agregarán a la línea de compilación.

Sujeto a la sustitución "Make variable". Cada cadena está precedida por -isystem y se agrega a COPTS. A diferencia de COPTS, estas marcas se agregan para esta regla y para cada regla que depende de ella. (Nota: No son las reglas de las que depende). Ten mucho cuidado, ya que esto puede tener efectos de gran alcance. Si tienes dudas, agrega las marcas "-I" a COPTS.

Los encabezados deben agregarse a srcs o hdrs; de lo contrario, no estarán disponibles para las reglas dependientes cuando la compilación esté en zona de pruebas (configuración predeterminada).

linkopts

List of strings; optional

Agrega estas marcas al comando del vinculador de C++. Sujeto a la sustitución de la variable"Make", la tokenización de shell Bourne y la expansión de etiquetas. Cada string de este atributo se agrega a LINKOPTS antes de vincular el destino binario.

Se supone que cada elemento de esta lista que no comienza con $ o - es la etiqueta de destino en deps. La lista de archivos que genera ese destino se agrega a las opciones del vinculador. Se informa un error si la etiqueta no es válida o no se declara en deps.

linkstatic

Boolean; optional; default is False

Para cc_binary y cc_test: vincula el objeto binario en modo estático. Para cc_library.linkstatic: consulta a continuación.

De forma predeterminada, esta opción está activada para cc_binary y desactivada para el resto.

Si se habilita y es un objeto binario o de prueba, esta opción le indica a la herramienta de compilación que se vincule con las bibliotecas de usuario de .a en lugar de .so para las bibliotecas de usuario siempre que sea posible. Es posible que algunas bibliotecas del sistema sigan vinculadas de forma dinámica, al igual que aquellas para las que no hay una biblioteca estática. Por lo tanto, el ejecutable resultante seguirá vinculado de forma dinámica, por lo que es casi estático.

Existen tres formas diferentes de vincular un archivo ejecutable:

  • ESTÁTICO con la función full_static_link, en la que todo está vinculado de forma estática (p.ej., "gcc -static foo.o libbar.a libbaz.a -lm").
    Para habilitar este modo, se especifica fully_static_link en el atributo features.
  • ESTÁTICA, en el que todas las bibliotecas de usuario están vinculadas de forma estática (si hay una versión estática disponible), pero las bibliotecas del sistema (excepto las bibliotecas de tiempo de ejecución C/C++) se vinculan de forma dinámica, p.ej., "gcc foo.o libfoo.a libbaz.a -lm".
    Este modo se habilita especificando linkstatic=True.
  • DYNAMIC, en el que todas las bibliotecas se vinculan de forma dinámica (si hay una versión dinámica disponible), p.ej., "gcc foo.o libfoo.so libbaz.so -lm".
    Este modo se habilita especificando linkstatic=False.

El atributo linkstatic tiene un significado diferente si se usa en una regla cc_library(). En el caso de una biblioteca de C++, linkstatic=True indica que solo se permite la vinculación estática, por lo que no se producirá ninguna .so. linkstatic=False no impide que se creen bibliotecas estáticas. El atributo está diseñado para controlar la creación de bibliotecas dinámicas.

Si es linkstatic=False, la herramienta de compilación creará symlinks a las bibliotecas compartidas dependientes en el área *.runfiles.

local_defines

List of strings; optional

Lista de definiciones para agregar a la línea de compilación. Sujeto a la sustitución de la variable"Make" y la tokenización de la shell Bourne. Cada string, que debe consistir en un único token de shell Bourne, se antepone -D y se agrega a la línea de comandos de compilación para este destino, pero no a sus dependientes.
malloc

Label; optional; default is @bazel_tools//tools/cpp:malloc

Anula la dependencia predeterminada de malloc.

De forma predeterminada, los objetos binarios de C++ están vinculados con //tools/cpp:malloc, que es una biblioteca vacía, por lo que el objeto binario termina usando libc malloc. Esta etiqueta debe hacer referencia a un cc_library. Si la compilación es para una regla que no es de C++, esta opción no tiene efecto. El valor de este atributo se ignora si se especifica linkshared=True.

nocopts

String; optional

Se quitaron las opciones coincidentes del comando de compilación de C++. Sujeto a la sustitución de la variable"Make". El valor de este atributo se interpreta como una expresión regular. Cualquier COPTS preexistente que coincida con esta expresión regular (incluidos los valores especificados de forma explícita en el atributo copts de la regla) se quitará de COPTS para compilar esta regla. Rara vez se necesita este atributo.
stamp

Integer; optional; default is 0

Indica si se debe codificar la información de compilación en el objeto binario. Valores posibles:
  • stamp = 1: Siempre marca la información de compilación en el objeto binario, incluso en compilaciones de --nostamp. Esta configuración debe evitarse, ya que podría finalizar el almacenamiento en caché remoto del objeto binario y todas las acciones descendentes que dependen de él.
  • stamp = 0: Siempre reemplaza la información de compilación por valores constantes. Esto proporciona un buen almacenamiento en caché de resultados de compilación.
  • stamp = -1: La marca --[no]stamp controla la incorporación de la información de compilación.

Los objetos binarios sellados no se vuelven a compilar, a menos que cambien sus dependencias.

win_def_file

Label; optional

El archivo DEF de Windows que se pasará al vinculador.

Este atributo solo debe usarse cuando Windows es la plataforma seleccionada. Se puede usar para exportar símbolos durante la vinculación de una biblioteca compartida.

cc_toolchain

cc_toolchain(name, all_files, ar_files, as_files, compatible_with, compiler, compiler_files, compiler_files_without_includes, coverage_files, cpu, deprecation, distribs, dwp_files, dynamic_runtime_lib, exec_transition_for_inputs, features, libc_top, licenses, linker_files, module_map, objcopy_files, restricted_to, static_runtime_lib, strip_files, supports_header_parsing, supports_param_files, tags, target_compatible_with, testonly, toolchain_config, toolchain_identifier, visibility)

Representa una cadena de herramientas de C++.

Esta regla es responsable de lo siguiente:

  • Recopilando todos los artefactos necesarios para que se ejecuten las acciones de C++. Esto se hace mediante atributos como all_files, compiler_files, linker_files y otros atributos que terminan en _files, que suelen ser grupos de archivos que globalizan todos los archivos necesarios.
  • Generación de líneas de comandos correctas para acciones de C++. Para ello, se usa el proveedor CcToolchainConfigInfo (consulta más detalles a continuación).

Usa el atributo toolchain_config para configurar la cadena de herramientas de C++. Consulta también esta página para ver documentación elaborada sobre la configuración de la cadena de herramientas de C++ y su selección.

Usa tags = ["manual"] para evitar que las cadenas de herramientas se compilen y configuren innecesariamente cuando invoques bazel build //....

Argumentos

Atributos
name

Name; required

Un nombre único para este destino.

all_files

Label; required

Es una colección de todos los artefactos de cc_toolchain. Estos artefactos se agregarán como entradas a todas las acciones relacionadas con rules_cc (a excepción de las acciones que usan conjuntos de artefactos más precisos de los atributos que se indican a continuación). Bazel supone que all_files es un superconjunto de todos los demás atributos que proporcionan artefactos (p.ej., la compilación de linktamp necesita archivos de compilación y vínculos, por lo que toma all_files).

Esto es lo que contiene cc_toolchain.files, y todas las reglas de Starlark usan esta información con la cadena de herramientas de C++.

ar_files

Label; optional

Es una colección de todos los artefactos cc_toolchain necesarios para archivar acciones.

as_files

Label; optional

Es una colección de todos los artefactos cc_toolchain necesarios para las acciones de ensamblado.

compiler

String; optional; nonconfigurable

Ya no está disponible. En su lugar, usa el atributo toolchain_identifier. Será un nodo después de la migración de CROSSTOOL a Starlark y se quitará antes del #7075.

Cuando se establezca, se usará para realizar la selección de crosstool_config.toolchain. Tendrá prioridad sobre la opción --cpu Bazel.

compiler_files

Label; required

Es una colección de todos los artefactos cc_toolchain necesarios para las acciones de compilación.
compiler_files_without_includes

Label; optional

Es la colección de todos los artefactos cc_toolchain necesarios para acciones de compilación en caso de que se admita el descubrimiento de entradas (actualmente solo de Google).
coverage_files

Label; optional

Es una colección de todos los artefactos cc_toolchain necesarios para las acciones de cobertura. Si no se especifica, se usa all_files.
cpu

String; optional; nonconfigurable

Ya no está disponible. En su lugar, usa el atributo toolchain_identifier. Será un nodo después de la migración de CROSSTOOL a Starlark y se quitará en el código #7075.

Cuando se establezca, se usará para realizar la selección de crosstool_config.toolchain. Tendrá prioridad sobre la opción --cpu Bazel.

dwp_files

Label; required

Es una colección de todos los artefactos cc_toolchain necesarios para las acciones de dwp.
dynamic_runtime_lib

Label; optional

Artefacto de biblioteca dinámica para la biblioteca en tiempo de ejecución C++ (p.ej., libstdc++.so).

Se usará cuando la función "static_link_cpp_runtimes" esté habilitada y vinculemos las dependencias de forma dinámica.

exec_transition_for_inputs

Boolean; optional; default is True

Configúralo como verdadero para compilar todas las entradas de archivos en cc_toolchain para la plataforma de ejecución, en lugar de no tener ninguna transición (es decir, la plataforma de destino de forma predeterminada).
libc_top

Label; optional

Una colección de artefactos de libc pasados como entradas para las acciones de compilación o vinculación.
linker_files

Label; required

Es una colección de todos los artefactos cc_toolchain necesarios para vincular acciones.
module_map

Label; optional

Artefacto de asignación de módulo que se usa para compilaciones modulares.
objcopy_files

Label; required

Es una colección de todos los artefactos cc_toolchain necesarios para las acciones objcopy.
static_runtime_lib

Label; optional

Artefacto de biblioteca estática para la biblioteca en tiempo de ejecución C++ (p.ej., libstdc++.a).

Se usará cuando la función "static_link_cpp_runtimes" esté habilitada, y vinculamos las dependencias de forma estática.

strip_files

Label; required

Es una colección de todos los artefactos cc_toolchain necesarios para las acciones de eliminación.
supports_header_parsing

Boolean; optional; default is False

Se establece como True cuando cc_toolchain admite acciones de análisis de encabezados.
supports_param_files

Boolean; optional; default is True

Se establece en True cuando cc_toolchain admite el uso de archivos de parámetros para acciones de vinculación.
toolchain_config

Label; required

La etiqueta de la regla que proporciona cc_toolchain_config_info.
toolchain_identifier

String; optional; nonconfigurable

Es el identificador que se usa para hacer coincidir esta cc_toolchain con el crosstool_config.toolchain correspondiente.

Hasta que se corrija el problema #5380, esta es la forma recomendada de asociar cc_toolchain con CROSSTOOL.toolchain. Se reemplazará por el atributo toolchain_config (#5380).

cc_toolchain_suite

cc_toolchain_suite(name, compatible_with, deprecation, distribs, features, licenses, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)

Representa una colección de cadenas de herramientas de C++.

Esta regla es responsable de lo siguiente:

  • Recopilando todas las cadenas de herramientas de C++ relevantes.
  • Selecciona una cadena de herramientas en función de las opciones --cpu y --compiler que se pasan a Bazel.

Consulta también esta página para ver documentación elaborada sobre la configuración de la cadena de herramientas de C++ y su selección.

Argumentos

Atributos
name

Name; required

Un nombre único para este destino.

toolchains

Dictionary mapping strings to labels; required; nonconfigurable

Asignación de las strings "<cpu>" o "<cpu>|<compiler>" a una etiqueta cc_toolchain. Se usará "<cpu>" cuando solo se pase --cpu a Bazel, y "<cpu>|<compiler>" se usará cuando se pasen --cpu y --compiler a Bazel. Ejemplo:

          cc_toolchain_suite(
            name = "toolchain",
            toolchains = {
              "piii|gcc": ":my_cc_toolchain_for_piii_using_gcc",
              "piii": ":my_cc_toolchain_for_piii_using_default_compiler",
            },
          )