Reglas C / C++

Informa de un problema Ver fuente

Reglas

CC_binario

Ver el origen de las reglas
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 sin objetos binarios del objeto binario. strip -g se ejecuta en el objeto binario para quitar los símbolos de depuración. Se pueden proporcionar opciones de banda 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 compilado si se solicita de forma explícita): Si Fission está habilitado, es un archivo de paquete de información de depuración adecuado para depurar objetos binarios implementados de forma remota. De lo contrario: un archivo vacío.

Argumentos

Atributos
name

Name; required

Es un nombre único para este destino.

deps

List of labels; optional

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

Pueden ser objetivos cc_library o objc_library.

srcs

List of labels; optional

Es la lista de archivos C y C++ que se procesan para crear el destino. Estos son archivos fuente y de encabezado C/C++, ya sea 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 se encuentra en el outs de alguna otra regla, esta dependerá automáticamente de esa otra regla.

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

Se deben mencionar todos los archivos #include en el atributo srcs de esta regla o en el atributo hdrs de 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 los encabezados restantes asociados con las fuentes de esta regla que se enumeran en srcs. Consulta "Verificación de inclusión de encabezados" para obtener una descripción más detallada.

Si el nombre de una regla está en srcs, esta regla depende automáticamente de esa. 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, se vinculan.

Tipos de archivos 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, .H
  • Armador 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 cualquier regla que produzca esos archivos. Las diferentes extensiones denotan diferentes 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 C++.

Por ejemplo, se pueden proporcionar archivos .res compilados de Windows 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 de "Make variable" y a la asignación de token de shell Bourne.

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

Si el paquete declara el no_copts_tokenization feature, la asignación de token de shell Bourne se aplica solo a las strings que consisten en 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 variable"Make" y a la asignación de token a shell de Bourne. Cada string, que debe consistir en un solo token de shell de Bourne, está precedida por -D y se agrega a la línea de comandos de compilación a este destino, así como a cada regla que depende de ella. Ten mucho cuidado, ya que esto puede tener efectos de gran alcance. En caso de duda, agrega valores definidos a local_defines.
includes

List of strings; optional

Lista de los dir. de inclusión que se agregarán a la línea de compilación.

Sujeto a la sustitución "Make variable". Cada string se antepone con -isystem y se agrega a COPTS. A diferencia de COPTS, estas marcas se agregan para esta regla y todas las reglas que dependen de ella. Nota: No son las reglas de las que depende. Ten mucho cuidado, ya que esto puede tener efectos de gran alcance. Cuando tengas dudas, agrega las marcas “-I” a COPTS.

Los encabezados deben agregarse a src o hdr; de lo contrario, no estarán disponibles para las reglas dependientes cuando la compilación se coloque en una zona de pruebas (el valor predeterminado).

linkopts

List of strings; optional

Agrega estas marcas al comando del vinculador C++. Sujeto a la sustitución de la variable"Make", la asignación de token a la shell de 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 un destino en deps. La lista de archivos generados por 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

Cree una biblioteca compartida. Para habilitar este atributo, incluya linkshared=True en su regla. Esta opción está desactivada de forma predeterminada.

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

Si especificas linkopts=['-static'] y linkshared=True, obtendrás una sola unidad completamente independiente. Si especificas linkstatic=True y linkshared=True, obtendrás una sola unidad, en su mayoría 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 está habilitada y es un objeto binario o una prueba, esta opción indica a la herramienta de compilación que se vincule en .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 las bibliotecas para las que no hay una biblioteca estática. Por lo tanto, el ejecutable resultante seguirá vinculado de forma dinámica, por lo que solo será mayormente estático.

Existen tres maneras diferentes de vincular un ejecutable:

  • STATIC 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”.
    Este modo se habilita si especificas fully_static_link en el atributo features.
  • Estadísticas, en las que todas las bibliotecas de usuarios están vinculadas de forma estática (si hay una versión estática disponible), pero las bibliotecas del sistema (excepto las bibliotecas de entorno de ejecución C/C++) están vinculadas de forma dinámica, p.ej., "gcc foo.o libfoo.a libbaz.a -lm".
    Este modo se habilita si especificas linkstatic=True.
  • DYNAMIC, en el que todas las bibliotecas están vinculadas 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 si especificas 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 generará ningún .so. linkstatic=False no evita 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 bibliotecas compartidas de dependencia 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 variable"Make" y a la asignación de token a shell de Bourne. Cada string, que debe consistir en un solo token de shell de Bourne, está precedida por -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++ se vinculan con //tools/cpp:malloc, que es una biblioteca vacía, por lo que el objeto binario termina usando malloc de libc. Esta etiqueta debe hacer referencia a un cc_library. Si la compilación es para una regla que no sea de C++, esta opción no tiene efecto. El valor de este atributo se ignora si se especifica linkshared=True.

nocopts

String; optional

Quita las opciones de coincidencia 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 a los efectos de compilar esta regla. Rara vez se necesita este atributo.
stamp

Integer; optional; default is -1

Si se debe codificar información de compilación en el objeto binario Valores posibles:
  • stamp = 1: Siempre sella la información de compilación en el objeto binario, incluso en las compilaciones de --nostamp. Se debe evitar esta configuración, ya que podría cerrar el almacenamiento en caché remoto para el objeto binario y cualquier acción descendente que dependa de él.
  • stamp = 0: Reemplaza siempre la información de compilación por valores constantes. Esto brinda un buen almacenamiento en caché de resultados de compilación.
  • stamp = -1: La marca --[no]stamp controla la incorporación de información de compilación.

Los objetos binarios con sellos 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_importar

Ver el origen de las reglas
cc_import(name, deps, 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++ compiladas previamente.

Los siguientes son 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. Cómo vincular una biblioteca compartida (Unix)
cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  shared_library = "libmylib.so",
)
3. Vinculación de una biblioteca compartida con una biblioteca de interfaces (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 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,
)
cc_import admite un atributo de inclusión. Por ejemplo:
  cc_import(
  name = "curl_lib",
  hdrs = glob(["vendor/curl/include/curl/*.h"]),
  includes = [ "vendor/curl/include" ],
  shared_library = "vendor/curl/lib/.libs/libcurl.dylib",
)
.

Argumentos

Atributos
name

Name; required

Es un nombre único para este destino.

deps

List of labels; optional

Es la lista de otras bibliotecas de las que depende el destino. Consulta los comentarios generales sobre deps en Atributos típicos definidos por la mayoría de las reglas de compilación.
hdrs

List of labels; optional

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

Boolean; optional; default is False

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

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

interface_library

Label; optional

Una sola biblioteca de interfaces para vincular la biblioteca compartida.

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

shared_library

Label; optional

Una sola biblioteca compartida compilada previamente. Bazel garantiza 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 proporcionó 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_biblioteca

Ver el origen de las reglas
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 encabezados

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.

Para las reglas cc_library, los encabezados en 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 las reglas hdrs y srcs de cc_* que enumeran la biblioteca en su deps. Los encabezados de srcs solo se deben incluir directamente desde los archivos en hdrs y srcs de la biblioteca. Cuando decidas si debes colocar un encabezado en hdrs o srcs, debes preguntar si deseas que los consumidores de esta biblioteca puedan incluirlo directamente. Esta es más o menos igual a la visibilidad entre 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 la prueba directamente deben aparecer en la 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"],
)

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

Incluyendo archivoInclusiones permitidas
foo.hbar
foo.ccfoo.h bar
barbar-impl.h baz.h
bar-impl.hbar.h baz.h
barbar.h bar-impl.h baz.h
Bazbaz-impl.h
baz-impl.hBaz
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 del cierre deps transitivo. 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 permitirlo, se debe agregar baz a deps de foo.

Bazel depende de la compatibilidad de la cadena de herramientas para aplicar las reglas de verificación de inclusión. La función layering_check debe ser compatible con la cadena de herramientas y solicitarse de forma explícita, por ejemplo, a través de la marca de línea de comandos --features=layering_check o el parámetro features de la función package. Las cadenas de herramientas que proporciona Bazel solo admiten esta función con clang en Unix y macOS.

Argumentos

Atributos
name

Name; required

Es un nombre único para este destino.

deps

List of labels; optional

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

Pueden ser objetivos cc_library o objc_library.

srcs

List of labels; optional

Es la lista de archivos C y C++ que se procesan para crear el destino. Estos son archivos fuente y de encabezado C/C++, ya sea 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 se encuentra en el outs de alguna otra regla, esta dependerá automáticamente de esa otra regla.

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

Se deben mencionar todos los archivos #include en el atributo srcs de esta regla o en el atributo hdrs de 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 los encabezados restantes asociados con las fuentes de esta regla que se enumeran en srcs. Consulta "Verificación de inclusión de encabezados" para obtener una descripción más detallada.

Si el nombre de una regla está en srcs, esta regla depende automáticamente de esa. 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, se vinculan.

Tipos de archivos 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, .H
  • Armador 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 cualquier regla que produzca esos archivos. Las diferentes extensiones denotan diferentes lenguajes de programación de acuerdo con la convención de GCC.

hdrs

List of labels; optional

Es la lista de archivos de encabezado que publica esta biblioteca para que los fuentes los incluyan directamente en las 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 los fuentes los incluyan en esta regla o en reglas dependientes. En su lugar, los encabezados que no se pretenden incluir en un cliente de esta biblioteca deben incluirse en el atributo srcs, incluso si están incluidos en un encabezado publicado. Consulta "Verificación de inclusión de encabezados" para obtener una descripción más detallada.

Boolean; optional; default is False

Si es 1, cualquier objeto binario que dependa (directa o indirectamente) de esta biblioteca de C++ se vinculará en todos los archivos de objetos para los archivos que se enumeran en srcs, incluso si algunos no contienen símbolos a los que el objeto binario haga referencia. Esto es útil si tu código no lo llama explícitamente en el objeto binario (p.ej., si se registra para recibir la devolución de llamada que proporciona algún servicio).

Si Alwayslink no funciona con VS 2017 en Windows, se debe 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 de "Make variable" y a la asignación de token de shell Bourne.

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

Si el paquete declara el no_copts_tokenization feature, la asignación de token de shell Bourne se aplica solo a las strings que consisten en 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 variable"Make" y a la asignación de token a shell de Bourne. Cada string, que debe consistir en un solo token de shell de Bourne, está precedida por -D y se agrega a la línea de comandos de compilación a este destino, así como a cada regla que depende de ella. Ten mucho cuidado, ya que esto puede tener efectos de gran alcance. En caso de duda, agrega valores definidos a local_defines.
implementation_deps

List of labels; optional

La lista de otras bibliotecas de las que depende el destino de la biblioteca. A diferencia de deps, los encabezados y las rutas de inclusión de estas bibliotecas (y todas sus dependencias transitivas) solo se usan para la compilación de esta biblioteca, no para las que dependen de ella. Las bibliotecas especificadas con implementation_deps aún están vinculadas en destinos 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

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

Cuando se establecen, los encabezados del atributo hdrs de esta regla son accesibles en el valor que este atributo antepone a su ruta de acceso relativa al repositorio.

Se quita el prefijo del atributo strip_include_prefix antes de agregar este prefijo.

includes

List of strings; optional

Lista de los dir. de inclusión que se agregarán a la línea de compilación.

Sujeto a la sustitución "Make variable". Cada string se antepone con -isystem y se agrega a COPTS. A diferencia de COPTS, estas marcas se agregan para esta regla y todas las reglas que dependen de ella. Nota: No son las reglas de las que depende. Ten mucho cuidado, ya que esto puede tener efectos de gran alcance. Cuando tengas dudas, agrega las marcas “-I” a COPTS.

Los encabezados deben agregarse a src o hdr; de lo contrario, no estarán disponibles para las reglas dependientes cuando la compilación se coloque en una zona de pruebas (el valor predeterminado).

linkopts

List of strings; optional

Agrega estas marcas al comando del vinculador C++. Sujeto a la sustitución de la variable"Make", la asignación de token a la shell de 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 un destino en deps. La lista de archivos generados por 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 simultáneamente el archivo de origen C++ especificado al objeto binario final. Este trucos es necesario para introducir información de marca de tiempo en 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 todavía no incluya ningún conjunto particular de indicadores del compilador y, por lo tanto, no debe depender de ningún encabezado, opción de compilador ni 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 está habilitada y es un objeto binario o una prueba, esta opción indica a la herramienta de compilación que se vincule en .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 las bibliotecas para las que no hay una biblioteca estática. Por lo tanto, el ejecutable resultante seguirá vinculado de forma dinámica, por lo que solo será mayormente estático.

Existen tres maneras diferentes de vincular un ejecutable:

  • STATIC 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”.
    Este modo se habilita si especificas fully_static_link en el atributo features.
  • Estadísticas, en las que todas las bibliotecas de usuarios están vinculadas de forma estática (si hay una versión estática disponible), pero las bibliotecas del sistema (excepto las bibliotecas de entorno de ejecución C/C++) están vinculadas de forma dinámica, p.ej., "gcc foo.o libfoo.a libbaz.a -lm".
    Este modo se habilita si especificas linkstatic=True.
  • DYNAMIC, en el que todas las bibliotecas están vinculadas 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 si especificas 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 generará ningún .so. linkstatic=False no evita 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 bibliotecas compartidas de dependencia 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 variable"Make" y a la asignación de token a shell de Bourne. Cada string, que debe consistir en un solo token de shell de Bourne, está precedida por -D y se agrega a la línea de comandos de compilación para este destino, pero no a sus dependientes.
nocopts

String; optional

Quita las opciones de coincidencia 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 a los efectos de compilar esta regla. Rara vez se necesita este atributo.
strip_include_prefix

String; optional

Prefijo para quitar de las rutas de los encabezados de esta regla.

Cuando se configuran, los encabezados del atributo hdrs de esta regla son accesibles en su ruta con este prefijo cortado.

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

El prefijo del atributo include_prefix se agrega después de la eliminación de este prefijo.

textual_hdrs

List of labels; optional

Es la lista de archivos de encabezado que publica esta biblioteca para que se incluyan textualmente en fuentes de reglas dependientes.

Esta es la ubicación para declarar archivos de encabezado que no se pueden compilar por su cuenta; es decir, siempre deben incluirse textualmente en otros archivos de origen para compilar 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

Ver el origen de las reglas
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 de 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

Es un nombre único para este destino.

deps

List of labels; optional

La lista de reglas proto_library para las que se generará código C++.

CC_biblioteca_compartida

Ver el origen de las reglas
cc_shared_library(name, deps, additional_linker_inputs, dynamic_deps, exports_filter, shared_lib_name, tags, user_link_flags, win_def_file)

Produce una biblioteca compartida.

Ejemplo

cc_shared_library(
    name = "foo_shared",
    deps = [
        ":foo",
    ],
    dynamic_deps = [
        ":bar_shared",
    ],
    additional_linker_inputs = [
        ":foo.lds",
    ],
    user_link_flags = [
        "-Wl,--version-script=$(location :foo.lds)",
    ],
)
cc_library(
    name = "foo",
    srcs = ["foo.cc"],
    hdrs = ["foo.h"],
    deps = [
        ":bar",
        ":baz",
    ],
)
cc_shared_library(
    name = "bar_shared",
    shared_lib_name = "bar.so",
    deps = [":bar"],
)
cc_library(
    name = "bar",
    srcs = ["bar.cc"],
    hdrs = ["bar.h"],
)
cc_library(
    name = "baz",
    srcs = ["baz.cc"],
    hdrs = ["baz.h"],
)

En el ejemplo foo_shared, se vinculan de forma estática foo y baz, este último es una dependencia transitiva. No vincula bar porque ya está proporcionado de manera dinámica por el bar_shared de dynamic_dep.

foo_shared usa un archivo *.lds de secuencia de comandos del vinculador para controlar qué símbolos se deben exportar. La lógica de la regla cc_shared_library no controla qué símbolos se exportan, solo usa lo que se supone que se exportará para dar errores durante la fase de análisis si dos bibliotecas compartidas exportan los mismos destinos.

Se supone que se exporta cada dependencia directa de cc_shared_library. Por lo tanto, durante el análisis, Bazel supone que foo_shared exporta foo. No se supone que foo_shared exporte baz. También se supone que se exportó cada destino que coincide con exports_filter.

Cada cc_library del ejemplo debe aparecer como máximo en una cc_shared_library. Si también quisiéramos vincular baz a bar_shared, debemos agregar tags = ["LINKABLE_MORE_THAN_ONCE"] a baz.

Debido al atributo shared_lib_name, el archivo producido por bar_shared tendrá el nombre bar.so en lugar del nombre libbar.so que tendría de forma predeterminada en Linux.

Errores

Two shared libraries in dependencies export the same symbols.

Esto sucederá cada vez que crees un destino con dos dependencias cc_shared_library diferentes que exporten el mismo destino. Para solucionar este problema, debes detener la exportación de las bibliotecas en una de las dependencias de cc_shared_library.

Esto sucederá cada vez que crees un cc_shared_library nuevo con dos dependencias de cc_shared_library diferentes que vinculen el mismo destino de forma estática. Similar al error con las exportaciones.

Una forma de solucionar este problema es dejar de vincular la biblioteca a una de las dependencias de cc_shared_library. Al mismo tiempo, la que aún lo vincula necesita exportar la biblioteca para que la que no la vincula mantenga la visibilidad de los símbolos. Otra forma es extraer una tercera biblioteca que exporte el destino. Una tercera manera es etiquetar al culpable cc_library con LINKABLE_MORE_THAN_ONCE, pero esta corrección debe ser poco común, y debes asegurarte de que cc_library sea seguro vincular más de una vez.

'//foo:foo' is already linked statically in '//bar:bar' but not exported`

Eso significa que se puede acceder a una biblioteca en el cierre transitivo de tu deps sin pasar por una de las dependencias de cc_shared_library, pero ya se vinculó a un cc_shared_library diferente en dynamic_deps y no se exporta.

La solución es exportarlo desde la dependencia cc_shared_library o extraer un tercer cc_shared_library que lo exporte.

Do not place libraries which only contain a precompiled dynamic library in deps.

Si tienes una biblioteca dinámica compilada previamente, no es necesario que no se pueda vincular estáticamente al destino cc_shared_library actual que estás creando. Por lo tanto, no pertenece a deps de cc_shared_library. Si esta biblioteca dinámica precompilada es una dependencia de uno de tus cc_libraries, cc_library debe depender directamente de ella.

Trying to export a library already exported by a different shared library

Verás este error si, en la regla actual, reclamas la exportación de un destino que ya exporta una de tus dependencias dinámicas.

Para solucionar este problema, quita el destino de deps y confía en él de la dependencia dinámica, o asegúrate de que exports_filter no lo detecte.

Argumentos

Atributos
name

Name; required

Es un nombre único para este destino.

deps

List of labels; optional

Bibliotecas de nivel superior que se vincularán de forma incondicional a la biblioteca compartida después de archivarse por completo.

Cualquier dependencia de biblioteca transitiva de estas dependencias directas se vinculará a esta biblioteca compartida, siempre que no haya sido vinculada por un cc_shared_library en dynamic_deps.

Durante el análisis, la implementación de reglas considerará que la biblioteca compartida exportó cualquier destino que se enumera en deps a fin de generar errores cuando varios cc_shared_libraries exportan los mismos destinos. La implementación de la regla no se encarga de informar al vinculador sobre qué símbolos debe exportar el objeto compartido. El usuario debe encargarse de esto a través de secuencias de comandos del vinculador o declaraciones de visibilidad en el código fuente.

La implementación también activará errores cada vez que la misma biblioteca esté vinculada de forma estática a más de un cc_shared_library. Para evitar esto, agrega "LINKABLE_MORE_THAN_ONCE" a cc_library.tags o agrega la `cc_library` como exportación de una de las bibliotecas compartidas a fin de que una pueda convertirse en una dynamic_dep de la otra.

additional_linker_inputs

List of labels; optional

Cualquier archivo adicional que quieras pasar al vinculador, por ejemplo, las secuencias de comandos del vinculador. Debe pasar por separado cualquier marca de vinculador que el vinculador necesite para conocer este archivo. Puedes hacerlo mediante el atributo user_link_flags.
dynamic_deps

List of labels; optional

Estas son otras cc_shared_library dependencias de las que depende el objetivo actual.

La implementación de cc_shared_library usará la lista de dynamic_deps (de forma transitiva, es decir, también el dynamic_deps del dynamic_deps actual del destino) para decidir qué cc_libraries del deps transitivo no debería vincularse porque un cc_shared_library diferente ya lo proporciona.

exports_filter

List of strings; optional

Este atributo contiene una lista de destinos que la biblioteca compartida actual declara que se exportaron.

Ya se entiende que la biblioteca compartida exportó deps de destino. Este atributo debe usarse para enumerar todos los destinos que exporta la biblioteca compartida, pero que son dependencias transitivas de deps.

Ten en cuenta que, en realidad, este atributo no agrega un perímetro de dependencia a esos objetivos. En su lugar, el borde perimetral debe ser creado por deps. Las entradas de este atributo son solo strings. Ten en cuenta que, cuando se establece un objetivo en este atributo, se considera una declaración de que la biblioteca compartida exporta los símbolos de ese destino. La lógica de cc_shared_library no controla en realidad el vinculador para determinar qué símbolos se deben exportar.

Se permite la siguiente sintaxis:

//foo:__package__ para justificar cualquier objetivo en foo/BUILD

//foo:__subpackages__ para incluir cualquier destino en foo/BUILD o cualquier otro paquete debajo de foo/ como foo/bar/BUILD

shared_lib_name

String; optional

De forma predeterminada, cc_shared_library usará un nombre para el archivo de salida de la biblioteca compartida según el nombre del destino y la plataforma. Esto incluye una extensión y, a veces, un prefijo. En ocasiones, es posible que no desees usar el nombre predeterminado, por ejemplo, cuando cargas bibliotecas compartidas de C++ para Python, no se desea usar el prefijo predeterminado de lib*. En ese caso, puedes usar este atributo para elegir un nombre personalizado.

List of strings; optional

Cualquier marca adicional que desee pasar al vinculador. Por ejemplo, para hacer que el vinculador conozca una secuencia de comandos del vinculador pasada a través de additional_linker_inputs, puedes usar lo siguiente:
         cc_shared_library(
            name = "foo_shared",
            additional_linker_inputs = select({
              "//src/conditions:linux": [
                ":foo.lds",
                ":additional_script.txt",
              ],
              "//conditions:default": []}),
            user_link_flags = select({
              "//src/conditions:linux": [
                "-Wl,-rpath,kittens",
                "-Wl,--version-script=$(location :foo.lds)",
                "-Wl,--script=$(location :additional_script.txt)",
              ],
              "//conditions:default": []}),
              ...
         )
        
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.

sugerencias_de_precarga

Ver el origen de las reglas
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

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

perfil_fdo

Ver el origen de las reglas
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 específica. 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

Es un nombre único para este destino.

absolute_path_profile

String; optional

Ruta de acceso absoluta al perfil de FDO. El archivo FDO solo puede tener la extensión .afdo.
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 perfil de LLVM no indexado, .profdata para perfil de LLVM indexado, .zip que contiene un perfil de LLVM declarado, .afdo para perfil AutoFDO o .xfdo para perfil XBinary. La etiqueta también puede apuntar a una regla fdo_Absolute_path_profile.
proto_profile

Label; optional

Etiqueta del perfil de protobuf.

propulsor

Ver el origen de las reglas
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 Propeller 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

Es un nombre único para este destino.

ld_profile

Label; optional

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

Cc_prueba

Ver el origen de las reglas
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

Es un nombre único para este destino.

deps

List of labels; optional

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

Pueden ser objetivos cc_library o objc_library.

srcs

List of labels; optional

Es la lista de archivos C y C++ que se procesan para crear el destino. Estos son archivos fuente y de encabezado C/C++, ya sea 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 se encuentra en el outs de alguna otra regla, esta dependerá automáticamente de esa otra regla.

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

Se deben mencionar todos los archivos #include en el atributo srcs de esta regla o en el atributo hdrs de 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 los encabezados restantes asociados con las fuentes de esta regla que se enumeran en srcs. Consulta "Verificación de inclusión de encabezados" para obtener una descripción más detallada.

Si el nombre de una regla está en srcs, esta regla depende automáticamente de esa. 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, se vinculan.

Tipos de archivos 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, .H
  • Armador 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 cualquier regla que produzca esos archivos. Las diferentes extensiones denotan diferentes 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 C++.

Por ejemplo, se pueden proporcionar archivos .res compilados de Windows 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 de "Make variable" y a la asignación de token de shell Bourne.

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

Si el paquete declara el no_copts_tokenization feature, la asignación de token de shell Bourne se aplica solo a las strings que consisten en 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 variable"Make" y a la asignación de token a shell de Bourne. Cada string, que debe consistir en un solo token de shell de Bourne, está precedida por -D y se agrega a la línea de comandos de compilación a este destino, así como a cada regla que depende de ella. Ten mucho cuidado, ya que esto puede tener efectos de gran alcance. En caso de duda, agrega valores definidos a local_defines.
includes

List of strings; optional

Lista de los dir. de inclusión que se agregarán a la línea de compilación.

Sujeto a la sustitución "Make variable". Cada string se antepone con -isystem y se agrega a COPTS. A diferencia de COPTS, estas marcas se agregan para esta regla y todas las reglas que dependen de ella. Nota: No son las reglas de las que depende. Ten mucho cuidado, ya que esto puede tener efectos de gran alcance. Cuando tengas dudas, agrega las marcas “-I” a COPTS.

Los encabezados deben agregarse a src o hdr; de lo contrario, no estarán disponibles para las reglas dependientes cuando la compilación se coloque en una zona de pruebas (el valor predeterminado).

linkopts

List of strings; optional

Agrega estas marcas al comando del vinculador C++. Sujeto a la sustitución de la variable"Make", la asignación de token a la shell de 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 un destino en deps. La lista de archivos generados por 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 está habilitada y es un objeto binario o una prueba, esta opción indica a la herramienta de compilación que se vincule en .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 las bibliotecas para las que no hay una biblioteca estática. Por lo tanto, el ejecutable resultante seguirá vinculado de forma dinámica, por lo que solo será mayormente estático.

Existen tres maneras diferentes de vincular un ejecutable:

  • STATIC 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”.
    Este modo se habilita si especificas fully_static_link en el atributo features.
  • Estadísticas, en las que todas las bibliotecas de usuarios están vinculadas de forma estática (si hay una versión estática disponible), pero las bibliotecas del sistema (excepto las bibliotecas de entorno de ejecución C/C++) están vinculadas de forma dinámica, p.ej., "gcc foo.o libfoo.a libbaz.a -lm".
    Este modo se habilita si especificas linkstatic=True.
  • DYNAMIC, en el que todas las bibliotecas están vinculadas 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 si especificas 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 generará ningún .so. linkstatic=False no evita 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 bibliotecas compartidas de dependencia 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 variable"Make" y a la asignación de token a shell de Bourne. Cada string, que debe consistir en un solo token de shell de Bourne, está precedida por -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++ se vinculan con //tools/cpp:malloc, que es una biblioteca vacía, por lo que el objeto binario termina usando malloc de libc. Esta etiqueta debe hacer referencia a un cc_library. Si la compilación es para una regla que no sea de C++, esta opción no tiene efecto. El valor de este atributo se ignora si se especifica linkshared=True.

nocopts

String; optional

Quita las opciones de coincidencia 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 a los efectos de compilar esta regla. Rara vez se necesita este atributo.
stamp

Integer; optional; default is 0

Si se debe codificar información de compilación en el objeto binario Valores posibles:
  • stamp = 1: Siempre sella la información de compilación en el objeto binario, incluso en las compilaciones de --nostamp. Se debe evitar esta configuración, ya que podría cerrar el almacenamiento en caché remoto para el objeto binario y cualquier acción descendente que dependa de él.
  • stamp = 0: Reemplaza siempre la información de compilación por valores constantes. Esto brinda un buen almacenamiento en caché de resultados de compilación.
  • stamp = -1: La marca --[no]stamp controla la incorporación de información de compilación.

Los objetos binarios con sellos 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_cadena

Ver el origen de las reglas
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:

  • Recopilar 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. Por lo general, estos son grupos de archivos que globalizan todos los archivos necesarios.
  • Generar líneas de comandos correctas para acciones de C++ Puedes hacerlo con el proveedor CcToolchainConfigInfo (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 obtener documentación elaborada sobre la configuración de la cadena de herramientas de C++ y la selección de la cadena de herramientas.

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

Argumentos

Atributos
name

Name; required

Es un nombre único para este destino.

all_files

Label; required

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 muestran 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 de vínculo, por lo que toma all_files).

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

ar_files

Label; optional

Recopilación de todos los artefactos de cc_toolchain necesarios para las acciones de archivo.

as_files

Label; optional

Es una colección de todos los artefactos de 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á una noop después de la migración de CROSSTOOL a Starlark y se quitará de #7075.

Cuando esté configurada, se usará para realizar la selección crosstool_config.toolchain. Esta tendrá prioridad sobre la opción --cpu Bazel.

compiler_files

Label; required

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

Label; optional

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

Label; optional

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

String; optional; nonconfigurable

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

Cuando esté configurada, se usará para realizar la selección crosstool_config.toolchain. Esta tendrá prioridad sobre la opción --cpu Bazel.

dwp_files

Label; required

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

Label; optional

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

Se usará cuando se habilite la función “static_link_cpp_runtimes” y vinculemos las dependencias de manera dinámica.

exec_transition_for_inputs

Boolean; optional; default is True

Se establece en True 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

Es una colección de artefactos para libc que se pasan como entradas a acciones de compilación o vinculación.
linker_files

Label; required

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

Label; optional

Artefacto de mapa del módulo que se usará para compilaciones modulares.
objcopy_files

Label; required

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

Label; optional

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

Se usará cuando se habilite la función “static_link_cpp_runtimes” y vinculemos las dependencias de manera estática.

strip_files

Label; required

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

Boolean; optional; default is False

Se establece en 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 vincular acciones.
toolchain_config

Label; required

La etiqueta de la regla que proporciona cc_toolchain_config_info.
toolchain_identifier

String; optional; nonconfigurable

El identificador que se usa para hacer coincidir este cc_toolchain con el crosstool_config.toolchain correspondiente.

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

cc_cadena_paquete

Ver el origen de las reglas
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 según las opciones --cpu y --compiler que se pasan a Bazel.

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

Argumentos

Atributos
name

Name; required

Es un nombre único para este destino.

toolchains

Dictionary mapping strings to labels; required; nonconfigurable

Un mapa de strings "<cpu>" o "<cpu>|<compiler>" a una etiqueta cc_toolchain "<cpu>" se usará cuando solo se pase --cpu a Bazel, y se usará "<cpu>|<compiler>" 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",
            },
          )