Reglas
- cc_binary
- cc_import
- cc_library
- cc_proto_library
- fdo_prefetch_hints
- fdo_profile
- propeller_optimize
- cc_test
- cc_toolchain
- cc_toolchain_suite
cc_binary
cc_binary(name, deps, srcs, data, additional_linker_inputs, args, compatible_with, copts, defines, deprecation, distribs, env, exec_compatible_with, exec_properties, features, includes, licenses, linkopts, linkshared, linkstatic, local_defines, malloc, nocopts, output_licenses, restricted_to, stamp, tags, target_compatible_with, testonly, toolchains, visibility, win_def_file)
Objetivos de salida implícitos
name.stripped
(solo se compila si se solicita de manera explícita): Es una versión reducida del objeto binario.strip -g
se ejecuta en el objeto binario para quitar los símbolos de depuración. Se pueden proporcionar opciones de eliminación adicionales en la línea de comandos mediante--stripopt=-foo
. Este resultado solo se compila si se solicita de manera explícita.name.dwp
(solo se compila si se solicita explícitamente): Si está habilitada la Fission, se trata de un archivo de paquete de información de depuración adecuado para depurar los objetos binarios implementados de forma remota. De lo contrario, un archivo vacío
Argumentos
Atributos | |
---|---|
name |
Un nombre único para este destino. |
deps
|
Estos pueden ser objetivos |
srcs
|
Se compilarán todos los archivos No se compilará un archivo Todos los archivos Si el nombre de una regla está en
Tipos de archivo
...y las reglas que producen esos archivos. Diferentes extensiones denotan distintos lenguajes de programación de acuerdo con la convención de GCC. |
additional_linker_inputs
|
Por ejemplo, se pueden proporcionar archivos .res de Windows compilados aquí para incorporarlos en el destino binario. |
copts
|
Cada cadena de este atributo se agrega en el orden dado a
Si el paquete declara que feature
|
defines
|
-D y se agrega a la línea de comandos de compilación de este destino y a cada regla que dependa de él. Ten mucho cuidado, ya que esto puede tener efectos de gran alcance. Si tienes dudas, agrega valores definidos a local_defines .
|
includes
|
Sujeto a la sustitución "Make variable".
Cada cadena está precedida por Los encabezados deben agregarse a srcs o hdrs; de lo contrario, no estarán disponibles para las reglas dependientes cuando la compilación esté en zona de pruebas (configuración predeterminada). |
linkopts
|
LINKOPTS antes de vincular el destino binario.
Se supone que cada elemento de esta lista que no comienza con |
linkshared
|
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 tanto |
linkstatic
|
cc_binary y cc_test : vincula el objeto binario en modo estático. Para cc_library.linkstatic : consulta a continuación.
De forma predeterminada, esta opción está activada para
Si se habilita y es un objeto binario o de prueba, esta opción le indica a la herramienta de compilación que se vincule con las bibliotecas de usuario de Existen tres formas diferentes de vincular un archivo ejecutable:
El atributo
Si es |
local_defines
|
-D y se agrega a la línea de comandos de compilación para este destino, pero no a sus dependientes.
|
malloc
|
De forma predeterminada, los objetos binarios de C++ están vinculados con |
nocopts
|
COPTS preexistente que coincida con esta expresión regular (incluidos los valores especificados de forma explícita en el atributo copts de la regla) se quitará de COPTS para compilar esta regla.
Rara vez se necesita este atributo.
|
stamp
|
Los objetos binarios sellados no se vuelven a compilar, a menos que cambien sus dependencias. |
win_def_file
|
Este atributo solo debe usarse cuando Windows es la plataforma seleccionada. Se puede usar para exportar símbolos durante la vinculación de una biblioteca compartida. |
cc_import
cc_import(name, data, hdrs, alwayslink, compatible_with, deprecation, distribs, features, interface_library, licenses, restricted_to, shared_library, static_library, system_provided, tags, target_compatible_with, testonly, visibility)
Las reglas cc_import
permiten a los usuarios importar bibliotecas C/C++ precompiladas.
Estos son los casos de uso típicos:
1. Vinculación de una biblioteca estática
cc_import( name = "mylib", hdrs = ["mylib.h"], static_library = "libmylib.a", # If alwayslink is turned on, # libmylib.a will be forcely linked into any binary that depends on it. # alwayslink = 1, )2. Vincular una biblioteca compartida (Unix)
cc_import( name = "mylib", hdrs = ["mylib.h"], shared_library = "libmylib.so", )3. Vinculación de una biblioteca compartida con la biblioteca de interfaz (Windows)
cc_import( name = "mylib", hdrs = ["mylib.h"], # mylib.lib is a import library for mylib.dll which will be passed to linker interface_library = "mylib.lib", # mylib.dll will be available for runtime shared_library = "mylib.dll", )4. Vinculación de una biblioteca compartida con
system_provided=True
(Windows)
cc_import( name = "mylib", hdrs = ["mylib.h"], # mylib.lib is an import library for mylib.dll which will be passed to linker interface_library = "mylib.lib", # mylib.dll is provided by system environment, for example it can be found in PATH. # This indicates that Bazel is not responsible for making mylib.dll available. system_provided = 1, )5. Vinculación a una biblioteca estática o compartida
En Unix:
cc_import( name = "mylib", hdrs = ["mylib.h"], static_library = "libmylib.a", shared_library = "libmylib.so", ) # first will link to libmylib.a cc_binary( name = "first", srcs = ["first.cc"], deps = [":mylib"], linkstatic = 1, # default value ) # second will link to libmylib.so cc_binary( name = "second", srcs = ["second.cc"], deps = [":mylib"], linkstatic = 0, )En Windows:
cc_import( name = "mylib", hdrs = ["mylib.h"], static_library = "libmylib.lib", # A normal static library interface_library = "mylib.lib", # An import library for mylib.dll shared_library = "mylib.dll", ) # first will link to libmylib.lib cc_binary( name = "first", srcs = ["first.cc"], deps = [":mylib"], linkstatic = 1, # default value ) # second will link to mylib.dll through mylib.lib cc_binary( name = "second", srcs = ["second.cc"], deps = [":mylib"], linkstatic = 0, )
Argumentos
Atributos | |
---|---|
name |
Un nombre único para este destino. |
hdrs
|
|
alwayslink
|
Si Alwayslink no funciona con VS 2017 en Windows, debido a un problema conocido, actualiza VS 2017 a la versión más reciente. |
interface_library
|
Tipos de archivo permitidos: |
shared_library
|
Tipos de archivo permitidos: |
static_library
|
Tipos de archivo permitidos: |
system_provided
|
interface_library y shared_library debe estar vacío.
|
cc_library
cc_library(name, deps, srcs, data, hdrs, alwayslink, compatible_with, copts, defines, deprecation, distribs, exec_compatible_with, exec_properties, features, implementation_deps, include_prefix, includes, licenses, linkopts, linkstamp, linkstatic, local_defines, nocopts, restricted_to, strip_include_prefix, tags, target_compatible_with, testonly, textual_hdrs, toolchains, visibility, win_def_file)
Verificación de inclusión de encabezado
Todos los archivos de encabezado que se usan en la compilación deben declararse en las reglas hdrs
o srcs
de cc_*
. Esto se aplica de manera forzosa.
En el caso de las reglas cc_library
, los encabezados de hdrs
comprenden la interfaz pública de la biblioteca y se pueden incluir directamente desde los archivos en hdrs
y srcs
de la biblioteca, así como desde archivos en hdrs
y srcs
de las reglas de cc_*
que enumeran la biblioteca en su deps
.
Los encabezados en srcs
solo deben incluirse directamente desde los archivos en hdrs
y srcs
de la biblioteca misma. A la hora de decidir si colocar un encabezado en hdrs
o srcs
, debes preguntar si quieres que los consumidores de esta biblioteca puedan incluirlo directamente. Esta es aproximadamente la misma decisión que la que se utiliza entre la visibilidad de public
y private
en los lenguajes de programación.
Las reglas cc_binary
y cc_test
no tienen una interfaz exportada, por lo que tampoco tienen un atributo hdrs
. Todos los encabezados que pertenecen al objeto binario o de prueba directamente deben enumerarse en el srcs
.
Para ilustrar estas reglas, observa el siguiente ejemplo.
cc_binary( name = "foo", srcs = [ "foo.cc", "foo.h", ], deps = [":bar"], ) cc_library( name = "bar", srcs = [ "bar.cc", "bar-impl.h", ], hdrs = ["bar.h"], deps = [":baz"], ) cc_library( name = "baz", srcs = [ "baz.cc", "baz-impl.h", ], hdrs = ["baz.h"], )
En la siguiente tabla, se enumeran las inclusiones directas permitidas en este ejemplo. Por ejemplo, foo.cc
puede incluir directamente foo.h
y bar.h
, pero no baz.h
.
Incluye el archivo | 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 deps
. En este caso, el compilador puede leer baz.h
y baz-impl.h
cuando compila foo.cc
, pero foo.cc
no debe contener #include "baz.h"
. Para que eso esté permitido, se debe agregar baz
a deps
de foo
.
Lamentablemente, en la actualidad, Bazel no puede distinguir entre inclusiones directas y transitivas,
por lo que no puede detectar casos de error en los que un archivo incluya directamente un
encabezado al que solo se le permita incluir de forma transitiva. Por ejemplo, Bazel no se quejaría si, en el ejemplo anterior, foo.cc
incluye directamente baz.h
. Esta acción sería ilegal, ya que foo
no depende directamente de baz
. Actualmente, no se produce ningún error en ese caso, pero esa verificación de errores se puede agregar en el futuro.
Argumentos
Atributos | |
---|---|
name |
Un nombre único para este destino. |
deps
|
Estos pueden ser objetivos |
srcs
|
Se compilarán todos los archivos No se compilará un archivo Todos los archivos Si el nombre de una regla está en
Tipos de archivo
...y las reglas que producen esos archivos. Diferentes extensiones denotan distintos lenguajes de programación de acuerdo con la convención de GCC. |
hdrs
|
Esta es la ubicación preferida para declarar archivos de encabezado que describen la interfaz de la biblioteca. Estos encabezados estarán disponibles para que se incluyan en esta regla o en reglas dependientes.
Los encabezados que no estén diseñados para un cliente de esta biblioteca deben enumerarse en el atributo |
alwayslink
|
srcs , incluso si algunos no contienen símbolos al que hace referencia el objeto binario.
Esto resulta útil si tu código no se llama explícitamente mediante código en el objeto binario, p.ej., si se registra para recibir una devolución de llamada proporcionada por algún servicio.
Si Alwayslink no funciona con VS 2017 en Windows, debido a un problema conocido, actualiza VS 2017 a la versión más reciente. |
copts
|
Cada cadena de este atributo se agrega en el orden dado a
Si el paquete declara que feature
|
defines
|
-D y se agrega a la línea de comandos de compilación de este destino y a cada regla que dependa de él. Ten mucho cuidado, ya que esto puede tener efectos de gran alcance. Si tienes dudas, agrega valores definidos a local_defines .
|
implementation_deps
|
deps , las rutas de inclusión y los encabezados de estas bibliotecas (y todas sus dependencias transitivas) solo se utilizan para la compilación de esta biblioteca, y no las bibliotecas que dependen de ella. Las bibliotecas especificadas con implementation_deps siguen vinculadas en objetivos binarios que dependen de esta biblioteca.
Por ahora, el uso se limita a cc_library y está protegido por la marca |
include_prefix
|
Cuando se configura, se puede acceder a los encabezados en el atributo Antes de agregar este prefijo, se quita el prefijo del atributo |
includes
|
Sujeto a la sustitución "Make variable".
Cada cadena está precedida por Los encabezados deben agregarse a srcs o hdrs; de lo contrario, no estarán disponibles para las reglas dependientes cuando la compilación esté en zona de pruebas (configuración predeterminada). |
linkopts
|
LINKOPTS antes de vincular el destino binario.
Se supone que cada elemento de esta lista que no comienza con |
linkstamp
|
base .
|
linkstatic
|
cc_binary y cc_test : vincula el objeto binario en modo estático. Para cc_library.linkstatic : consulta a continuación.
De forma predeterminada, esta opción está activada para
Si se habilita y es un objeto binario o de prueba, esta opción le indica a la herramienta de compilación que se vincule con las bibliotecas de usuario de Existen tres formas diferentes de vincular un archivo ejecutable:
El atributo
Si es |
local_defines
|
-D y se agrega a la línea de comandos de compilación para este destino, pero no a sus dependientes.
|
nocopts
|
COPTS preexistente que coincida con esta expresión regular (incluidos los valores especificados de forma explícita en el atributo copts de la regla) se quitará de COPTS para compilar esta regla.
Rara vez se necesita este atributo.
|
strip_include_prefix
|
Cuando se configura, se puede acceder a los encabezados en el atributo Si es una ruta relativa, se toma como relativa al paquete. Si es una absoluta, se entiende como una ruta relativa de repositorio. El prefijo del atributo |
textual_hdrs
|
Esta es la ubicación para declarar archivos de encabezado que no pueden compilarse por sí solos; es decir, siempre deben incluirse de forma textual por otros archivos fuente para compilar un código válido. |
win_def_file
|
Este atributo solo debe usarse cuando Windows es la plataforma seleccionada. Se puede usar para exportar símbolos durante la vinculación de una biblioteca compartida. |
cc_proto_library
cc_proto_library(name, deps, data, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, licenses, restricted_to, tags, target_compatible_with, testonly, visibility)
cc_proto_library
genera código C++ a partir de archivos .proto
.
deps
debe apuntar a reglas proto_library
.
Ejemplo:
cc_library( name = "lib", deps = [":foo_cc_proto"], ) cc_proto_library( name = "foo_cc_proto", deps = [":foo_proto"], ) proto_library( name = "foo_proto", )
Argumentos
Atributos | |
---|---|
name |
Un nombre único para este destino. |
deps
|
proto_library para las que se genera el código de C++.
|
fdo_prefetch_hints
fdo_prefetch_hints(name, compatible_with, deprecation, distribs, features, licenses, profile, restricted_to, tags, target_compatible_with, testonly, visibility)
Representa un perfil de sugerencias de carga previa de FDO que se encuentra en el lugar de trabajo o en una ruta de acceso absoluta especificada. Ejemplos:
fdo_prefetch_hints( name = "hints", profile = "//path/to/hints:profile.afdo", ) fdo_profile( name = "hints_abs", absolute_path_profile = "/absolute/path/profile.afdo", )
Argumentos
Atributos | |
---|---|
name |
Un nombre único para este destino. |
profile
|
|
fdo_profile
fdo_profile(name, absolute_path_profile, compatible_with, deprecation, distribs, features, licenses, profile, proto_profile, restricted_to, tags, target_compatible_with, testonly, visibility)
Representa un perfil de FDO que se encuentra en el lugar de trabajo o en una ruta de acceso absoluta especificada. Ejemplos:
fdo_profile( name = "fdo", profile = "//path/to/fdo:profile.zip", ) fdo_profile( name = "fdo_abs", absolute_path_profile = "/absolute/path/profile.zip", )
Argumentos
Atributos | |
---|---|
name |
Un nombre único para este destino. |
absolute_path_profile
|
|
profile
|
|
proto_profile
|
|
propeller_optimize
propeller_optimize(name, compatible_with, deprecation, distribs, features, ld_profile, licenses, restricted_to, tags, target_compatible_with, testonly, visibility)
Representa un perfil de optimización de la hélice en el lugar de trabajo. Ejemplo:
propeller_optimize( name = "layout", cc_profile = "//path:cc_profile.txt", ld_profile = "//path:ld_profile.txt" ) propeller_optimize( name = "layout_absolute", absolute_cc_profile = "/absolute/cc_profile.txt", absolute_ld_profile = "/absolute/ld_profile.txt" )
Argumentos
Atributos | |
---|---|
name |
Un nombre único para este destino. |
ld_profile
|
|
cc_test
cc_test(name, deps, srcs, data, additional_linker_inputs, args, compatible_with, copts, defines, deprecation, distribs, env, env_inherit, exec_compatible_with, exec_properties, features, flaky, includes, licenses, linkopts, linkstatic, local, local_defines, malloc, nocopts, restricted_to, shard_count, size, stamp, tags, target_compatible_with, testonly, timeout, toolchains, visibility, win_def_file)
Argumentos
Atributos | |
---|---|
name |
Un nombre único para este destino. |
deps
|
Estos pueden ser objetivos |
srcs
|
Se compilarán todos los archivos No se compilará un archivo Todos los archivos Si el nombre de una regla está en
Tipos de archivo
...y las reglas que producen esos archivos. Diferentes extensiones denotan distintos lenguajes de programación de acuerdo con la convención de GCC. |
additional_linker_inputs
|
Por ejemplo, se pueden proporcionar archivos .res de Windows compilados aquí para incorporarlos en el destino binario. |
copts
|
Cada cadena de este atributo se agrega en el orden dado a
Si el paquete declara que feature
|
defines
|
-D y se agrega a la línea de comandos de compilación de este destino y a cada regla que dependa de él. Ten mucho cuidado, ya que esto puede tener efectos de gran alcance. Si tienes dudas, agrega valores definidos a local_defines .
|
includes
|
Sujeto a la sustitución "Make variable".
Cada cadena está precedida por Los encabezados deben agregarse a srcs o hdrs; de lo contrario, no estarán disponibles para las reglas dependientes cuando la compilación esté en zona de pruebas (configuración predeterminada). |
linkopts
|
LINKOPTS antes de vincular el destino binario.
Se supone que cada elemento de esta lista que no comienza con |
linkstatic
|
cc_binary y cc_test : vincula el objeto binario en modo estático. Para cc_library.linkstatic : consulta a continuación.
De forma predeterminada, esta opción está activada para
Si se habilita y es un objeto binario o de prueba, esta opción le indica a la herramienta de compilación que se vincule con las bibliotecas de usuario de Existen tres formas diferentes de vincular un archivo ejecutable:
El atributo
Si es |
local_defines
|
-D y se agrega a la línea de comandos de compilación para este destino, pero no a sus dependientes.
|
malloc
|
De forma predeterminada, los objetos binarios de C++ están vinculados con |
nocopts
|
COPTS preexistente que coincida con esta expresión regular (incluidos los valores especificados de forma explícita en el atributo copts de la regla) se quitará de COPTS para compilar esta regla.
Rara vez se necesita este atributo.
|
stamp
|
Los objetos binarios sellados no se vuelven a compilar, a menos que cambien sus dependencias. |
win_def_file
|
Este atributo solo debe usarse cuando Windows es la plataforma seleccionada. Se puede usar para exportar símbolos durante la vinculación de una biblioteca compartida. |
cc_toolchain
cc_toolchain(name, all_files, ar_files, as_files, compatible_with, compiler, compiler_files, compiler_files_without_includes, coverage_files, cpu, deprecation, distribs, dwp_files, dynamic_runtime_lib, exec_transition_for_inputs, features, libc_top, licenses, linker_files, module_map, objcopy_files, restricted_to, static_runtime_lib, strip_files, supports_header_parsing, supports_param_files, tags, target_compatible_with, testonly, toolchain_config, toolchain_identifier, visibility)
Representa una cadena de herramientas de C++.
Esta regla es responsable de lo siguiente:
-
Recopilando todos los artefactos necesarios para que se ejecuten las acciones de C++. Esto se hace mediante atributos como
all_files
,compiler_files
,linker_files
y otros atributos que terminan en_files
, que suelen ser grupos de archivos que globalizan todos los archivos necesarios. -
Generación de líneas de comandos correctas para acciones de C++. Para ello, se usa el proveedor
CcToolchainConfigInfo
(consulta más detalles a continuación).
Usa el atributo toolchain_config
para configurar la cadena de herramientas de C++.
Consulta también esta
página
para ver documentación elaborada sobre la configuración de la cadena de herramientas de C++ y su selección.
Usa tags = ["manual"]
para evitar que las cadenas de herramientas se compilen y configuren innecesariamente cuando invoques bazel build //...
.
Argumentos
Atributos | |
---|---|
name |
Un nombre único para este destino. |
all_files
|
all_files es un superconjunto de todos los demás atributos que proporcionan artefactos (p.ej., la compilación de linktamp necesita archivos de compilación y vínculos, por lo que toma all_files ).
Esto es lo que contiene |
ar_files
|
Es una colección de todos los artefactos cc_toolchain necesarios para archivar acciones. |
as_files
|
Es una colección de todos los artefactos cc_toolchain necesarios para las acciones de ensamblado. |
compiler
|
toolchain_identifier . Será un nodo después de la
migración de CROSSTOOL a Starlark
y se quitará antes del #7075.
Cuando se establezca, se usará para realizar la selección de crosstool_config.toolchain. Tendrá prioridad sobre la opción --cpu Bazel. |
compiler_files
|
|
compiler_files_without_includes
|
|
coverage_files
|
|
cpu
|
Cuando se establezca, se usará para realizar la selección de crosstool_config.toolchain. Tendrá prioridad sobre la opción --cpu Bazel. |
dwp_files
|
|
dynamic_runtime_lib
|
Se usará cuando la función "static_link_cpp_runtimes" esté habilitada y vinculemos las dependencias de forma dinámica. |
exec_transition_for_inputs
|
|
libc_top
|
|
linker_files
|
|
module_map
|
|
objcopy_files
|
|
static_runtime_lib
|
Se usará cuando la función "static_link_cpp_runtimes" esté habilitada, y vinculamos las dependencias de forma estática. |
strip_files
|
|
supports_header_parsing
|
|
supports_param_files
|
|
toolchain_config
|
cc_toolchain_config_info .
|
toolchain_identifier
|
Hasta que se corrija el problema #5380, esta es la forma recomendada de asociar |
cc_toolchain_suite
cc_toolchain_suite(name, compatible_with, deprecation, distribs, features, licenses, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)
Representa una colección de cadenas de herramientas de C++.
Esta regla es responsable de lo siguiente:
- Recopilando todas las cadenas de herramientas de C++ relevantes.
-
Selecciona una cadena de herramientas en función de las opciones
--cpu
y--compiler
que se pasan a Bazel.
Consulta también esta página para ver documentación elaborada sobre la configuración de la cadena de herramientas de C++ y su selección.
Argumentos
Atributos | |
---|---|
name |
Un nombre único para este destino. |
toolchains
|
cc_toolchain . Se usará "<cpu>" cuando solo se pase --cpu
a Bazel, y "<cpu>|<compiler>" se usará cuando se pasen --cpu y --compiler a Bazel. Ejemplo:
cc_toolchain_suite( name = "toolchain", toolchains = { "piii|gcc": ":my_cc_toolchain_for_piii_using_gcc", "piii": ":my_cc_toolchain_for_piii_using_default_compiler", }, ) |