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)
Destinos de salida implícitos
name.stripped
(solo se compila si se solicita de forma explícita): Es un fragmento versión del objeto binario. Se ejecutastrip -g
en el objeto binario para quitar la depuración. símbolos. Se pueden proporcionar opciones adicionales de barra 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 La fisión está habilitada: una depuración archivo del paquete de información adecuado para depurar objetos binarios implementados de manera remota. De lo contrario, un archivo vacío.
Argumentos
Atributos | |
---|---|
name |
Un nombre único para este destino. |
deps
|
Pueden ser |
srcs
|
Se harán los cambios en todos los archivos No se compilará un archivo Todos los archivos Si el nombre de una regla está en el
Tipos de archivos
...al igual que las reglas que generan esos archivos. Las diferentes extensiones denotan diferentes lenguajes de programación en de acuerdo con la convención de GCC. |
additional_linker_inputs
|
Por ejemplo, aquí se pueden proporcionar archivos .res compilados de Windows para incorporarlos en el objeto binario. |
copts
|
Cada cadena de este atributo se agrega en el orden determinado a
Si el paquete declara la función
|
defines
|
-D y se agrega a la línea de comandos de compilación de este destino,
así como a cada regla que depende de él. Ten mucho cuidado, ya que esto podría haber
efectos de largo alcance. Si tienes dudas, agrega valores definidos a
local_defines en su lugar.
|
includes
|
Sujeto a la sustitución "Make variable".
Cada cadena está precedida por Se deben agregar encabezados a srcs o hdrs; de lo contrario, no estarán disponibles para los dependientes. cuando la compilación se encuentra en zona de pruebas (opción predeterminada). |
linkopts
|
LINKOPTS antes de
que vincula el objetivo binario.
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 |
linkstatic
|
cc_binary y
cc_test : vincula el objeto binario en 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 en
Usa En realidad, 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 explícitamente en el atributo copts de la regla) se quitarán del
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 de destino. 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) Vincula una biblioteca estática
cc_import( name = "mylib", hdrs = ["mylib.h"], static_library = "libmylib.a", # If alwayslink is turned on, # libmylib.a will be forcely linked into any binary that depends on it. # alwayslink = 1, )
cc_import( name = "mylib", hdrs = ["mylib.h"], shared_library = "libmylib.so", )
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", )
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, )
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, )
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, se debe a un problema conocido, actualiza tu versión de VS 2017 a la más reciente. |
interface_library
|
Tipos de archivos permitidos:
|
shared_library
|
Tipos de archivos permitidos:
|
static_library
|
Tipos de archivos permitidos:
|
system_provided
|
interface_library y
El campo shared_library debe estar vacío.
|
cc_library
cc_library(name, deps, srcs, data, hdrs, additional_compiler_inputs, additional_linker_inputs, 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 se deben declarar en el archivo hdrs
.
srcs
de cc_*
reglas. Esto se aplica de manera forzosa.
Para las reglas cc_library
, los encabezados en hdrs
conforman la interfaz pública de
la biblioteca y se puede incluir directamente desde los archivos de hdrs
y
srcs
de la propia biblioteca, así como de los archivos en hdrs
y
srcs
de cc_*
reglas que muestran la biblioteca en su deps
Los encabezados de srcs
solo se deben incluir directamente desde los archivos de hdrs
y srcs
de la propia biblioteca. Al decidir si poner un encabezado en
hdrs
o srcs
, debes preguntar si quieres que los consumidores de esta biblioteca
poder incluirlos directamente. Esta es más o menos la misma decisión que
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 la prueba
directamente debería aparecer en srcs
.
Para ilustrar estas reglas, mira el siguiente ejemplo.
cc_binary( name = "foo", srcs = [ "foo.cc", "foo.h", ], deps = [":bar"], ) cc_library( name = "bar", srcs = [ "bar.cc", "bar-impl.h", ], hdrs = ["bar.h"], deps = [":baz"], ) cc_library( name = "baz", srcs = [ "baz.cc", "baz-impl.h", ], hdrs = ["baz.h"], )
Las inclusiones directas permitidas en este ejemplo se enumeran en la siguiente tabla. Por ejemplo:
foo.cc
puede incluir directamente foo.h
y bar.h
, pero
no baz.h
.
Incluyendo 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 solicitudes directas
inclusiones. En el ejemplo anterior, se permite que foo.cc
incluir bar.h
, que puede incluir baz.h
, que en
giro está permitido incluir baz-impl.h
. Técnicamente, el
La compilación de un archivo .cc
puede incluir de forma transitiva cualquier encabezado
en el archivo hdrs
o srcs
en
cualquier cc_library
en el cierre transitivo deps
En
En este caso, el compilador puede leer baz.h
y baz-impl.h
.
cuando se compila foo.cc
, pero foo.cc
no debe
contienen #include "baz.h"
. Para que eso sea
permitido, baz
se debe agregar a deps
de foo
.
Lamentablemente, en este momento Bazel no puede distinguir entre directo y transitivo.
inclusiones, por lo que no puede detectar casos de error en los que un archivo incluya ilegalmente
que solo se puede incluir transitivamente. Por ejemplo:
Bazel no se quejaría si en el ejemplo anterior foo.cc
directamente.
incluye baz.h
. Esto sería ilegal porque foo
no depende directamente de baz
. Actualmente, no se producen errores
en ese caso, pero es posible que se agregue esa comprobación de errores en el futuro.
Argumentos
Atributos | |
---|---|
name |
Un nombre único para este destino. |
deps
|
Pueden ser |
srcs
|
Se harán los cambios en todos los archivos No se compilará un archivo Todos los archivos Si el nombre de una regla está en el
Tipos de archivos
...al igual que las reglas que generan esos archivos. Las diferentes extensiones denotan diferentes lenguajes de programación en de acuerdo con la convención de GCC. |
hdrs
|
Esta es la ubicación más recomendable para declarar archivos de encabezado que
describen la interfaz de la biblioteca. Estos encabezados tendrán
disponibles para que las incluyan las fuentes en esta regla o en reglas dependientes.
Los encabezados que no sean incluidos por un cliente de esta biblioteca deben ser
en el atributo |
additional_compiler_inputs
|
|
additional_linker_inputs
|
Por ejemplo, aquí se pueden proporcionar archivos .res compilados de Windows para incorporarlos en el objeto binario. |
alwayslink
|
srcs , incluso si algunos no contienen símbolos a los que hace referencia el objeto binario.
Esto es útil si no se llama explícitamente a tu código en
el objeto binario, p.ej., si tu código se registra para recibir alguna devolución de llamada
proporcionados por algún servicio.
Si Alwayslink no funciona con VS 2017 en Windows, se debe a un problema conocido, actualiza tu versión de VS 2017 a la más reciente. |
copts
|
Cada cadena de este atributo se agrega en el orden determinado a
Si el paquete declara la función
|
defines
|
-D y se agrega a la línea de comandos de compilación de este destino,
así como a cada regla que depende de él. Ten mucho cuidado, ya que esto podría haber
efectos de largo alcance. Si tienes dudas, agrega valores definidos a
local_defines en su lugar.
|
implementation_deps
|
deps , los encabezados y las rutas de acceso de inclusión de estas bibliotecas (y todas sus
dependencias transitivas) solo se usan para compilar esta biblioteca, no las bibliotecas que
dependen de él. Las bibliotecas especificadas con implementation_deps siguen vinculadas en
objetivos binarios que dependen de esta biblioteca.
Por ahora, el uso se limita a cc_bibliotecas y está protegido por la función experimental
|
include_prefix
|
Cuando se establece, se puede acceder a los encabezados en el atributo Se quitó el prefijo del atributo |
includes
|
Sujeto a la sustitución "Make variable".
Cada cadena está precedida por Se deben agregar encabezados a srcs o hdrs; de lo contrario, no estarán disponibles para los dependientes. cuando la compilación se encuentra en zona de pruebas (opción predeterminada). |
linkopts
|
LINKOPTS antes de
que vincula el objetivo binario.
Cada elemento de esta lista que no comienza con |
linkstamp
|
base .
|
linkstatic
|
cc_binary y
cc_test : vincula el objeto binario en 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 en
Usa En realidad, 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 explícitamente en el atributo copts de la regla) se quitarán del
COPTS para compilar esta regla.
Rara vez se necesita este atributo.
|
strip_include_prefix
|
Cuando se establece, se puede acceder a los encabezados en el atributo Si es una ruta de acceso relativa, se toma como una ruta relativa de paquete. Si se trata de un dato absoluto, se entiende como una ruta de acceso relativa al repositorio. El prefijo del atributo |
textual_hdrs
|
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 de origen para crear código. |
win_def_file
|
Este atributo solo debe usarse cuando Windows es la plataforma de destino. 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 las 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 generar el código 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 un estado especificado ruta de acceso absoluta. 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 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 Propeller en el lugar de trabajo. Ejemplo:
propeller_optimize( name = "layout", cc_profile = "//path:cc_profile.txt", ld_profile = "//path:ld_profile.txt" ) propeller_optimize( name = "layout_absolute", absolute_cc_profile = "/absolute/cc_profile.txt", absolute_ld_profile = "/absolute/ld_profile.txt" )
Argumentos
Atributos | |
---|---|
name |
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
|
Pueden ser |
srcs
|
Se harán los cambios en todos los archivos No se compilará un archivo Todos los archivos Si el nombre de una regla está en el
Tipos de archivos
...al igual que las reglas que generan esos archivos. Las diferentes extensiones denotan diferentes lenguajes de programación en de acuerdo con la convención de GCC. |
additional_linker_inputs
|
Por ejemplo, aquí se pueden proporcionar archivos .res compilados de Windows para incorporarlos en el objeto binario. |
copts
|
Cada cadena de este atributo se agrega en el orden determinado a
Si el paquete declara la función
|
defines
|
-D y se agrega a la línea de comandos de compilación de este destino,
así como a cada regla que depende de él. Ten mucho cuidado, ya que esto podría haber
efectos de largo alcance. Si tienes dudas, agrega valores definidos a
local_defines en su lugar.
|
includes
|
Sujeto a la sustitución "Make variable".
Cada cadena está precedida por Se deben agregar encabezados a srcs o hdrs; de lo contrario, no estarán disponibles para los dependientes. cuando la compilación se encuentra en zona de pruebas (opción predeterminada). |
linkopts
|
LINKOPTS antes de
que vincula el objetivo binario.
Cada elemento de esta lista que no comienza con |
linkstatic
|
cc_binary y
cc_test : vincula el objeto binario en 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 en
Usa En realidad, 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 explícitamente en el atributo copts de la regla) se quitarán del
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 de destino. 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:
-
Recopila todos los artefactos necesarios para que se ejecuten las acciones de C++. Esto lo hace
atributos, como
all_files
,compiler_files
linker_files
o algún otro atributo que termina en_files
). Son por lo general, los grupos de archivos que globalizan todos los archivos necesarios. -
Generando líneas de comandos correctas para las acciones de C++. Esto se hace usando
CcToolchainConfigInfo
proveedor (más detalles a continuación).
Usa el atributo toolchain_config
para configurar la cadena de herramientas de C++.
Ver también esto
página
para obtener documentación elaborada de la cadena de herramientas de C++ y de la selección de la cadena de herramientas.
Usa tags = ["manual"]
para evitar que se compilen y configuren cadenas de herramientas.
innecesariamente cuando se invoca 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 huella de vínculos necesita compilación
y archivos de vínculo, 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á una noop
después de
Migración CROSSTOOL a Starlark
y se quitará el
#7075:
Cuando se establece, se usa para realizar la selección crosstool_config.toolchain. Llevará prioridad sobre la opción --cpu de Bazel. |
compiler_files
|
|
compiler_files_without_includes
|
|
coverage_files
|
|
cpu
|
Cuando se establece, se usa para realizar la selección crosstool_config.toolchain. Llevará prioridad sobre la opción --cpu de Bazel. |
dwp_files
|
|
dynamic_runtime_lib
|
Se usará cuando “static_link_cpp_runtimes” está habilitada y vincularemos dependencias de forma dinámica. |
exec_transition_for_inputs
|
|
libc_top
|
|
linker_files
|
|
module_map
|
|
objcopy_files
|
|
static_runtime_lib
|
Se usará cuando “static_link_cpp_runtimes” está habilitada y vincularemos 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:
- Recopilar todas las cadenas de herramientas de C++ relevantes.
-
Selección de una cadena de herramientas según las opciones
--cpu
y--compiler
pasan a Bazel.
Ver también esto página para obtener documentación elaborada de la cadena de herramientas de C++ y de la selección de la cadena de herramientas.
Argumentos
Atributos | |
---|---|
name |
Un nombre único para este destino. |
toolchains
|
cc_toolchain “<cpu>” se usará cuando solo --cpu
se pasa a Bazel, y “<cpu>|<compiler>” cuando se usan tanto
--cpu y --compiler se pasan 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", }, ) |