Reglas C y C++

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

Reglas

cc_binary

Ver la fuente de la regla
cc_binary(name, deps, srcs, data, additional_linker_inputs, args, compatible_with, conlyopts, copts, cxxopts, defines, deprecation, distribs, dynamic_deps, env, exec_compatible_with, exec_properties, features, hdrs_check, includes, licenses, link_extra_lib, linkopts, linkshared, linkstatic, local_defines, malloc, module_interfaces, nocopts, output_licenses, reexport_deps, restricted_to, stamp, tags, target_compatible_with, testonly, toolchains, visibility, win_def_file)

Produce un objeto binario ejecutable.


El name del destino debe ser el mismo que el nombre del archivo fuente que es el punto de entrada principal de la aplicación (menos la extensión). Por ejemplo, si tu punto de entrada está en main.cc, tu nombre debería ser main.

Objetivos de salida implícitos

  • name.stripped (solo se compila si se solicita de forma explícita): Es una versión despojada 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 con --stripopt=-foo.
  • name.dwp (solo se compila 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

Nombre: Obligatorio

Un nombre único para este objetivo.

deps

Es una lista de etiquetas. El valor predeterminado es [].

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

Pueden ser objetivos cc_library o objc_library.

También se permite colocar secuencias de comandos del vinculador (.lds) en dependencias y hacer referencia a ellas en linkopts.
srcs

Es una lista de etiquetas. El valor predeterminado es [].

Es la lista de archivos C y C++ que se procesan para crear el destino de la biblioteca. Son archivos fuente y de encabezado de 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 está en el outs de alguna otra regla, este cc_library dependerá automáticamente de esa otra regla.

Los archivos de ensamblador puros (.s, .asm) no se procesan previamente y, por lo general, se compilan con el ensamblador. Los archivos de ensamblado procesados previamente (.S) se procesan previamente y, por lo general, se compilan con el compilador C/C++.

No se compilará un archivo .h, pero estará disponible para que las fuentes lo incluyan en esta regla. Tanto los archivos .cc como los archivos .h pueden incluir directamente los encabezados que se enumeran en estos srcs o en el hdrs de esta regla o cualquier regla que se enumere en el argumento deps.

Todos los archivos #included deben mencionarse en el atributo hdrs de esta o en las reglas cc_library a las que se hace referencia, o deben aparecer en srcs si son privados para esta biblioteca. Consulta "Verificación de inclusión de encabezados" para obtener una descripción más detallada.

Los archivos .so, .lo y .a son archivos precompilados. Es posible que tu biblioteca tenga estos elementos como srcs si usa código de terceros para el que no tenemos código fuente.

Si el atributo srcs incluye la etiqueta de otra regla, cc_library usará los archivos de salida de esa regla como archivos de origen para compilar. Esto es útil para la generación única de código fuente (para un uso más que ocasional, es mejor implementar una clase de regla Starlark y usar la API de cc_common).

Tipos de archivos srcs permitidos:

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

… y cualquier regla que produzca esos archivos (p. ej., cc_embed_data). Las diferentes extensiones denotan diferentes lenguajes de programación de acuerdo con la convención de gcc.

data

Es una lista de etiquetas. El valor predeterminado es [].

Es la lista de archivos que necesita esta biblioteca durante el tiempo de ejecución. Consulta los comentarios generales sobre data en Atributos típicos definidos por la mayoría de las reglas de compilación.

Si un data es el nombre de un archivo generado, esta regla cc_library depende automáticamente de la regla de generación.

Si un data es un nombre de regla, esta regla cc_library depende automáticamente de esa regla, y el outs de esa regla se agrega automáticamente a los archivos de datos de esta cc_library.

Tu código C++ puede acceder a estos archivos de datos de la siguiente manera:


  const std::string path = devtools_build::GetDataDependencyFilepath(
      "my/test/data/file");
additional_linker_inputs

Es una lista de etiquetas. El valor predeterminado es [].

Pasa estos archivos al comando del vinculador C++.

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

conlyopts

Es una lista de cadenas. El valor predeterminado es [].

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

Es una lista de cadenas. El valor predeterminado es [].

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

Cada cadena de este atributo se agrega en el orden determinado a COPTS antes de compilar el destino binario. Las marcas solo tienen efecto para compilar este objetivo, no para sus dependencias, así que ten cuidado con los archivos de encabezado incluidos en otro lugar. Todas las rutas de acceso deben estar relacionadas con el espacio de trabajo, no con el paquete actual. Este atributo no debería ser necesario fuera de third_party.

Si el paquete declara la función no_copts_tokenization, la tokenización de shell de Bourne se aplica solo a cadenas que consisten en una sola variable "Make".

cxxopts

Es una lista de cadenas. El valor predeterminado es [].

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

Es una lista de cadenas. El valor predeterminado es [].

Es la lista de definiciones que se agregarán a la línea de compilación. Está sujeto a la sustitución de la variable “Make” y a la tokenización de Bourne Shell. Cada cadena, que debe consistir en un solo token de shell de Bourne, se antepone con -D y se agrega a la línea de comandos de compilación a este destino, así como a cada regla que depende de él. Ten mucho cuidado, ya que esto puede tener efectos de gran alcance. Si tienes dudas, agrega valores definidos a local_defines.
dynamic_deps

Es una lista de etiquetas. El valor predeterminado es [].

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

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

hdrs_check

Cadena; el valor predeterminado es ""

Obsoleto, no se realiza ninguna acción.
includes

Es una lista de cadenas. El valor predeterminado es [].

Es la lista de directorios de inclusión que se agregarán a la línea de compilación. Sujeto a la sustitución de "Make variable". Cada cadena se antepone con la ruta de acceso del paquete y se pasa a la cadena de herramientas de C++ para su expansión a través de la función CROSSTOOL "include_paths". Una cadena de herramientas que se ejecuta en un sistema POSIX con definiciones de funciones típicas producirá -isystem path_to_package/include_entry. Esto solo debe usarse para bibliotecas de terceros que no cumplan con el estilo de Google de escribir sentencias #include. A diferencia de COPTS, estas marcas se agregan para esta regla y 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 marcas "-I" a COPTS.

Las rutas de acceso include agregadas incluirán archivos generados y archivos del árbol de fuentes.

Etiqueta (Label); el valor predeterminado es "@bazel_tools//tools/cpp:link_extra_lib"

Controla la vinculación de bibliotecas adicionales.

De forma predeterminada, los objetos binarios de C++ se vinculan con //tools/cpp:link_extra_lib, que, a su vez, depende de la marca de etiqueta //tools/cpp:link_extra_libs. Sin establecer la marca, esta biblioteca está vacía de forma predeterminada. Establecer la marca de etiqueta permite vincular dependencias opcionales, como anulaciones para símbolos débiles, interceptores para funciones de bibliotecas compartidas o bibliotecas de tiempo de ejecución especiales (para reemplazos de malloc, prefiere malloc o --custom_malloc). Si estableces este atributo en None, se inhabilita este comportamiento.

linkopts

Es una lista de cadenas. El valor predeterminado es [].

Agrega estas marcas al comando del vinculador de C++. Sujeto a la sustitución de la variable"Make", la tokenización de Bourne Shell y la expansión de etiquetas. Cada cadena 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 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

Es un valor booleano; el valor predeterminado es False.

Crea 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 cargarse en, por ejemplo, un programa Java. Sin embargo, a los efectos de la compilación, nunca se vinculará al objeto binario dependiente, ya que se supone que las bibliotecas compartidas compiladas con una regla cc_binary solo se cargan de forma manual por otros programas, por lo que no se debe considerar un sustituto de la regla cc_library. Por motivos de escalabilidad, te recomendamos que evites este enfoque por completo y que, en su lugar, dejes que java_library dependa de las reglas de cc_library.

Si especificas linkopts=['-static'] y linkshared=True, obtienes una sola unidad completamente independiente. Si especificas linkstatic=True y linkshared=True, obtienes una sola unidad, en su mayoría independiente.

linkstatic

Es un valor booleano; el valor predeterminado es True.

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

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

Si está habilitada y se trata de un objeto binario o de prueba, esta opción le indica a la herramienta de compilación que vincule .a en lugar de .so para las bibliotecas del usuario siempre que sea posible. Las bibliotecas del sistema, como libc (pero no las bibliotecas del entorno de ejecución de C/C++, consulta a continuación), aún se vinculan 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á mayoritariamente estático.

En realidad, existen tres formas diferentes de vincular un ejecutable:

  • STATIC con la función fully_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, especifica fully_static_link en el atributo features.
  • STATIC, en el que todas las bibliotecas del usuario se vinculan de forma estática (si hay una versión estática disponible), pero las bibliotecas del sistema (excepto las bibliotecas del tiempo de ejecución de C/C++) se vinculan de forma dinámica, p.ej., "gcc foo.o libfoo.a libbaz.a -lm".
    Para habilitar este modo, especifica 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".
    Para habilitar este modo, especifica linkstatic=False.

Si el atributo linkstatic o fully_static_link en features se usa fuera de //third_party, incluye un comentario cerca de la regla para explicar el motivo.

El atributo linkstatic tiene un significado diferente si se usa en una regla cc_library(). Para una biblioteca de C++, linkstatic=True indica que solo se permite la vinculación estática, por lo que no se producirá ningún .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.

Debe haber muy poco código compilado con linkstatic=False en producción. Si es linkstatic=False, la herramienta de compilación creará symlinks a las bibliotecas compartidas de las que se depende en el área *.runfiles.

local_defines

Es una lista de cadenas. El valor predeterminado es [].

Es la lista de definiciones que se agregarán a la línea de compilación. Está sujeto a la sustitución de la variable “Make” y a la tokenización de Bourne Shell. Cada cadena, que debe consistir en un solo token de shell de Bourne, se antepone con -D y se agrega a la línea de comandos de compilación para este destino, pero no a sus elementos dependientes.
malloc

Etiqueta (Label); el valor predeterminado es "@bazel_tools//tools/cpp:malloc"

Anula la dependencia predeterminada en 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 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.

module_interfaces

Es una lista de etiquetas. El valor predeterminado es [].

La lista de archivos se considera la interfaz de módulos C++20.

El estándar C++ no tiene restricciones sobre la extensión de archivo de interfaz de módulo.

  • Clang usa cppm
  • GCC puede usar cualquier extensión de archivo fuente.
  • MSVC usa ixx

El uso está protegido por la marca --experimental_cpp_modules.

nocopts

Cadena; el valor predeterminado es ""

Quita las opciones coincidentes del comando de compilación de C++. Está 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. Este atributo no debería ser necesario ni usarse fuera de third_party. Los valores no se procesan previamente de ninguna manera, excepto por la sustitución de variables "Make".
reexport_deps

Es una lista de etiquetas. El valor predeterminado es [].

stamp

Número entero (el valor predeterminado es -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 binario, incluso en las compilaciones de --nostamp. Se debe evitar esta configuración, ya que puede finalizar la caché remota del objeto binario y cualquier acción descendente que dependa de ella.
  • stamp = 0: Siempre reemplaza la información de compilación por valores constantes. Esto proporciona una buena almacenamiento en caché de los resultados de la compilación.
  • stamp = -1: La incorporación de información de compilación está controlada por la marca --[no]stamp.

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

win_def_file

Etiqueta (Label); el valor predeterminado es None

Es el archivo DEF de Windows que se pasará al vinculador.

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

cc_import

Ver la fuente de la regla
cc_import(name, deps, data, hdrs, alwayslink, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, includes, interface_library, linkopts, objects, pic_objects, pic_static_library, restricted_to, shared_library, static_library, system_provided, tags, target_compatible_with, testonly, toolchains, visibility)

Las reglas cc_import permiten que los usuarios importen bibliotecas C/C++ precompiladas.

Los siguientes son los casos de uso típicos:
1. Vincula 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. Vincula una biblioteca compartida (Unix)

cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  shared_library = "libmylib.so",
)
3. Vincula una biblioteca compartida con la biblioteca de interfaz

En Unix:


cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  # libmylib.ifso is an interface library for libmylib.so which will be passed to linker
  interface_library = "libmylib.ifso",
  # libmylib.so will be available for runtime
  shared_library = "libmylib.so",
)

En 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. Vincula una biblioteca compartida con system_provided=True

En Unix:


cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  interface_library = "libmylib.ifso", # Or we can also use libmylib.so as its own interface library
  # libmylib.so is provided by system environment, for example it can be found in LD_LIBRARY_PATH.
  # This indicates that Bazel is not responsible for making libmylib.so available.
  system_provided = 1,
)

En 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",
)

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",
)

El resto es el mismo en Unix y Windows:


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

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

cc_import admite un atributo include. 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

Nombre: Obligatorio

Un nombre único para este objetivo.

deps

Es una lista de etiquetas. El valor predeterminado es [].

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

Es una lista de etiquetas. El valor predeterminado es [].

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

Es un valor booleano; el valor predeterminado es False.

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

Si alwayslink no funciona con VS 2017 en Windows, es debido a un problema conocido. Actualiza tu VS 2017 a la versión más reciente.

includes

Es una lista de cadenas. El valor predeterminado es [].

Es la lista de directorios de inclusión que se agregarán a la línea de compilación. Sujeto a la sustitución de "Make variable". Cada cadena se antepone con la ruta de acceso del paquete y se pasa a la cadena de herramientas de C++ para su expansión a través de la función CROSSTOOL "include_paths". Una cadena de herramientas que se ejecuta en un sistema POSIX con definiciones de funciones típicas producirá -isystem path_to_package/include_entry. Esto solo debe usarse para bibliotecas de terceros que no cumplan con el estilo de Google de escribir sentencias #include. A diferencia de COPTS, estas marcas se agregan para esta regla y 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 marcas "-I" a COPTS.

La ruta de acceso include predeterminada no incluye los archivos generados. Si necesitas #include un archivo de encabezado generado, indícalo en srcs.

interface_library

Etiqueta (Label); el valor predeterminado es None

Una sola biblioteca de interfaz para vincular la biblioteca compartida.

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

linkopts

Es una lista de cadenas. El valor predeterminado es [].

Agrega estas marcas al comando del vinculador de C++. Sujeto a la sustitución de la variable"Make", la tokenización de Bourne Shell y la expansión de etiquetas. Cada cadena 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 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.

objects

Es una lista de etiquetas. El valor predeterminado es [].

pic_objects

Es una lista de etiquetas. El valor predeterminado es [].

pic_static_library

Etiqueta (Label); el valor predeterminado es None

shared_library

Etiqueta (Label); el valor predeterminado es None

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 archivos permitidos: .so, .dll o .dylib

static_library

Etiqueta (Label); el valor predeterminado es None

Una sola biblioteca estática precompilada.

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

system_provided

Es un valor booleano; el valor predeterminado es 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

Ver la fuente de la regla
cc_library(name, deps, srcs, data, hdrs, additional_compiler_inputs, additional_linker_inputs, alwayslink, compatible_with, conlyopts, copts, cxxopts, defines, deprecation, distribs, exec_compatible_with, exec_properties, features, hdrs_check, implementation_deps, include_prefix, includes, licenses, linkopts, linkstamp, linkstatic, local_defines, module_interfaces, restricted_to, strip_include_prefix, tags, target_compatible_with, testonly, textual_hdrs, toolchains, visibility, win_def_file)

Usa cc_library() para bibliotecas compiladas en C++. El resultado es .so, .lo o .a, según lo que se necesite.

Si compilas algo con vinculación estática que depende de un cc_library, el resultado de una regla de biblioteca de dependencia es el archivo .a. Si especificas alwayslink=True, obtienes el archivo .lo.

El nombre real del archivo de salida es libfoo.so para la biblioteca compartida, donde foo es el nombre de la regla. Los otros tipos de bibliotecas terminan con .lo y .a, respectivamente. Si necesitas un nombre de biblioteca compartida específico, por ejemplo, para definir un módulo de Python, usa una genrule para copiar la biblioteca con el nombre deseado.

Verificación de inclusión de encabezados

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

En el caso de 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 los archivos en hdrs y srcs de las reglas cc_* que enumeran la biblioteca en su deps. Los encabezados en srcs solo se deben incluir directamente desde los archivos en hdrs y srcs de la biblioteca. Cuando decidas si colocar un encabezado en hdrs o srcs, debes preguntarte si deseas que los consumidores de esta biblioteca puedan incluirlo directamente. Esta es aproximadamente la misma decisión que la que se toma 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 a la prueba deben aparecer directamente en 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.

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 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 que se permita, se debe agregar baz a deps de foo.

Bazel depende de la compatibilidad con la cadena de herramientas para aplicar las reglas de verificación de inclusión. La cadena de herramientas debe admitir la función layering_check y solicitarla 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.

Ejemplos


cc_library(
    name = "ast_inspector_lib",
    srcs = ["ast_inspector_lib.cc"],
    hdrs = ["ast_inspector_lib.h"],
    visibility = ["//visibility:public"],
    deps = ["//third_party/llvm/llvm/tools/clang:frontend"],
    # alwayslink as we want to be able to call things in this library at
    # debug time, even if they aren't used anywhere in the code.
    alwayslink = 1,
)

El siguiente ejemplo proviene de third_party/python2_4_3/BUILD. Parte del código usa la biblioteca dl (para cargar otra biblioteca dinámica), por lo que esta regla especifica la opción de vínculo -ldl para vincular la biblioteca dl.


cc_library(
    name = "python2_4_3",
    linkopts = [
        "-ldl",
        "-lutil",
    ],
    deps = ["//third_party/expat"],
)

El siguiente ejemplo proviene de third_party/kde/BUILD. Mantenemos los archivos .so precompilados en el depósito. Los archivos de encabezado se encuentran en un subdirectorio llamado include.


cc_library(
    name = "kde",
    srcs = [
        "lib/libDCOP.so",
        "lib/libkdesu.so",
        "lib/libkhtml.so",
        "lib/libkparts.so",
        ...more .so files...,
    ],
    includes = ["include"],
    deps = ["//third_party/X11"],
)

El siguiente ejemplo proviene de third_party/gles/BUILD. El código de terceros suele necesitar algunos defines y linkopts.


cc_library(
    name = "gles",
    srcs = [
        "GLES/egl.h",
        "GLES/gl.h",
        "ddx.c",
        "egl.c",
    ],
    defines = [
        "USE_FLOAT",
        "__GL_FLOAT",
        "__GL_COMMON",
    ],
    linkopts = ["-ldl"],  # uses dlopen(), dl library
    deps = [
        "es",
        "//third_party/X11",
    ],
)

Argumentos

Atributos
name

Nombre: Obligatorio

Un nombre único para este objetivo.

deps

Es una lista de etiquetas. El valor predeterminado es [].

Es la lista de otras bibliotecas de las que depende el destino de la biblioteca.

Pueden ser objetivos cc_library o objc_library.

Consulta los comentarios generales sobre deps en Atributos típicos definidos por la mayoría de las reglas de compilación.

Estos deben ser nombres de reglas de bibliotecas de C++. Cuando compiles un objeto binario que vincule la biblioteca de esta regla, también vincularás las bibliotecas en deps.

A pesar del nombre “deps”, no todos los clientes de esta biblioteca pertenecen aquí. Las dependencias de datos del tiempo de ejecución pertenecen a data. Los archivos de origen generados por otras reglas pertenecen a srcs.

Para vincular una biblioteca de terceros precompilada, agrega su nombre a srcs.

Para depender de algo sin vincularlo a esta biblioteca, agrega su nombre a data.

srcs

Es una lista de etiquetas. El valor predeterminado es [].

Es la lista de archivos C y C++ que se procesan para crear el destino de la biblioteca. Son archivos fuente y de encabezado de 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 está en el outs de alguna otra regla, este cc_library dependerá automáticamente de esa otra regla.

Los archivos de ensamblador puros (.s, .asm) no se procesan previamente y, por lo general, se compilan con el ensamblador. Los archivos de ensamblado procesados previamente (.S) se procesan previamente y, por lo general, se compilan con el compilador C/C++.

No se compilará un archivo .h, pero estará disponible para que las fuentes lo incluyan en esta regla. Tanto los archivos .cc como los archivos .h pueden incluir directamente los encabezados que se enumeran en estos srcs o en el hdrs de esta regla o cualquier regla que se enumere en el argumento deps.

Todos los archivos #included deben mencionarse en el atributo hdrs de esta o en las reglas cc_library a las que se hace referencia, o deben aparecer en srcs si son privados para esta biblioteca. Consulta "Verificación de inclusión de encabezados" para obtener una descripción más detallada.

Los archivos .so, .lo y .a son archivos precompilados. Es posible que tu biblioteca tenga estos elementos como srcs si usa código de terceros para el que no tenemos código fuente.

Si el atributo srcs incluye la etiqueta de otra regla, cc_library usará los archivos de salida de esa regla como archivos de origen para compilar. Esto es útil para la generación única de código fuente (para un uso más que ocasional, es mejor implementar una clase de regla Starlark y usar la API de cc_common).

Tipos de archivos srcs permitidos:

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

… y cualquier regla que produzca esos archivos (p. ej., cc_embed_data). Las diferentes extensiones denotan diferentes lenguajes de programación de acuerdo con la convención de gcc.

data

Es una lista de etiquetas. El valor predeterminado es [].

Es la lista de archivos que necesita esta biblioteca durante el tiempo de ejecución. Consulta los comentarios generales sobre data en Atributos típicos definidos por la mayoría de las reglas de compilación.

Si un data es el nombre de un archivo generado, esta regla cc_library depende automáticamente de la regla de generación.

Si un data es un nombre de regla, esta regla cc_library depende automáticamente de esa regla, y el outs de esa regla se agrega automáticamente a los archivos de datos de esta cc_library.

Tu código C++ puede acceder a estos archivos de datos de la siguiente manera:


  const std::string path = devtools_build::GetDataDependencyFilepath(
      "my/test/data/file");
hdrs

Es una lista de etiquetas. El valor predeterminado es [].

Es la lista de archivos de encabezado que publica esta biblioteca para que las fuentes la 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 las fuentes los incluyan en esta regla o en reglas dependientes. Los encabezados que no están destinados a ser incluidos por un cliente de esta biblioteca deben aparecer en el atributo srcs, incluso si un encabezado publicado los incluye. Consulta "Verificación de inclusión de encabezados" para obtener una descripción más detallada.

Tipos de archivos headers permitidos: .h, .hh, .hpp y .hxx.

additional_compiler_inputs

Es una lista de etiquetas. El valor predeterminado es [].

Cualquier archivo adicional que quieras pasar a la línea de comandos del compilador, como las listas de entidades ignoradas del validador, por ejemplo. Los archivos especificados aquí se pueden usar en copts con la función $(location).
additional_linker_inputs

Es una lista de etiquetas. El valor predeterminado es [].

Pasa estos archivos al comando del vinculador C++.

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

Es un valor booleano; el valor predeterminado es False.

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

Si alwayslink no funciona con VS 2017 en Windows, es debido a un problema conocido. Actualiza tu VS 2017 a la versión más reciente.

conlyopts

Es una lista de cadenas. El valor predeterminado es [].

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

Es una lista de cadenas. El valor predeterminado es [].

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

Cada cadena de este atributo se agrega en el orden determinado a COPTS antes de compilar el destino binario. Las marcas solo tienen efecto para compilar este objetivo, no para sus dependencias, así que ten cuidado con los archivos de encabezado incluidos en otro lugar. Todas las rutas de acceso deben estar relacionadas con el espacio de trabajo, no con el paquete actual. Este atributo no debería ser necesario fuera de third_party.

Si el paquete declara la función no_copts_tokenization, la tokenización de shell de Bourne se aplica solo a cadenas que consisten en una sola variable "Make".

cxxopts

Es una lista de cadenas. El valor predeterminado es [].

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

Es una lista de cadenas. El valor predeterminado es [].

Es la lista de definiciones que se agregarán a la línea de compilación. Está sujeto a la sustitución de la variable “Make” y a la tokenización de Bourne Shell. Cada cadena, que debe consistir en un solo token de shell de Bourne, se antepone con -D y se agrega a la línea de comandos de compilación a este destino, así como a cada regla que depende de él. Ten mucho cuidado, ya que esto puede tener efectos de gran alcance. Si tienes dudas, agrega valores definidos a local_defines.
hdrs_check

Cadena; el valor predeterminado es ""

Obsoleto, no se realiza ninguna acción.
implementation_deps

Es una lista de etiquetas. El valor predeterminado es [].

Es 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, y no para las bibliotecas que dependen de ella. Las bibliotecas especificadas con implementation_deps aún están vinculadas en los destinos binarios que dependen de esta biblioteca.
include_prefix

Cadena; el valor predeterminado es ""

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

Cuando se establece, se puede acceder a los encabezados del atributo hdrs de esta regla en el valor de este atributo que se agrega al principio de su ruta de acceso relativa al repositorio.

El prefijo del atributo strip_include_prefix se quita antes de agregar este prefijo.

Este atributo solo es legal en third_party.

includes

Es una lista de cadenas. El valor predeterminado es [].

Es la lista de directorios de inclusión que se agregarán a la línea de compilación. Sujeto a la sustitución de "Make variable". Cada cadena se antepone con la ruta de acceso del paquete y se pasa a la cadena de herramientas de C++ para su expansión a través de la función CROSSTOOL "include_paths". Una cadena de herramientas que se ejecuta en un sistema POSIX con definiciones de funciones típicas producirá -isystem path_to_package/include_entry. Esto solo debe usarse para bibliotecas de terceros que no cumplan con el estilo de Google de escribir sentencias #include. A diferencia de COPTS, estas marcas se agregan para esta regla y 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 marcas "-I" a COPTS.

Las rutas de acceso include agregadas incluirán archivos generados y archivos del árbol de fuentes.

linkopts

Es una lista de cadenas. El valor predeterminado es [].

Consulta cc_binary.linkopts. El atributo linkopts también se aplica a cualquier destino que dependa, directa o indirectamente, de esta biblioteca a través de atributos deps (o a través de otros atributos que se tratan de manera similar: el atributo malloc de cc_binary). Los parámetros de vinculación de dependencias tienen prioridad sobre los parámetros de vinculación dependientes (es decir, los parámetros de vinculación de dependencias aparecen más adelante en la línea de comandos). Los parámetros de configuración de vínculos especificados en --linkopt tienen prioridad sobre los parámetros de configuración de vínculos de la regla.

Ten en cuenta que el atributo linkopts solo se aplica cuando se crean archivos .so o ejecutables, no cuando se crean archivos .a o .lo. Por lo tanto, si se establece el atributo linkstatic=True, el atributo linkopts no tiene efecto en la creación de esta biblioteca, solo en otros destinos que dependen de ella.

Además, es importante tener en cuenta que las opciones "-Wl,-soname" o "-Xlinker -soname" no se admiten y nunca deben especificarse en este atributo.

Los archivos .so que producen las reglas cc_library no están vinculados a las bibliotecas de las que dependen. Si intentas crear una biblioteca compartida para usar fuera del repositorio principal, p.ej., para el uso manual con dlopen() o LD_PRELOAD, es mejor usar una regla cc_binary con el atributo linkshared=True. Consulta cc_binary.linkshared.

linkstamp

Etiqueta (Label); el valor predeterminado es None

Compila y vincula simultáneamente el archivo fuente de C++ especificado en el objeto binario final. Este truco es necesario para introducir información de marca de tiempo en objetos binarios. Si compilamos el archivo fuente en un archivo de objeto de la manera habitual, la marca de tiempo sería incorrecta. Una compilación de vínculo de marca no puede incluir ningún conjunto particular de marcas del compilador y, por lo tanto, no debe depender de ningún encabezado, opción del compilador ni de ninguna otra variable de compilación. Esta opción solo debería ser necesaria en el paquete base.
linkstatic

Es un valor booleano; el valor predeterminado es False.

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

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

Si está habilitada y se trata de un objeto binario o de prueba, esta opción le indica a la herramienta de compilación que vincule .a en lugar de .so para las bibliotecas del usuario siempre que sea posible. Las bibliotecas del sistema, como libc (pero no las bibliotecas del entorno de ejecución de C/C++, consulta a continuación), aún se vinculan 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á mayoritariamente estático.

En realidad, existen tres formas diferentes de vincular un ejecutable:

  • STATIC con la función fully_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, especifica fully_static_link en el atributo features.
  • STATIC, en el que todas las bibliotecas del usuario se vinculan de forma estática (si hay una versión estática disponible), pero las bibliotecas del sistema (excepto las bibliotecas del tiempo de ejecución de C/C++) se vinculan de forma dinámica, p.ej., "gcc foo.o libfoo.a libbaz.a -lm".
    Para habilitar este modo, especifica 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".
    Para habilitar este modo, especifica linkstatic=False.

Si el atributo linkstatic o fully_static_link en features se usa fuera de //third_party, incluye un comentario cerca de la regla para explicar el motivo.

El atributo linkstatic tiene un significado diferente si se usa en una regla cc_library(). Para una biblioteca de C++, linkstatic=True indica que solo se permite la vinculación estática, por lo que no se producirá ningún .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.

Debe haber muy poco código compilado con linkstatic=False en producción. Si es linkstatic=False, la herramienta de compilación creará symlinks a las bibliotecas compartidas de las que se depende en el área *.runfiles.

local_defines

Es una lista de cadenas. El valor predeterminado es [].

Es la lista de definiciones que se agregarán a la línea de compilación. Está sujeto a la sustitución de la variable “Make” y a la tokenización de Bourne Shell. Cada cadena, que debe consistir en un solo token de shell de Bourne, se antepone con -D y se agrega a la línea de comandos de compilación para este destino, pero no a sus elementos dependientes.
module_interfaces

Es una lista de etiquetas. El valor predeterminado es [].

La lista de archivos se considera la interfaz de módulos C++20.

El estándar C++ no tiene restricciones sobre la extensión de archivo de interfaz de módulo.

  • Clang usa cppm
  • GCC puede usar cualquier extensión de archivo fuente.
  • MSVC usa ixx

El uso está protegido por la marca --experimental_cpp_modules.

strip_include_prefix

Cadena; el valor predeterminado es ""

Es el prefijo que se quitará de las rutas de los encabezados de esta regla.

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

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

El prefijo en el atributo include_prefix se agrega después de que se quita este prefijo.

Este atributo solo es legal en third_party.

textual_hdrs

Es una lista de etiquetas. El valor predeterminado es [].

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

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

win_def_file

Etiqueta (Label); el valor predeterminado es None

Es el archivo DEF de Windows que se pasará al vinculador.

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

cc_shared_library

Ver la fuente de la regla
cc_shared_library(name, deps, additional_linker_inputs, compatible_with, deprecation, distribs, dynamic_deps, exec_compatible_with, exec_properties, experimental_disable_topo_sort_do_not_use_remove_before_7_0, exports_filter, features, restricted_to, roots, shared_lib_name, static_deps, tags, target_compatible_with, testonly, toolchains, user_link_flags, visibility, 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 vincula de forma estática foo y baz, y este último es una dependencia transitiva. No vincula bar porque ya lo proporciona de forma dinámica el bar_shared de dynamic_dep.

foo_shared usa un archivo de secuencia de comandos del vinculador *.lds 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 exporta para generar 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, Bazel supone durante el análisis que foo_shared está exportando foo. No se supone que foo_shared exporte baz. Se supone que todos los destinos que coincide con el exports_filter también se exportan.

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

Debido al atributo shared_lib_name, el archivo que produce 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 evitar que las bibliotecas se exporten en una de las dependencias de cc_shared_library.

Esto sucederá cada vez que crees un cc_shared_library nuevo con dos dependencias cc_shared_library diferentes que vinculen el mismo objetivo de forma estática. Es 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, el que aún la vincula debe exportar la biblioteca para que el que no la vincula mantenga la visibilidad de los símbolos. Otra forma es extraer una tercera biblioteca que exporte el destino. Una tercera forma es etiquetar el cc_library culpable con LINKABLE_MORE_THAN_ONCE, pero esta solución debería ser poco frecuente y debes asegurarte de que el cc_library sea realmente seguro para vincularlo más de una vez.

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

Esto 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 está vinculada 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 precompilada, no es necesario que se vincule de forma estática 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, el cc_library debe depender de ella directamente.

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

Verás este error si, en la regla actual, declaras que exportas un objetivo que ya exporta una de tus dependencias dinámicas.

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

Argumentos

Atributos
name

Nombre: Obligatorio

Un nombre único para este objetivo.

deps

Es una lista de etiquetas. El valor predeterminado es [].

Son bibliotecas de nivel superior que se vincularán de forma estática y sin condiciones 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 y cuando no las haya vinculado un cc_shared_library en dynamic_deps.

Durante el análisis, la implementación de la regla considerará que la biblioteca compartida exporta cualquier destino que se enumere en deps para mostrar errores cuando varios cc_shared_libraries exporten 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 se vincule de forma estática a más de un cc_shared_library. Esto se puede evitar agregando "LINKABLE_MORE_THAN_ONCE" a cc_library.tags o enumerando "cc_library" como una exportación de una de las bibliotecas compartidas para que se pueda crear una dynamic_dep de la otra.

additional_linker_inputs

Es una lista de etiquetas. El valor predeterminado es [].

Cualquier archivo adicional que quieras pasar al vinculador, por ejemplo, secuencias de comandos del vinculador Debes pasar por separado las marcas del vinculador que este necesita para estar al tanto de este archivo. Puedes hacerlo a través del atributo user_link_flags.
dynamic_deps

Es una lista de etiquetas. El valor predeterminado es [].

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

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

experimental_disable_topo_sort_do_not_use_remove_before_7_0

Es un valor booleano; el valor predeterminado es False.

exports_filter

Es una lista de cadenas. El valor predeterminado es [].

Este atributo contiene una lista de destinos que se indica que exporta la biblioteca compartida actual.

Se da por sentado que la biblioteca compartida exporta cualquier deps de destino. Este atributo se debe usar para enumerar los destinos que exporta la biblioteca compartida, pero que son dependencias transitivas de deps.

Ten en cuenta que este atributo no agrega un borde de dependencia a esos destinos, sino que deps debe crearlo.Las entradas de este atributo son solo cadenas. Ten en cuenta que, cuando colocas un destino 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 se encarga de indicarle al vinculador qué símbolos se deben exportar.

Se permite la siguiente sintaxis:

//foo:__pkg__ para tener en cuenta cualquier destino en foo/BUILD

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

roots

Es una lista de etiquetas. El valor predeterminado es [].

shared_lib_name

Cadena; el valor predeterminado es ""

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. A veces, es posible que no quieras usar el nombre predeterminado. Por ejemplo, cuando se cargan bibliotecas compartidas de C++ para Python, a menudo no se desea el prefijo lib* predeterminado. En ese caso, puedes usar este atributo para elegir un nombre personalizado.
static_deps

Es una lista de cadenas. El valor predeterminado es [].

Es una lista de cadenas. El valor predeterminado es [].

Cualquier marca adicional que quieras pasar al vinculador Por ejemplo, para que el vinculador reconozca una secuencia de comandos de vinculador que se pasa 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

Etiqueta (Label); el valor predeterminado es None

Es el archivo DEF de Windows que se pasará al vinculador.

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

cc_static_library

Ver la fuente de la regla
cc_static_library(name, deps, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)
Actualmente, esta regla es experimental y solo se puede usar con la marca --experimental_cc_static_library. Produce una biblioteca estática a partir de una lista de destinos y sus dependencias transitivas.

La biblioteca estática resultante contiene los archivos de objetos de los destinos enumerados en deps, así como sus dependencias transitivas, con preferencia por los objetos PIC.

Grupos de salida

linkdeps

Un archivo de texto que contiene las etiquetas de esas dependencias transitivas de los destinos que se enumeran en deps que no aportaron ningún archivo de objeto a la biblioteca estática, pero que proporcionan al menos una biblioteca estática, dinámica o de interfaz. Es posible que la biblioteca estática resultante requiera que estas bibliotecas estén disponibles en el momento de la vinculación.

linkopts

Es un archivo de texto que contiene el linkopts proporcionado por el usuario de todas las dependencias transitivas de los destinos que se enumeran en deps.

Símbolos duplicados

De forma predeterminada, la regla cc_static_library verifica que la biblioteca estática resultante no contenga símbolos duplicados. Si es así, la compilación fallará con un mensaje de error que enumera los símbolos duplicados y los archivos de objetos que los contienen.

Esta verificación se puede inhabilitar por objetivo o por paquete si se configura features = ["-symbol_check"] o de forma global a través de --features=-symbol_check.

Compatibilidad con la cadena de herramientas para symbol_check

Las cadenas de herramientas de C++ configuradas automáticamente que se envían con Bazel admiten la función symbol_check en todas las plataformas. Las cadenas de herramientas personalizadas pueden agregar compatibilidad con él de una de las siguientes maneras:

  • Implementar la acción ACTION_NAMES.validate_static_library y habilitarla con la función symbol_check La herramienta establecida en la acción se invoca con dos argumentos: la biblioteca estática para verificar si hay símbolos duplicados y la ruta de acceso de un archivo que se debe crear si se aprueba la verificación.
  • Tener la función symbol_check agrega marcas de archivador que hacen que la acción de crear la biblioteca estática falle en los símbolos duplicados.

Argumentos

Atributos
name

Nombre: Obligatorio

Un nombre único para este objetivo.

deps

Es una lista de etiquetas. El valor predeterminado es [].

Es la lista de destinos que se combinarán en una biblioteca estática, incluidas todas sus dependencias transitivas.

Las dependencias que no proporcionan ningún archivo de objeto no se incluyen en la biblioteca estática, pero sus etiquetas se recopilan en el archivo que proporciona el grupo de salida linkdeps.

cc_test

Ver la fuente de la regla
cc_test(name, deps, srcs, data, additional_linker_inputs, args, compatible_with, conlyopts, copts, cxxopts, defines, deprecation, distribs, dynamic_deps, env, env_inherit, exec_compatible_with, exec_properties, features, flaky, hdrs_check, includes, licenses, link_extra_lib, linkopts, linkshared, linkstatic, local, local_defines, malloc, module_interfaces, nocopts, reexport_deps, restricted_to, shard_count, size, stamp, tags, target_compatible_with, testonly, timeout, toolchains, visibility, win_def_file)

Una regla cc_test() compila una prueba. Aquí, una prueba es un wrapper binario alrededor de un código de prueba.

De forma predeterminada, las pruebas de C++ se vinculan de forma dinámica.
Para vincular de forma estática una prueba de unidad, especifica linkstatic=True. Sería bueno que comentaras por qué tu prueba necesita linkstatic. Es probable que no sea obvio.

Objetivos de salida implícitos

  • name.stripped (solo se compila si se solicita de forma explícita): Es una versión despojada 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 con --stripopt=-foo.
  • name.dwp (solo se compila 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.

Consulta los argumentos cc_binary(), excepto que el argumento stamp se establece en 0 de forma predeterminada para las pruebas y que cc_test tiene atributos adicionales comunes a todas las reglas de prueba (*_test).

Argumentos

Atributos
name

Nombre: Obligatorio

Un nombre único para este objetivo.

deps

Es una lista de etiquetas. El valor predeterminado es [].

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

Pueden ser objetivos cc_library o objc_library.

También se permite colocar secuencias de comandos del vinculador (.lds) en dependencias y hacer referencia a ellas en linkopts.
srcs

Es una lista de etiquetas. El valor predeterminado es [].

Es la lista de archivos C y C++ que se procesan para crear el destino de la biblioteca. Son archivos fuente y de encabezado de 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 está en el outs de alguna otra regla, este cc_library dependerá automáticamente de esa otra regla.

Los archivos de ensamblador puros (.s, .asm) no se procesan previamente y, por lo general, se compilan con el ensamblador. Los archivos de ensamblado procesados previamente (.S) se procesan previamente y, por lo general, se compilan con el compilador C/C++.

No se compilará un archivo .h, pero estará disponible para que las fuentes lo incluyan en esta regla. Tanto los archivos .cc como los archivos .h pueden incluir directamente los encabezados que se enumeran en estos srcs o en el hdrs de esta regla o cualquier regla que se enumere en el argumento deps.

Todos los archivos #included deben mencionarse en el atributo hdrs de esta o en las reglas cc_library a las que se hace referencia, o deben aparecer en srcs si son privados para esta biblioteca. Consulta "Verificación de inclusión de encabezados" para obtener una descripción más detallada.

Los archivos .so, .lo y .a son archivos precompilados. Es posible que tu biblioteca tenga estos elementos como srcs si usa código de terceros para el que no tenemos código fuente.

Si el atributo srcs incluye la etiqueta de otra regla, cc_library usará los archivos de salida de esa regla como archivos de origen para compilar. Esto es útil para la generación única de código fuente (para un uso más que ocasional, es mejor implementar una clase de regla Starlark y usar la API de cc_common).

Tipos de archivos srcs permitidos:

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

… y cualquier regla que produzca esos archivos (p. ej., cc_embed_data). Las diferentes extensiones denotan diferentes lenguajes de programación de acuerdo con la convención de gcc.

data

Es una lista de etiquetas. El valor predeterminado es [].

Es la lista de archivos que necesita esta biblioteca durante el tiempo de ejecución. Consulta los comentarios generales sobre data en Atributos típicos definidos por la mayoría de las reglas de compilación.

Si un data es el nombre de un archivo generado, esta regla cc_library depende automáticamente de la regla de generación.

Si un data es un nombre de regla, esta regla cc_library depende automáticamente de esa regla, y el outs de esa regla se agrega automáticamente a los archivos de datos de esta cc_library.

Tu código C++ puede acceder a estos archivos de datos de la siguiente manera:


  const std::string path = devtools_build::GetDataDependencyFilepath(
      "my/test/data/file");
additional_linker_inputs

Es una lista de etiquetas. El valor predeterminado es [].

Pasa estos archivos al comando del vinculador C++.

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

conlyopts

Es una lista de cadenas. El valor predeterminado es [].

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

Es una lista de cadenas. El valor predeterminado es [].

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

Cada cadena de este atributo se agrega en el orden determinado a COPTS antes de compilar el destino binario. Las marcas solo tienen efecto para compilar este objetivo, no para sus dependencias, así que ten cuidado con los archivos de encabezado incluidos en otro lugar. Todas las rutas de acceso deben estar relacionadas con el espacio de trabajo, no con el paquete actual. Este atributo no debería ser necesario fuera de third_party.

Si el paquete declara la función no_copts_tokenization, la tokenización de shell de Bourne se aplica solo a cadenas que consisten en una sola variable "Make".

cxxopts

Es una lista de cadenas. El valor predeterminado es [].

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

Es una lista de cadenas. El valor predeterminado es [].

Es la lista de definiciones que se agregarán a la línea de compilación. Está sujeto a la sustitución de la variable “Make” y a la tokenización de Bourne Shell. Cada cadena, que debe consistir en un solo token de shell de Bourne, se antepone con -D y se agrega a la línea de comandos de compilación a este destino, así como a cada regla que depende de él. Ten mucho cuidado, ya que esto puede tener efectos de gran alcance. Si tienes dudas, agrega valores definidos a local_defines.
dynamic_deps

Es una lista de etiquetas. El valor predeterminado es [].

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

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

hdrs_check

Cadena; el valor predeterminado es ""

Obsoleto, no se realiza ninguna acción.
includes

Es una lista de cadenas. El valor predeterminado es [].

Es la lista de directorios de inclusión que se agregarán a la línea de compilación. Sujeto a la sustitución de "Make variable". Cada cadena se antepone con la ruta de acceso del paquete y se pasa a la cadena de herramientas de C++ para su expansión a través de la función CROSSTOOL "include_paths". Una cadena de herramientas que se ejecuta en un sistema POSIX con definiciones de funciones típicas producirá -isystem path_to_package/include_entry. Esto solo debe usarse para bibliotecas de terceros que no cumplan con el estilo de Google de escribir sentencias #include. A diferencia de COPTS, estas marcas se agregan para esta regla y 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 marcas "-I" a COPTS.

Las rutas de acceso include agregadas incluirán archivos generados y archivos del árbol de fuentes.

Etiqueta (Label); el valor predeterminado es "@bazel_tools//tools/cpp:link_extra_lib"

Controla la vinculación de bibliotecas adicionales.

De forma predeterminada, los objetos binarios de C++ se vinculan con //tools/cpp:link_extra_lib, que, a su vez, depende de la marca de etiqueta //tools/cpp:link_extra_libs. Sin establecer la marca, esta biblioteca está vacía de forma predeterminada. Establecer la marca de etiqueta permite vincular dependencias opcionales, como anulaciones para símbolos débiles, interceptores para funciones de bibliotecas compartidas o bibliotecas de tiempo de ejecución especiales (para reemplazos de malloc, prefiere malloc o --custom_malloc). Si estableces este atributo en None, se inhabilita este comportamiento.

linkopts

Es una lista de cadenas. El valor predeterminado es [].

Agrega estas marcas al comando del vinculador de C++. Sujeto a la sustitución de la variable"Make", la tokenización de Bourne Shell y la expansión de etiquetas. Cada cadena 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 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

Es un valor booleano; el valor predeterminado es False.

Crea 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 cargarse en, por ejemplo, un programa Java. Sin embargo, a los efectos de la compilación, nunca se vinculará al objeto binario dependiente, ya que se supone que las bibliotecas compartidas compiladas con una regla cc_binary solo se cargan de forma manual por otros programas, por lo que no se debe considerar un sustituto de la regla cc_library. Por motivos de escalabilidad, te recomendamos que evites este enfoque por completo y que, en su lugar, dejes que java_library dependa de las reglas de cc_library.

Si especificas linkopts=['-static'] y linkshared=True, obtienes una sola unidad completamente independiente. Si especificas linkstatic=True y linkshared=True, obtienes una sola unidad, en su mayoría independiente.

linkstatic

Es un valor booleano; el valor predeterminado es False.

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

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

Si está habilitada y se trata de un objeto binario o de prueba, esta opción le indica a la herramienta de compilación que vincule .a en lugar de .so para las bibliotecas del usuario siempre que sea posible. Las bibliotecas del sistema, como libc (pero no las bibliotecas del entorno de ejecución de C/C++, consulta a continuación), aún se vinculan 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á mayoritariamente estático.

En realidad, existen tres formas diferentes de vincular un ejecutable:

  • STATIC con la función fully_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, especifica fully_static_link en el atributo features.
  • STATIC, en el que todas las bibliotecas del usuario se vinculan de forma estática (si hay una versión estática disponible), pero las bibliotecas del sistema (excepto las bibliotecas del tiempo de ejecución de C/C++) se vinculan de forma dinámica, p.ej., "gcc foo.o libfoo.a libbaz.a -lm".
    Para habilitar este modo, especifica 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".
    Para habilitar este modo, especifica linkstatic=False.

Si el atributo linkstatic o fully_static_link en features se usa fuera de //third_party, incluye un comentario cerca de la regla para explicar el motivo.

El atributo linkstatic tiene un significado diferente si se usa en una regla cc_library(). Para una biblioteca de C++, linkstatic=True indica que solo se permite la vinculación estática, por lo que no se producirá ningún .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.

Debe haber muy poco código compilado con linkstatic=False en producción. Si es linkstatic=False, la herramienta de compilación creará symlinks a las bibliotecas compartidas de las que se depende en el área *.runfiles.

local_defines

Es una lista de cadenas. El valor predeterminado es [].

Es la lista de definiciones que se agregarán a la línea de compilación. Está sujeto a la sustitución de la variable “Make” y a la tokenización de Bourne Shell. Cada cadena, que debe consistir en un solo token de shell de Bourne, se antepone con -D y se agrega a la línea de comandos de compilación para este destino, pero no a sus elementos dependientes.
malloc

Etiqueta (Label); el valor predeterminado es "@bazel_tools//tools/cpp:malloc"

Anula la dependencia predeterminada en 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 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.

module_interfaces

Es una lista de etiquetas. El valor predeterminado es [].

La lista de archivos se considera la interfaz de módulos C++20.

El estándar C++ no tiene restricciones sobre la extensión de archivo de interfaz de módulo.

  • Clang usa cppm
  • GCC puede usar cualquier extensión de archivo fuente.
  • MSVC usa ixx

El uso está protegido por la marca --experimental_cpp_modules.

nocopts

Cadena; el valor predeterminado es ""

Quita las opciones coincidentes del comando de compilación de C++. Está 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. Este atributo no debería ser necesario ni usarse fuera de third_party. Los valores no se procesan previamente de ninguna manera, excepto por la sustitución de variables "Make".
reexport_deps

Es una lista de etiquetas. El valor predeterminado es [].

stamp

Número entero (el valor predeterminado es 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 binario, incluso en las compilaciones de --nostamp. Se debe evitar esta configuración, ya que puede finalizar la caché remota del objeto binario y cualquier acción descendente que dependa de ella.
  • stamp = 0: Siempre reemplaza la información de compilación por valores constantes. Esto proporciona una buena almacenamiento en caché de los resultados de la compilación.
  • stamp = -1: La incorporación de información de compilación está controlada por la marca --[no]stamp.

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

win_def_file

Etiqueta (Label); el valor predeterminado es None

Es el archivo DEF de Windows que se pasará al vinculador.

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

cc_toolchain

Ver la fuente de la regla
cc_toolchain(name, all_files, ar_files, as_files, compatible_with, compiler_files, compiler_files_without_includes, coverage_files, deprecation, distribs, dwp_files, dynamic_runtime_lib, exec_compatible_with, exec_properties, exec_transition_for_inputs, features, libc_top, licenses, linker_files, module_map, objcopy_files, output_licenses, restricted_to, static_runtime_lib, strip_files, supports_header_parsing, supports_param_files, tags, target_compatible_with, testonly, toolchain_config, toolchain_identifier, toolchains, visibility)

Representa una cadena de herramientas de C++.

Esta regla es responsable de lo siguiente:

  • Recopila todos los artefactos necesarios para que se ejecuten las acciones de C++. Esto se hace con atributos como all_files, compiler_files, linker_files o con otros atributos que terminan en _files. Por lo general, son grupos de archivos que agrupan todos los archivos necesarios.
  • Genera líneas de comandos correctas para acciones de C++. Esto se hace con el proveedor CcToolchainConfigInfo (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 detallada sobre la configuración y la selección de la cadena de herramientas de C++.

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

Argumentos

Atributos
name

Nombre: Obligatorio

Un nombre único para este objetivo.

all_files

Etiqueta (Label): Obligatorio

Es la colección de todos los artefactos de cc_toolchain. Estos artefactos se agregarán como entradas a todas las acciones relacionadas con rules_cc (con la excepción de las acciones que usan conjuntos más precisos de artefactos 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 linkstamp necesita archivos de compilación y vinculación, 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

Etiqueta (Label); el valor predeterminado es None

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

Etiqueta (Label); el valor predeterminado es None

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

Etiqueta (Label): Obligatorio

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

Etiqueta (Label); el valor predeterminado es None

Recopilació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 para Google).
coverage_files

Etiqueta (Label); el valor predeterminado es None

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

Etiqueta (Label): Obligatorio

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

Etiqueta (Label); el valor predeterminado es None

Artefacto de biblioteca dinámica para la biblioteca del tiempo de ejecución de 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

Es un valor booleano; el valor predeterminado es False.

Obsoleta. No realiza ninguna acción.
libc_top

Etiqueta (Label); el valor predeterminado es None

Es una colección de artefactos para libc que se pasan como entradas para compilar o vincular acciones.
linker_files

Etiqueta (Label): Obligatorio

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

Etiqueta (Label); el valor predeterminado es None

Es el artefacto del mapa de módulos que se usará para las compilaciones modulares.
objcopy_files

Etiqueta (Label): Obligatorio

Es la colección de todos los artefactos de cc_toolchain necesarios para las acciones de objcopy.
output_licenses

Es una lista de cadenas. El valor predeterminado es [].

static_runtime_lib

Etiqueta (Label); el valor predeterminado es None

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

Se usará cuando se habilite la función "static_link_cpp_runtimes" y vinculemos las dependencias de forma estática.

strip_files

Etiqueta (Label): Obligatorio

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

Es un valor booleano; el valor predeterminado es False.

Establece como verdadero cuando cc_toolchain admita acciones de análisis de encabezados.
supports_param_files

Es un valor booleano; el valor predeterminado es True.

Se establece en "true" cuando cc_toolchain admite el uso de archivos de parámetros para vincular acciones.
toolchain_config

Etiqueta (Label): Obligatorio

Es la etiqueta de la regla que proporciona cc_toolchain_config_info.
toolchain_identifier

Cadena; el valor predeterminado es ""

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

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_toolchain_suite

Ver la fuente de la regla
cc_toolchain_suite(name, compatible_with, deprecation, distribs, features, licenses, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)

Obsoleto: La regla no realiza ninguna acción y se quitará.

Argumentos

Atributos
name

Nombre: Obligatorio

Un nombre único para este objetivo.

fdo_prefetch_hints

Ver la fuente de la regla
fdo_prefetch_hints(name, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, profile, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)

Representa un perfil de sugerencias de precarga de FDO que está en el espacio de trabajo. Ejemplos:


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

Argumentos

Atributos
name

Nombre: Obligatorio

Un nombre único para este objetivo.

profile

Etiqueta (Label): Obligatorio

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

Ver la fuente de la regla
fdo_profile(name, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, memprof_profile, profile, proto_profile, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)

Representa un perfil de FDO que se encuentra en el lugar de trabajo. Ejemplo:


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

Argumentos

Atributos
name

Nombre: Obligatorio

Un nombre único para este objetivo.

memprof_profile

Etiqueta (Label); el valor predeterminado es None

Etiqueta del perfil de MemProf. Se espera que el perfil tenga una extensión .profdata (para un perfil de memprof indexado o simbolizado) o una extensión .zip para un archivo ZIP que contenga un archivo memprof.profdata.
profile

Etiqueta (Label): Obligatorio

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

Etiqueta (Label); el valor predeterminado es None

Etiqueta del perfil de protobuf.

memprof_profile

Ver la fuente de la regla
memprof_profile(name, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, profile, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)

Representa un perfil de MEMPROF que se encuentra en el lugar de trabajo. Ejemplo:


memprof_profile(
    name = "memprof",
    profile = "//path/to/memprof:profile.afdo",
)

Argumentos

Atributos
name

Nombre: Obligatorio

Un nombre único para este objetivo.

profile

Etiqueta (Label): Obligatorio

Etiqueta del perfil MEMPROF. Se espera que el perfil tenga una extensión .profdata (para un perfil de memprof indexado o simbolizado) o una extensión .zip para un archivo ZIP que contenga un archivo memprof.profdata. La etiqueta también puede apuntar a una regla fdo_absolute_path_profile.

propeller_optimize

Ver la fuente de la regla
propeller_optimize(name, cc_profile, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, ld_profile, restricted_to, tags, target_compatible_with, testonly, toolchains, 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"
)

Argumentos

Atributos
name

Nombre: Obligatorio

Un nombre único para este objetivo.

cc_profile

Etiqueta (Label): Obligatorio

Etiqueta del perfil que se pasa a las diversas acciones de compilación. Este archivo tiene la extensión .txt.
ld_profile

Etiqueta (Label): Obligatorio

Es la etiqueta del perfil que se pasa a la acción de vinculación. Este archivo tiene la extensión .txt.