Reglas
- cc_binary
- cc_import
- cc_library
- cc_shared_library
- cc_static_library
- cc_test
- cc_toolchain
- cc_toolchain_suite
- fdo_prefetch_hints
- fdo_profile
- memprof_profile
- propeller_optimize
cc_binary
Ver la fuente de la reglacc_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 Pueden ser objetivos linkopts , pero considera additional_linker_inputs para ese caso de uso.
|
srcs
|
Lista de etiquetas. El valor predeterminado es Se compilarán todos los archivos 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 Todos los archivos Los archivos Si el atributo
Tipos de archivos
… y cualquier regla que produzca esos archivos (p. ej., |
data
|
Lista de etiquetas. El valor predeterminado es data en Atributos típicos definidos por la mayoría de las reglas de compilación.
Si un Si un Tu código en C++ puede acceder a estos archivos de datos de la siguiente manera:
|
additional_linker_inputs
|
Lista de etiquetas. El valor predeterminado es
A diferencia de 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 |
copts
|
Lista de cadenas; el valor predeterminado es
Cada cadena de este atributo se agrega en el orden indicado a
Si el paquete declara la función
|
cxxopts
|
Lista de cadenas; el valor predeterminado es |
defines
|
Lista de cadenas; el valor predeterminado es -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 cc_shared_library de las que depende el destino actual.
La implementación de |
hdrs_check
|
Cadena. El valor predeterminado es |
includes
|
Lista de cadenas; el valor predeterminado es -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 |
link_extra_lib
|
Etiqueta: El valor predeterminado es
De forma predeterminada, los archivos binarios de C++ se vinculan con |
linkopts
|
Lista de cadenas; el valor predeterminado es LINKOPTS antes de vincular el destino binario.
Se supone que cada elemento de esta lista que no comienza con |
linkshared
|
Booleano; el valor predeterminado es 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
Si especificas |
linkstatic
|
Booleano; el valor predeterminado es 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
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 En realidad, existen tres formas diferentes de vincular un archivo ejecutable:
Si el atributo
El atributo
Debe haber muy poco código compilado con |
local_defines
|
Lista de cadenas; el valor predeterminado es -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
De forma predeterminada, los archivos binarios de C++ se vinculan con |
module_interfaces
|
Lista de etiquetas. El valor predeterminado es El estándar de C++ no tiene restricciones sobre la extensión del archivo de interfaz del módulo
El uso está protegido por la marca |
nocopts
|
Cadena. El valor predeterminado es 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
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 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 reglacc_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,
)
cc_import(
name = "mylib",
hdrs = ["mylib.h"],
shared_library = "libmylib.so",
)
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",
)
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,
)
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 deps en Atributos típicos definidos por la mayoría de las reglas de compilación.
|
hdrs
|
Lista de etiquetas. El valor predeterminado es |
alwayslink
|
Booleano; el valor predeterminado es 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 -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 |
interface_library
|
Etiqueta: El valor predeterminado es Tipos de archivos permitidos:
|
linkopts
|
Lista de cadenas; el valor predeterminado es LINKOPTS antes de vincular el destino binario.
Se supone que cada elemento de esta lista que no comienza con |
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 |
shared_library
|
Etiqueta: El valor predeterminado es Tipos de archivo permitidos:
|
static_library
|
Etiqueta: El valor predeterminado es Tipos de archivo permitidos:
|
strip_include_prefix
|
Cadena. El valor predeterminado es Cuando se configura, se puede acceder a los encabezados del atributo 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 Este atributo solo es legal en virtud de |
system_provided
|
Booleano; el valor predeterminado es interface_library y shared_library debe estar vacío.
|
cc_library
Ver la fuente de la reglacc_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ón | Inclusiones permitidas |
---|---|
foo.h | bar.h |
foo.cc | foo.h bar.h |
bar.h | bar-impl.h baz.h |
bar-impl.h | bar.h baz.h |
bar.cc | bar.h bar-impl.h baz.h |
baz.h | baz-impl.h |
baz-impl.h | baz.h |
baz.cc | baz.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
Usamos la marca alwayslink
para forzar al vinculador a vincular este código, aunque el código binario principal no lo haga referencia.
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 Pueden ser objetivos Consulta los comentarios generales sobre 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 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 Para vincular una biblioteca de terceros precompilada, agrega su nombre a Para depender de algo sin vincularlo a esta biblioteca, agrega su nombre a |
srcs
|
Lista de etiquetas. El valor predeterminado es Se compilarán todos los archivos 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 Todos los archivos Los archivos Si el atributo
Tipos de archivos
… y cualquier regla que produzca esos archivos (p. ej., |
data
|
Lista de etiquetas. El valor predeterminado es data en Atributos típicos definidos por la mayoría de las reglas de compilación.
Si un Si un Tu código en C++ puede acceder a estos archivos de datos de la siguiente manera:
|
hdrs
|
Lista de etiquetas. El valor predeterminado es 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 Tipos de archivos |
additional_compiler_inputs
|
Lista de etiquetas. El valor predeterminado es |
additional_linker_inputs
|
Lista de etiquetas. El valor predeterminado es
A diferencia de Por ejemplo, aquí se pueden proporcionar archivos .res de Windows compilados para incorporarlos en el destino binario. |
alwayslink
|
Booleano; el valor predeterminado es 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 |
copts
|
Lista de cadenas; el valor predeterminado es
Cada cadena de este atributo se agrega en el orden indicado a
Si el paquete declara la función
|
cxxopts
|
Lista de cadenas; el valor predeterminado es |
defines
|
Lista de cadenas; el valor predeterminado es -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 |
implementation_deps
|
Lista de etiquetas. El valor predeterminado es 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 Cuando se configura, se puede acceder a los encabezados en el atributo El prefijo del atributo Este atributo solo es legal en virtud de |
includes
|
Lista de cadenas; el valor predeterminado es -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 |
linkopts
|
Lista de cadenas; el valor predeterminado es 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 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 |
linkstamp
|
Etiqueta: El valor predeterminado es base .
|
linkstatic
|
Booleano; el valor predeterminado es 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
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 En realidad, existen tres formas diferentes de vincular un archivo ejecutable:
Si el atributo
El atributo
Debe haber muy poco código compilado con |
local_defines
|
Lista de cadenas; el valor predeterminado es -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 El estándar de C++ no tiene restricciones sobre la extensión del archivo de interfaz del módulo
El uso está protegido por la marca |
strip_include_prefix
|
Cadena. El valor predeterminado es Cuando se configura, se puede acceder a los encabezados del atributo 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 Este atributo solo es legal en virtud de |
textual_hdrs
|
Lista de etiquetas. El valor predeterminado es 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 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 reglacc_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
.
Two shared libraries in dependencies link the same library statically
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
Cualquier dependencia transitiva de biblioteca de estas dependencias directas se vinculará a esta biblioteca compartida, siempre y cuando un
Durante el análisis, la implementación de la regla considerará que cualquier destino que se incluya en
La implementación también activará errores cada vez que la misma biblioteca se vincule de forma estática a más de un |
additional_linker_inputs
|
Lista de etiquetas. El valor predeterminado es user_link_flags .
|
dynamic_deps
|
Lista de etiquetas. El valor predeterminado es cc_shared_library de las que depende el destino actual.
La implementación de |
exports_filter
|
Lista de cadenas; el valor predeterminado es
Ya se entiende que la biblioteca compartida exporta cualquier destino
Ten en cuenta que este atributo no agrega realmente un borde de dependencia a esos destinos. El borde de dependencia debe crearse con Se permite la siguiente sintaxis:
|
roots
|
Lista de etiquetas. El valor predeterminado es |
shared_lib_name
|
Cadena. El valor predeterminado es |
static_deps
|
Lista de cadenas; el valor predeterminado es |
user_link_flags
|
Lista de cadenas; el valor predeterminado es
|
win_def_file
|
Etiqueta: El valor predeterminado es 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 reglacc_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)
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ónsymbol_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 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 |
cc_test
Ver la fuente de la reglacc_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 Pueden ser objetivos linkopts , pero considera additional_linker_inputs para ese caso de uso.
|
srcs
|
Lista de etiquetas. El valor predeterminado es Se compilarán todos los archivos 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 Todos los archivos Los archivos Si el atributo
Tipos de archivos
… y cualquier regla que produzca esos archivos (p. ej., |
data
|
Lista de etiquetas. El valor predeterminado es data en Atributos típicos definidos por la mayoría de las reglas de compilación.
Si un Si un Tu código en C++ puede acceder a estos archivos de datos de la siguiente manera:
|
additional_linker_inputs
|
Lista de etiquetas. El valor predeterminado es
A diferencia de 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 |
copts
|
Lista de cadenas; el valor predeterminado es
Cada cadena de este atributo se agrega en el orden indicado a
Si el paquete declara la función
|
cxxopts
|
Lista de cadenas; el valor predeterminado es |
defines
|
Lista de cadenas; el valor predeterminado es -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 cc_shared_library de las que depende el destino actual.
La implementación de |
hdrs_check
|
Cadena. El valor predeterminado es |
includes
|
Lista de cadenas; el valor predeterminado es -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 |
link_extra_lib
|
Etiqueta: El valor predeterminado es
De forma predeterminada, los archivos binarios de C++ se vinculan con |
linkopts
|
Lista de cadenas; el valor predeterminado es LINKOPTS antes de vincular el destino binario.
Se supone que cada elemento de esta lista que no comienza con |
linkshared
|
Booleano; el valor predeterminado es 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
Si especificas |
linkstatic
|
Booleano; el valor predeterminado es 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
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 En realidad, existen tres formas diferentes de vincular un archivo ejecutable:
Si el atributo
El atributo
Debe haber muy poco código compilado con |
local_defines
|
Lista de cadenas; el valor predeterminado es -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
De forma predeterminada, los archivos binarios de C++ se vinculan con |
module_interfaces
|
Lista de etiquetas. El valor predeterminado es El estándar de C++ no tiene restricciones sobre la extensión del archivo de interfaz del módulo
El uso está protegido por la marca |
nocopts
|
Cadena. El valor predeterminado es 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
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 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 reglacc_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 queall_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 |
ar_files
|
Etiqueta: El valor predeterminado es |
as_files
|
Etiqueta: El valor predeterminado es |
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 |
coverage_files
|
Etiqueta: El valor predeterminado es |
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 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 |
libc_top
|
Etiqueta: El valor predeterminado es |
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 |
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 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 |
supports_param_files
|
Booleano; el valor predeterminado es |
toolchain_config
|
Label: Obligatoria Es la etiqueta de la regla que proporcionacc_toolchain_config_info .
|
toolchain_identifier
|
Cadena. El valor predeterminado es
Hasta que se corrija el problema #5380, esta es la forma recomendada de asociar |
cc_toolchain_suite
Ver la fuente de la reglacc_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 reglafdo_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 reglafdo_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 |
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 |
memprof_profile
Ver la fuente de la reglamemprof_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 reglapropeller_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. |