Reglas C y C++

Informar un problema Ver fuente Nightly · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

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, dynamic_deps, env, exec_compatible_with, exec_group_compatible_with, exec_properties, features, hdrs_check, includes, licenses, link_extra_lib, linkopts, linkshared, linkstatic, local_defines, malloc, module_interfaces, nocopts, output_licenses, package_metadata, 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 (sin la extensión). Por ejemplo, si tu punto de entrada está en main.cc, tu nombre debe ser main.

Objetivos de salida implícitos

  • name.stripped (solo se compila si se solicita de forma explícita): Es una versión reducida del archivo 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 explícitamente): Si Fission está habilitado, se genera un archivo de paquete de información de depuración adecuado para depurar archivos binarios implementados de forma remota. De lo contrario, se devuelve un archivo vacío.

Argumentos

Atributos
name

Nombre (obligatorio)

Es un nombre único para este destino.

deps

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 deps y hacer referencia a ellas en linkopts, pero considera additional_linker_inputs para ese caso de uso.
srcs

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. Estos son archivos fuente y de encabezado de C/C++, ya sean no generados (código fuente normal) o generados.

Se compilarán todos los archivos .cc, .c y .cpp. 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 puro (.s, .asm) no se preprocesan y, por lo general, se compilan con el ensamblador. Los archivos de ensamblador preprocesados (.S) se preprocesan y, por lo general, se compilan con el compilador de C/C++.

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

Todos los archivos #included deben mencionarse en el atributo hdrs de esta regla o de las reglas cc_library a las que se hace referencia, o bien 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 fuente 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 de Starlark y usar la API de cc_common).

Tipos de archivos srcs permitidos:

  • Archivos fuente de C y C++: .c, .cc, .cpp, .cxx, .c++, .C
  • Archivos de encabezado de C y C++: .h, .hh, .hpp, .hxx, .inc, .inl, .H
  • Ensamblador con preprocesador de C: .S
  • Archivo: .a, .pic.a
  • Biblioteca "Siempre vincula": .lo, .pic.lo
  • Biblioteca compartida, con versión o sin versión: .so,.so.version
  • Archivo de objeto: .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

Lista de etiquetas. El valor predeterminado es [].

Es la lista de archivos que necesita esta biblioteca en 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 los outs de esa regla se agregan automáticamente a los archivos de datos de este cc_library.

Tu código en 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

Lista de etiquetas. El valor predeterminado es [].

Son las dependencias que solo están disponibles para el comando del vinculador de C++.

A diferencia de deps, que se creó conceptualmente para las dependencias de compilación y vinculación, additional_linker_inputs se creó específicamente solo para las últimas y señala una dependencia que solo se requiere para la vinculación (por ejemplo, los archivos a los que se hace referencia en linkopts).

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

conlyopts

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

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 indicado a COPTS antes de compilar el destino binario. Las marcas solo tienen efecto cuando se compila 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 ser relativas al espacio de trabajo, no al paquete actual. Este atributo no debería ser necesario fuera de third_party.

Si el paquete declara la función no_copts_tokenization, la división en tokens de Bourne Shell solo se aplica a las cadenas que constan de una sola variable "Make".

cxxopts

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

Lista de cadenas; el valor predeterminado es []

Lista de definiciones que se agregarán a la línea de compilación de este destino y de todos los destinos dependientes. Sujeto a la sustitución de la variable"Make" y la tokenización de Bourne Shell. Cada cadena, que debe constar de un solo token de Bourne shell, se antepone con -D y se agrega a la línea de comandos de compilación de este destino, así como a cada regla que dependa de él. Ten mucho cuidado, ya que esto puede tener efectos de gran alcance: las definiciones se agregan a cada destino que depende de este destino. Si tienes dudas, agrega valores de definición a local_defines.
dynamic_deps

Lista de etiquetas. El valor predeterminado es [].

Estas son otras dependencias de cc_shared_library de las que depende el destino 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 del destino actual) para decidir qué cc_libraries del deps transitivo no se debe vincular porque ya lo proporciona un cc_shared_library diferente.

hdrs_check

Cadena. El valor predeterminado es "".

Obsoleto, no-op.
includes

Lista de cadenas; el valor predeterminado es []

Lista de directorios de inclusión que se agregarán a la línea de compilación. Sujeto a la sustitución de "Crear variable" Cada cadena está precedida por 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 "include_paths" de CROSSTOOL. Una cadena de herramientas que se ejecuta en un sistema POSIX con definiciones de funciones típicas producirá -isystem path_to_package/include_entry. Solo se debe usar para bibliotecas de terceros que no cumplen con el estilo de Google para escribir instrucciones #include. A diferencia de COPTS, estas marcas se agregan para esta regla y para 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. Si tienes dudas, agrega marcas "-I" a COPTS.

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

Etiqueta: El valor predeterminado es "@bazel_tools//tools/cpp:link_extra_lib".

Controla la vinculación de bibliotecas adicionales.

De forma predeterminada, los archivos 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. Si no se configura la marca, esta biblioteca estará 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 se establece este atributo en None, se inhabilita este comportamiento.

linkopts

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

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, por ejemplo, en un programa Java. Sin embargo, para fines de compilación, nunca se vinculará al archivo binario dependiente, ya que se supone que otros programas solo cargan manualmente las bibliotecas compartidas compiladas con una regla cc_binary, por lo que no se debe considerar un sustituto de la regla cc_library. Para garantizar la escalabilidad, te recomendamos que evites este enfoque por completo y, en su lugar, permitas que java_library dependa de las reglas de cc_library.

Si especificas linkopts=['-static'] y linkshared=True, obtendrás una sola unidad completamente autónoma. Si especificas linkstatic=True y linkshared=True, obtendrás una sola unidad, en su mayoría, autónoma.

linkstatic

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 la información 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 una 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 de tiempo de ejecución de C/C++, consulta a continuación), se siguen vinculando 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á casi estático.

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

  • STATIC con la función fully_static_link, en la que todo se vincula de forma estática; p.ej., "gcc -static foo.o libbar.a libbaz.a -lm".
    Esta opción se habilita especificando 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 en el que las bibliotecas del sistema (excepto las bibliotecas de tiempo de ejecución de C/C++) se vinculan de forma dinámica, p.ej., "gcc foo.o libfoo.a libbaz.a -lm".
    Este modo se habilita especificando linkstatic=True.
  • DYNAMIC, en el que todas las bibliotecas se vinculan de forma dinámica (si hay una versión dinámica disponible), p.ej., "gcc foo.o libfoo.so libbaz.so -lm".
    Este modo se habilita especificando linkstatic=False.

Si el atributo linkstatic o fully_static_link en features se usan 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(). En el caso de una biblioteca de C++, linkstatic=True indica que solo se permite la vinculación estática, por lo que no se producirá 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á vínculos simbólicos a las bibliotecas compartidas de las que depende en el área *.runfiles.

local_defines

Lista de cadenas; el valor predeterminado es []

Lista de definiciones que se agregarán a la línea de compilación. Sujeto a la sustitución de la variable"Make" y la tokenización de Bourne Shell. Cada cadena, que debe constar de un solo token de Bourne shell, se antepone con -D y se agrega a la línea de comandos de compilación para este destino, pero no a sus dependencias. A diferencia de defines, las definiciones solo se agregan a la línea de comandos de compilación para este destino.
malloc

Etiqueta: El valor predeterminado es "@bazel_tools//tools/cpp:malloc".

Anula la dependencia predeterminada de malloc.

De forma predeterminada, los archivos binarios de C++ se vinculan con //tools/cpp:malloc, que es una biblioteca vacía, por lo que el archivo 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 es de C++, esta opción no tiene efecto. El valor de este atributo se ignora si se especifica linkshared=True.

module_interfaces

Lista de etiquetas. El valor predeterminado es [].

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

El estándar de C++ no tiene restricciones sobre la extensión del archivo de interfaz del 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++. 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 explícitamente 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 preprocesan de ninguna manera, excepto por la sustitución de la variable "Make".
reexport_deps

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 archivo binario. Valores posibles:
  • stamp = 1: Siempre se debe incluir la información de compilación en el binario, incluso en las compilaciones de --nostamp. Se debe evitar este parámetro de configuración, ya que podría detener el almacenamiento en caché remoto del binario y cualquier acción posterior que dependa de él.
  • stamp = 0: Siempre reemplaza la información de compilación por valores constantes. Esto permite un buen almacenamiento en caché de los resultados de la compilación.
  • stamp = -1: La incorporación de información de compilación se controla con la marca --[no]stamp.

Los archivos binarios con marca de tiempo no se vuelven a compilar, a menos que cambien sus dependencias.

win_def_file

Etiqueta: 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, exec_compatible_with, exec_group_compatible_with, exec_properties, features, includes, interface_library, linkopts, objects, package_metadata, pic_objects, pic_static_library, restricted_to, shared_library, static_library, strip_include_prefix, system_provided, tags, target_compatible_with, testonly, toolchains, visibility)

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

Estos son los casos de uso típicos:
1. Cómo vincular 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 = True,
)
2. Cómo vincular una biblioteca compartida (Unix)

cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  shared_library = "libmylib.so",
)
3. Cómo vincular una biblioteca compartida con una 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. Cómo vincular 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 = True,
)

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 = True,
)
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 igual en Unix y Windows:


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

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

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

Nombre (obligatorio)

Es un nombre único para este destino.

deps

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

Lista de etiquetas. El valor predeterminado es [].

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

Booleano; el valor predeterminado es False

Si es 1, cualquier archivo binario que dependa (directa o indirectamente) de esta biblioteca precompilada de C++ se vinculará a todos los archivos de objeto archivados en la biblioteca estática, incluso si algunos no contienen símbolos a los que hace referencia el archivo binario. Esto es útil si el código del binario no llama a tu código de forma explícita, por ejemplo, si tu código se registra para recibir alguna devolución de llamada proporcionada por 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.

includes

Lista de cadenas; el valor predeterminado es []

Lista de directorios de inclusión que se agregarán a la línea de compilación. Sujeto a la sustitución de "Crear variable" Cada cadena está precedida por 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 "include_paths" de CROSSTOOL. Una cadena de herramientas que se ejecuta en un sistema POSIX con definiciones de funciones típicas producirá -isystem path_to_package/include_entry. Solo se debe usar para bibliotecas de terceros que no cumplen con el estilo de Google para escribir instrucciones #include. A diferencia de COPTS, estas marcas se agregan para esta regla y para 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. 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, inclúyelo en srcs.

interface_library

Etiqueta: 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

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

objects

Lista de etiquetas. El valor predeterminado es [].

pic_objects

Lista de etiquetas. El valor predeterminado es [].

pic_static_library

Etiqueta: El valor predeterminado es None.

shared_library

Etiqueta: El valor predeterminado es None.

Es una sola biblioteca compartida precompilada. Bazel garantiza que esté disponible para el archivo binario que depende de él durante el tiempo de ejecución.

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

static_library

Etiqueta: El valor predeterminado es None.

Es una sola biblioteca estática precompilada.

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

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 configura, 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 relativa al paquete. Si es absoluta, se interpreta como una ruta de acceso relativa al repositorio.

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

Este atributo solo es legal en virtud de third_party.

system_provided

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, exec_compatible_with, exec_group_compatible_with, exec_properties, features, hdrs_check, implementation_deps, include_prefix, includes, licenses, linkopts, linkstamp, linkstatic, local_defines, module_interfaces, package_metadata, restricted_to, strip_include_prefix, tags, target_compatible_with, testonly, textual_hdrs, toolchains, visibility, win_def_file)

Usa cc_library() para las 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 la que se depende es el archivo .a. Si especificas alwayslink=True, obtendrás 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 regla genrule para copiar la biblioteca con el nombre deseado.

Verificación de la inclusión del encabezado

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

En el caso de las reglas de cc_library, los encabezados de hdrs comprenden la interfaz pública de la biblioteca y se pueden incluir directamente desde los archivos de hdrs y srcs de la biblioteca, así como desde los archivos de hdrs y srcs de las reglas de 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 quieres que los consumidores de esta biblioteca puedan incluirla directamente. Esta decisión es casi la misma 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 directamente al archivo binario o a la prueba deben aparecer 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.

Archivo de inclusiónInclusiones permitidas
foo.hbar.h
foo.ccfoo.h bar.h
bar.hbar-impl.h baz.h
bar-impl.hbar.h baz.h
bar.ccbar.h bar-impl.h baz.h
baz.hbaz-impl.h
baz-impl.hbaz.h
baz.ccbaz.h baz-impl.h

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

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 = True,
)

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. Conservamos archivos .so prediseñados 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 a menudo necesita algo de 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)

Es un nombre único para este destino.

deps

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.

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 fuente 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

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. Estos son archivos fuente y de encabezado de C/C++, ya sean no generados (código fuente normal) o generados.

Se compilarán todos los archivos .cc, .c y .cpp. 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 puro (.s, .asm) no se preprocesan y, por lo general, se compilan con el ensamblador. Los archivos de ensamblador preprocesados (.S) se preprocesan y, por lo general, se compilan con el compilador de C/C++.

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

Todos los archivos #included deben mencionarse en el atributo hdrs de esta regla o de las reglas cc_library a las que se hace referencia, o bien 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 fuente 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 de Starlark y usar la API de cc_common).

Tipos de archivos srcs permitidos:

  • Archivos fuente de C y C++: .c, .cc, .cpp, .cxx, .c++, .C
  • Archivos de encabezado de C y C++: .h, .hh, .hpp, .hxx, .inc, .inl, .H
  • Ensamblador con preprocesador de C: .S
  • Archivo: .a, .pic.a
  • Biblioteca "Siempre vincula": .lo, .pic.lo
  • Biblioteca compartida, con versión o sin versión: .so,.so.version
  • Archivo de objeto: .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

Lista de etiquetas. El valor predeterminado es [].

Es la lista de archivos que necesita esta biblioteca en 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 los outs de esa regla se agregan automáticamente a los archivos de datos de este cc_library.

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


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

Lista de etiquetas. El valor predeterminado es [].

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

Esta es la ubicación que se recomienda para declarar los archivos de encabezado que describen la interfaz de la biblioteca. Las fuentes de esta regla o de reglas dependientes podrán incluir estos encabezados. Los encabezados que no deben incluirse en un cliente de esta biblioteca deben aparecer en el atributo srcs, incluso si se incluyen en un encabezado publicado. Consulta "Verificación de inclusión de encabezados" para obtener una descripción más detallada.

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

additional_compiler_inputs

Lista de etiquetas. El valor predeterminado es [].

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

Lista de etiquetas. El valor predeterminado es [].

Son las dependencias que solo están disponibles para el comando del vinculador de C++.

A diferencia de deps, que se creó conceptualmente para las dependencias de compilación y vinculación, additional_linker_inputs se creó específicamente solo para las últimas y señala una dependencia que solo se requiere para la vinculación (por ejemplo, los archivos a los que se hace referencia en linkopts).

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

Booleano; el valor predeterminado es False

Si es 1, cualquier archivo binario que dependa (directa o indirectamente) de esta biblioteca de C++ vinculará todos los archivos de objeto de los archivos que se enumeran en srcs, incluso si algunos no contienen símbolos a los que hace referencia el archivo binario. Esto es útil si el código del binario no llama a tu código de forma explícita, por ejemplo, si tu código se registra para recibir alguna devolución de llamada proporcionada por 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.

conlyopts

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

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 indicado a COPTS antes de compilar el destino binario. Las marcas solo tienen efecto cuando se compila 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 ser relativas al espacio de trabajo, no al paquete actual. Este atributo no debería ser necesario fuera de third_party.

Si el paquete declara la función no_copts_tokenization, la división en tokens de Bourne Shell solo se aplica a las cadenas que constan de una sola variable "Make".

cxxopts

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

Lista de cadenas; el valor predeterminado es []

Lista de definiciones que se agregarán a la línea de compilación de este destino y de todos los destinos dependientes. Sujeto a la sustitución de la variable"Make" y la tokenización de Bourne Shell. Cada cadena, que debe constar de un solo token de Bourne shell, se antepone con -D y se agrega a la línea de comandos de compilación de este destino, así como a cada regla que dependa de él. Ten mucho cuidado, ya que esto puede tener efectos de gran alcance: las definiciones se agregan a cada destino que depende de este destino. Si tienes dudas, agrega valores de definición a local_defines.
hdrs_check

Cadena. El valor predeterminado es "".

Obsoleto, no-op.
implementation_deps

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 configura, se puede acceder a los encabezados en el atributo hdrs de esta regla en el valor de este atributo antepuesto a su ruta de acceso relativa al repositorio.

El prefijo del atributo strip_include_prefix se quita antes de que se agregue este prefijo.

Este atributo solo es legal en virtud de third_party.

includes

Lista de cadenas; el valor predeterminado es []

Lista de directorios de inclusión que se agregarán a la línea de compilación. Sujeto a la sustitución de "Crear variable" Cada cadena está precedida por 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 "include_paths" de CROSSTOOL. Una cadena de herramientas que se ejecuta en un sistema POSIX con definiciones de funciones típicas producirá -isystem path_to_package/include_entry. Solo se debe usar para bibliotecas de terceros que no cumplen con el estilo de Google para escribir instrucciones #include. A diferencia de COPTS, estas marcas se agregan para esta regla y para 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. Si tienes dudas, agrega marcas "-I" a COPTS.

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

linkopts

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 traten de manera similar: el atributo malloc del atributo cc_binary). Los linkopts de dependencia tienen prioridad sobre los linkopts dependientes (es decir, los linkopts de dependencia aparecen más adelante en la línea de comandos). Los linkopts especificados en --linkopt tienen prioridad sobre los linkopts 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 se deben especificar en este atributo.

Los archivos .so que producen las reglas de cc_library no se vinculan con las bibliotecas de las que dependen. Si intentas crear una biblioteca compartida para usarla fuera del repositorio principal, p.ej., para usarla manualmente con dlopen() o LD_PRELOAD, tal vez sea mejor usar una regla cc_binary con el atributo linkshared=True. Consulta cc_binary.linkshared.

linkstamp

Etiqueta: El valor predeterminado es None.

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

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 la información 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 una 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 de tiempo de ejecución de C/C++, consulta a continuación), se siguen vinculando 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á casi estático.

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

  • STATIC con la función fully_static_link, en la que todo se vincula de forma estática; p.ej., "gcc -static foo.o libbar.a libbaz.a -lm".
    Esta opción se habilita especificando 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 en el que las bibliotecas del sistema (excepto las bibliotecas de tiempo de ejecución de C/C++) se vinculan de forma dinámica, p.ej., "gcc foo.o libfoo.a libbaz.a -lm".
    Este modo se habilita especificando linkstatic=True.
  • DYNAMIC, en el que todas las bibliotecas se vinculan de forma dinámica (si hay una versión dinámica disponible), p.ej., "gcc foo.o libfoo.so libbaz.so -lm".
    Este modo se habilita especificando linkstatic=False.

Si el atributo linkstatic o fully_static_link en features se usan 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(). En el caso de una biblioteca de C++, linkstatic=True indica que solo se permite la vinculación estática, por lo que no se producirá 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á vínculos simbólicos a las bibliotecas compartidas de las que depende en el área *.runfiles.

local_defines

Lista de cadenas; el valor predeterminado es []

Lista de definiciones que se agregarán a la línea de compilación. Sujeto a la sustitución de la variable"Make" y la tokenización de Bourne Shell. Cada cadena, que debe constar de un solo token de Bourne shell, se antepone con -D y se agrega a la línea de comandos de compilación para este destino, pero no a sus dependencias. A diferencia de defines, las definiciones solo se agregan a la línea de comandos de compilación para este destino.
module_interfaces

Lista de etiquetas. El valor predeterminado es [].

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

El estándar de C++ no tiene restricciones sobre la extensión del archivo de interfaz del 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 configura, 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 relativa al paquete. Si es absoluta, se interpreta como una ruta de acceso relativa al repositorio.

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

Este atributo solo es legal en virtud de third_party.

textual_hdrs

Lista de etiquetas. El valor predeterminado es [].

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

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

win_def_file

Etiqueta: 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, dynamic_deps, exec_compatible_with, exec_group_compatible_with, exec_properties, exports_filter, features, package_metadata, 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 el dynamic_dep bar_shared ya lo proporciona de forma dinámica.

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 exporta para mostrar errores durante la fase de análisis si dos bibliotecas compartidas exportan los mismos destinos.

Se supone que todas las dependencias directas de cc_shared_library se exportan. Por lo tanto, durante el análisis, Bazel supone que foo_shared exporta foo. No se supone que baz se exporte con foo_shared. Se supone que todos los destinos que coinciden con 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, deberíamos 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 de 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 nuevo cc_shared_library con dos dependencias cc_shared_library diferentes que vinculen el mismo destino 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, la que aún la vincula debe 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 forma es etiquetar el cc_library infractor con LINKABLE_MORE_THAN_ONCE, pero esta corrección debe ser poco frecuente y debes asegurarte de que el cc_library sea 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 ni posible vincularla 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, afirmas que exportarás un destino que ya se está exportando con una de tus dependencias dinámicas.

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

Argumentos

Atributos
name

Nombre (obligatorio)

Es un nombre único para este destino.

deps

Lista de etiquetas. El valor predeterminado es [].

Son las bibliotecas de nivel superior que se vincularán de forma estática e incondicional en la biblioteca compartida después de archivarse por completo.

Cualquier dependencia transitiva de biblioteca de estas dependencias directas se vinculará a esta biblioteca compartida, siempre y cuando un cc_shared_library en dynamic_deps no la haya vinculado ya.

Durante el análisis, la implementación de la regla considerará que cualquier destino que se incluya en deps se exporta desde la biblioteca compartida 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 una pueda convertirse en un dynamic_dep de la otra.

additional_linker_inputs

Lista de etiquetas. El valor predeterminado es [].

Son los archivos adicionales que quieras pasar al vinculador, por ejemplo, los scripts del vinculador. Debes pasar por separado cualquier marca del vinculador que este necesite para conocer este archivo. Puedes hacerlo a través del atributo user_link_flags.
dynamic_deps

Lista de etiquetas. El valor predeterminado es [].

Estas son otras dependencias de cc_shared_library de las que depende el destino 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 del destino actual) para decidir qué cc_libraries del deps transitivo no se debe vincular porque ya lo proporciona un cc_shared_library diferente.

exports_filter

Lista de cadenas; el valor predeterminado es []

Este atributo contiene una lista de destinos que se indican como exportados por la biblioteca compartida actual.

Ya se entiende que la biblioteca compartida exporta cualquier destino deps. Este atributo se debe usar para enumerar cualquier destino que exporte la biblioteca compartida, pero que sean dependencias transitivas de deps.

Ten en cuenta que este atributo no agrega realmente un borde de dependencia a esos destinos. El borde de dependencia debe crearse con deps. Las entradas de este atributo son solo cadenas. Ten en cuenta que, cuando colocas un destino en este atributo, se considera una afirmación de que la biblioteca compartida exporta los símbolos de ese destino. La lógica de cc_shared_library no controla realmente la indicación al vinculador de 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

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 basado en el nombre del destino y la plataforma. Esto incluye una extensión y, a veces, un prefijo. A veces, es posible que no desees el nombre predeterminado, por ejemplo, cuando cargas bibliotecas compartidas de C++ para Python, el prefijo lib* predeterminado no suele ser deseado, en cuyo caso puedes usar este atributo para elegir un nombre personalizado.
static_deps

Lista de cadenas; el valor predeterminado es []

Lista de cadenas; el valor predeterminado es []

Son las marcas adicionales que desees pasar al vinculador. Por ejemplo, para que el vinculador conozca una secuencia de comandos de vinculador que se pasó 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: 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, exec_compatible_with, exec_group_compatible_with, exec_properties, features, package_metadata, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)
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 objeto de los destinos que se enumeran en deps, así como sus dependencias transitivas, con preferencia por los objetos PIC.

Grupos de salida

linkdeps

Es un archivo de texto que contiene las etiquetas de las dependencias transitivas de los destinos que se enumeran en deps y que no aportaron ningún archivo de objeto a la biblioteca estática, pero que sí 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 indican 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 falla y se muestra un mensaje de error que enumera los símbolos duplicados y los archivos de objeto que los contienen.

Esta verificación se puede inhabilitar por destino o por paquete si se establece features = ["-symbol_check"], o bien 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 incluyen con Bazel admiten la función symbol_check en todas las plataformas. Las cadenas de herramientas personalizadas pueden agregar compatibilidad de dos maneras:

  • Implementar la acción ACTION_NAMES.validate_static_library y habilitarla con la función symbol_check El conjunto de herramientas establecido 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 la verificación se aprueba.
  • La función symbol_check agrega marcas de archivador que hacen que la acción de creación de la biblioteca estática falle en símbolos duplicados.

Argumentos

Atributos
name

Nombre (obligatorio)

Es un nombre único para este destino.

deps

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 proporcionado por 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, dynamic_deps, env, env_inherit, exec_compatible_with, exec_group_compatible_with, exec_properties, features, flaky, hdrs_check, includes, licenses, link_extra_lib, linkopts, linkshared, linkstatic, local, local_defines, malloc, module_interfaces, nocopts, package_metadata, 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 algún 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 unidades, especifica linkstatic=True. Probablemente, sería bueno comentar por qué tu prueba necesita linkstatic, ya que esto probablemente no sea obvio.

Objetivos de salida implícitos

  • name.stripped (solo se compila si se solicita de forma explícita): Es una versión reducida del archivo 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 explícitamente): Si Fission está habilitado, se genera un archivo de paquete de información de depuración adecuado para depurar archivos binarios implementados de forma remota. De lo contrario, se devuelve un archivo vacío.

Consulta los argumentos de 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)

Es un nombre único para este destino.

deps

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 deps y hacer referencia a ellas en linkopts, pero considera additional_linker_inputs para ese caso de uso.
srcs

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. Estos son archivos fuente y de encabezado de C/C++, ya sean no generados (código fuente normal) o generados.

Se compilarán todos los archivos .cc, .c y .cpp. 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 puro (.s, .asm) no se preprocesan y, por lo general, se compilan con el ensamblador. Los archivos de ensamblador preprocesados (.S) se preprocesan y, por lo general, se compilan con el compilador de C/C++.

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

Todos los archivos #included deben mencionarse en el atributo hdrs de esta regla o de las reglas cc_library a las que se hace referencia, o bien 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 fuente 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 de Starlark y usar la API de cc_common).

Tipos de archivos srcs permitidos:

  • Archivos fuente de C y C++: .c, .cc, .cpp, .cxx, .c++, .C
  • Archivos de encabezado de C y C++: .h, .hh, .hpp, .hxx, .inc, .inl, .H
  • Ensamblador con preprocesador de C: .S
  • Archivo: .a, .pic.a
  • Biblioteca "Siempre vincula": .lo, .pic.lo
  • Biblioteca compartida, con versión o sin versión: .so,.so.version
  • Archivo de objeto: .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

Lista de etiquetas. El valor predeterminado es [].

Es la lista de archivos que necesita esta biblioteca en 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 los outs de esa regla se agregan automáticamente a los archivos de datos de este cc_library.

Tu código en 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

Lista de etiquetas. El valor predeterminado es [].

Son las dependencias que solo están disponibles para el comando del vinculador de C++.

A diferencia de deps, que se creó conceptualmente para las dependencias de compilación y vinculación, additional_linker_inputs se creó específicamente solo para las últimas y señala una dependencia que solo se requiere para la vinculación (por ejemplo, los archivos a los que se hace referencia en linkopts).

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

conlyopts

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

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 indicado a COPTS antes de compilar el destino binario. Las marcas solo tienen efecto cuando se compila 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 ser relativas al espacio de trabajo, no al paquete actual. Este atributo no debería ser necesario fuera de third_party.

Si el paquete declara la función no_copts_tokenization, la división en tokens de Bourne Shell solo se aplica a las cadenas que constan de una sola variable "Make".

cxxopts

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

Lista de cadenas; el valor predeterminado es []

Lista de definiciones que se agregarán a la línea de compilación de este destino y de todos los destinos dependientes. Sujeto a la sustitución de la variable"Make" y la tokenización de Bourne Shell. Cada cadena, que debe constar de un solo token de Bourne shell, se antepone con -D y se agrega a la línea de comandos de compilación de este destino, así como a cada regla que dependa de él. Ten mucho cuidado, ya que esto puede tener efectos de gran alcance: las definiciones se agregan a cada destino que depende de este destino. Si tienes dudas, agrega valores de definición a local_defines.
dynamic_deps

Lista de etiquetas. El valor predeterminado es [].

Estas son otras dependencias de cc_shared_library de las que depende el destino 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 del destino actual) para decidir qué cc_libraries del deps transitivo no se debe vincular porque ya lo proporciona un cc_shared_library diferente.

hdrs_check

Cadena. El valor predeterminado es "".

Obsoleto, no-op.
includes

Lista de cadenas; el valor predeterminado es []

Lista de directorios de inclusión que se agregarán a la línea de compilación. Sujeto a la sustitución de "Crear variable" Cada cadena está precedida por 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 "include_paths" de CROSSTOOL. Una cadena de herramientas que se ejecuta en un sistema POSIX con definiciones de funciones típicas producirá -isystem path_to_package/include_entry. Solo se debe usar para bibliotecas de terceros que no cumplen con el estilo de Google para escribir instrucciones #include. A diferencia de COPTS, estas marcas se agregan para esta regla y para 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. Si tienes dudas, agrega marcas "-I" a COPTS.

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

Etiqueta: El valor predeterminado es "@bazel_tools//tools/cpp:link_extra_lib".

Controla la vinculación de bibliotecas adicionales.

De forma predeterminada, los archivos 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. Si no se configura la marca, esta biblioteca estará 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 se establece este atributo en None, se inhabilita este comportamiento.

linkopts

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

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, por ejemplo, en un programa Java. Sin embargo, para fines de compilación, nunca se vinculará al archivo binario dependiente, ya que se supone que otros programas solo cargan manualmente las bibliotecas compartidas compiladas con una regla cc_binary, por lo que no se debe considerar un sustituto de la regla cc_library. Para garantizar la escalabilidad, te recomendamos que evites este enfoque por completo y, en su lugar, permitas que java_library dependa de las reglas de cc_library.

Si especificas linkopts=['-static'] y linkshared=True, obtendrás una sola unidad completamente autónoma. Si especificas linkstatic=True y linkshared=True, obtendrás una sola unidad, en su mayoría, autónoma.

linkstatic

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 la información 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 una 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 de tiempo de ejecución de C/C++, consulta a continuación), se siguen vinculando 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á casi estático.

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

  • STATIC con la función fully_static_link, en la que todo se vincula de forma estática; p.ej., "gcc -static foo.o libbar.a libbaz.a -lm".
    Esta opción se habilita especificando 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 en el que las bibliotecas del sistema (excepto las bibliotecas de tiempo de ejecución de C/C++) se vinculan de forma dinámica, p.ej., "gcc foo.o libfoo.a libbaz.a -lm".
    Este modo se habilita especificando linkstatic=True.
  • DYNAMIC, en el que todas las bibliotecas se vinculan de forma dinámica (si hay una versión dinámica disponible), p.ej., "gcc foo.o libfoo.so libbaz.so -lm".
    Este modo se habilita especificando linkstatic=False.

Si el atributo linkstatic o fully_static_link en features se usan 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(). En el caso de una biblioteca de C++, linkstatic=True indica que solo se permite la vinculación estática, por lo que no se producirá 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á vínculos simbólicos a las bibliotecas compartidas de las que depende en el área *.runfiles.

local_defines

Lista de cadenas; el valor predeterminado es []

Lista de definiciones que se agregarán a la línea de compilación. Sujeto a la sustitución de la variable"Make" y la tokenización de Bourne Shell. Cada cadena, que debe constar de un solo token de Bourne shell, se antepone con -D y se agrega a la línea de comandos de compilación para este destino, pero no a sus dependencias. A diferencia de defines, las definiciones solo se agregan a la línea de comandos de compilación para este destino.
malloc

Etiqueta: El valor predeterminado es "@bazel_tools//tools/cpp:malloc".

Anula la dependencia predeterminada de malloc.

De forma predeterminada, los archivos binarios de C++ se vinculan con //tools/cpp:malloc, que es una biblioteca vacía, por lo que el archivo 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 es de C++, esta opción no tiene efecto. El valor de este atributo se ignora si se especifica linkshared=True.

module_interfaces

Lista de etiquetas. El valor predeterminado es [].

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

El estándar de C++ no tiene restricciones sobre la extensión del archivo de interfaz del 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++. 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 explícitamente 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 preprocesan de ninguna manera, excepto por la sustitución de la variable "Make".
reexport_deps

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 archivo binario. Valores posibles:
  • stamp = 1: Siempre se debe incluir la información de compilación en el binario, incluso en las compilaciones de --nostamp. Se debe evitar este parámetro de configuración, ya que podría detener el almacenamiento en caché remoto del binario y cualquier acción posterior que dependa de él.
  • stamp = 0: Siempre reemplaza la información de compilación por valores constantes. Esto permite un buen almacenamiento en caché de los resultados de la compilación.
  • stamp = -1: La incorporación de información de compilación se controla con la marca --[no]stamp.

Los archivos binarios con marca de tiempo no se vuelven a compilar, a menos que cambien sus dependencias.

win_def_file

Etiqueta: 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, dwp_files, dynamic_runtime_lib, exec_compatible_with, exec_group_compatible_with, exec_properties, exec_transition_for_inputs, features, libc_top, licenses, linker_files, module_map, objcopy_files, output_licenses, package_metadata, 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 cualquier otro atributo que termine con _files. Estos son, por lo general, grupos de archivos que incluyen todos los archivos necesarios.
  • Genera líneas de comandos correctas para las acciones de C++. Esto se hace con el proveedor de 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 selección de la cadena de herramientas de C++.

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

Argumentos

Atributos
name

Nombre (obligatorio)

Es un nombre único para este destino.

all_files

Label: Obligatoria

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

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

ar_files

Etiqueta: El valor predeterminado es None.

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

Etiqueta: El valor predeterminado es None.

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

Label: Obligatoria

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

Etiqueta: El valor predeterminado es None.

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

Etiqueta: El valor predeterminado es None.

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

Label: Obligatoria

Colección de todos los artefactos de cc_toolchain necesarios para las acciones de dwp.
dynamic_runtime_lib

Etiqueta: El valor predeterminado es None.

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

Se usará cuando se habilite la función "static_link_cpp_runtimes" y se vinculen dependencias de forma dinámica.

exec_transition_for_inputs

Booleano; el valor predeterminado es False

Obsoleta. No-op.
libc_top

Etiqueta: El valor predeterminado es None.

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

Label: Obligatoria

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

Etiqueta: El valor predeterminado es None.

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

Label: Obligatoria

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

Lista de cadenas; el valor predeterminado es []

static_runtime_lib

Etiqueta: El valor predeterminado es None.

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

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

strip_files

Label: Obligatoria

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

Booleano; el valor predeterminado es False

Se establece en verdadero cuando cc_toolchain admite acciones de análisis de encabezado.
supports_param_files

Booleano; el valor predeterminado es True

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

Label: Obligatoria

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 este cc_toolchain con el crosstool_config.toolchain correspondiente.

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

cc_toolchain_suite

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

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

Argumentos

Atributos
name

Nombre (obligatorio)

Es un nombre único para este destino.

fdo_prefetch_hints

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

Representa un perfil de sugerencias de recuperación previa de FDO que se encuentra en el espacio de trabajo. Ejemplos:


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

Argumentos

Atributos
name

Nombre (obligatorio)

Es un nombre único para este destino.

profile

Label: Obligatoria

Es la 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, exec_compatible_with, exec_group_compatible_with, exec_properties, features, memprof_profile, package_metadata, profile, proto_profile, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)

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


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

Argumentos

Atributos
name

Nombre (obligatorio)

Es un nombre único para este destino.

memprof_profile

Etiqueta: El valor predeterminado es None.

Es la etiqueta del perfil de MemProf. Se espera que el perfil tenga una extensión .profdata (para un perfil de memprof indexado o con símbolos) o una extensión .zip para un archivo ZIP que contenga un archivo memprof.profdata.
profile

Label: Obligatoria

Es la etiqueta del perfil de FDO o una regla que lo genera. El archivo FDO puede tener una de las siguientes extensiones: .profraw para el perfil de LLVM sin indexar, .profdata para el perfil de LLVM indexado, .zip que contiene un perfil 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: El valor predeterminado es None.

Es la etiqueta del perfil de protobuf.

memprof_profile

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

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


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

Argumentos

Atributos
name

Nombre (obligatorio)

Es un nombre único para este destino.

profile

Label: Obligatoria

Es la etiqueta del perfil de MEMPROF. Se espera que el perfil tenga una extensión .profdata (para un perfil de memprof indexado o con símbolos) 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, exec_compatible_with, exec_group_compatible_with, exec_properties, features, ld_profile, package_metadata, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)

Representa un perfil de optimización de Propeller en el espacio de trabajo. Ejemplo:


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

Argumentos

Atributos
name

Nombre (obligatorio)

Es un nombre único para este destino.

cc_profile

Label: Obligatoria

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

Label: Obligatoria

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