Reglas C y C++

Reglas

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

Name; required

Un nombre único para este destino.

deps

List of labels; optional

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

Pueden ser cc_library o objc_library. objetivos.

srcs

List of labels; optional

La lista de archivos C y C++ que se procesan para crear el destino. Estos son archivos de origen y encabezado C/C++, ya sean no generados (fuente normal) código) o que se generó.

Se harán los cambios en todos los archivos .cc, .c y .cpp compilarse. Estos pueden ser archivos generados: si un archivo nombrado se encuentra en el outs de otra regla, esta regla dependerá automáticamente de esa otra regla.

No se compilará un archivo .h, pero estará disponible para la inclusión por fuentes en esta regla. Tanto .cc como Los archivos .h pueden incluir directamente los encabezados enumerados en estos srcs o en el hdrs de cualquier regla que se mencione en el argumento deps.

Todos los archivos #included deben mencionarse en el srcs de esta regla o en la Atributo hdrs de los cc_library() a los que se hace referencia. El estilo recomendado es que los encabezados asociados con una biblioteca sean en el atributo hdrs de esa biblioteca y cualquier encabezados asociados con las fuentes de esta regla que se incluirán en srcs Consulta "Verificación de inclusión de encabezados" para obtener una descripción más detallada.

Si el nombre de una regla está en el srcs, esta regla automáticamente depende de esa regla. Si los outs de la regla nombrada son C o C++ de origen, se compilan en esta regla. si son archivos de la biblioteca, están vinculados.

Tipos de archivos srcs permitidos:

  • Archivos de origen C y C++: .c, .cc, .cpp, .cxx, .c++ y .C
  • Archivos de encabezado C y C++: .h, .hh, .hpp, .hxx, .inc, .inl y .H
  • Ensamblador con preprocesador en C: .S
  • Archivo: .a, .pic.a
  • "Vincular siempre" biblioteca: .lo, .pic.lo
  • Biblioteca compartida, con o sin versiones: .so, .so.version
  • Archivo de objeto: .o, .pic.o

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

List of labels; optional

Pasa estos archivos al comando del vinculador de C++.

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

copts

List of strings; optional

Agrega estas opciones al comando de compilación de C++. Con la sustitución "Make variable" y Asignación de token de shell de Bourne.

Cada cadena de este atributo se agrega en el orden determinado a COPTS antes de compilando el objetivo binario. Las marcas solo tienen efecto en la compilación de este destino, no sus dependencias, por lo que debes tener cuidado con los archivos de encabezado que se incluyan en otro lugar. Todas las rutas de acceso deben debe estar relacionada con el lugar de trabajo, no con el paquete actual.

Si el paquete declara la función no_copts_tokenization: La asignación de token de shell de Bourne se aplica solo a las cadenas. que constan de un solo “Marca” de salida.

defines

List of strings; optional

Lista de definiciones para agregar a la línea de compilación. Sujeto a "Marca" de variable y Asignación de token de shell de Bourne. Cada cadena, que debe constar de un solo token de shell de Bourne, se antepone -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

List of strings; optional

Lista de dir de inclusión que se agregarán a la línea de compilación.

Sujeto a la sustitución "Make variable". Cada cadena está precedida por -isystem y se agrega a COPTS. A diferencia de COPTS, estas marcas se agregan a esta regla. y cada regla que depende de él. (Nota: No depende de las reglas de las que depende). Sé esto puede tener efectos de largo alcance. Si tienes dudas, agrega “-I” a COPTS.

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

List of strings; optional

Agrega estas marcas al comando del vinculador de C++. Sujeto a "Marca" de variable, la asignación de token de shell de Bourne y expansión de etiquetas. Cada cadena de este atributo se agrega a LINKOPTS antes de que vincula el objetivo binario.

Cada elemento de esta lista que no comienza con $ o - se se supone que es la etiqueta de un objetivo en deps. El La lista de archivos que genera ese destino se agrega al vinculador opciones de estado. Se informa un error si la etiqueta no es válida o no se declaró en deps.

linkshared

Boolean; optional; nonconfigurable; default is False

Crea una biblioteca compartida. Para habilitar este atributo, incluye linkshared=True en tu regla. De forma predeterminada esta opción está desactivada.

La presencia de esta marca significa que la vinculación se produce con la marca -shared. en gcc, y la biblioteca compartida resultante es adecuada para la carga en ejemplo, un programa de Java. Sin embargo, para fines de compilación, nunca se vinculará con binario dependiente, ya que se supone que las bibliotecas compartidas cc_binary solo las cargan manualmente otros programas, por lo que No debe considerarse un sustituto de cc_library. . Por motivos de escalabilidad, recomendamos evitar este enfoque por completo simplemente permitiendo que java_library dependa de las reglas cc_library en su lugar.

Si especificas linkopts=['-static'] y linkshared=True, obtienes una sola unidad completamente independiente. Si especificas ambos linkstatic=True y linkshared=True, obtienes un solo clic, mayormente unidad independiente.

linkstatic

Boolean; optional; default is True

Para 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 cc_binary y desactivada para el resto.

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 .a en lugar de .so para las bibliotecas de usuario siempre que sea posible. Algunas bibliotecas del sistema pueden seguir vinculadas de forma dinámica, al igual que las bibliotecas para las cuales no hay una biblioteca estática. Por lo tanto, el ejecutable resultante seguirá siendo dinámico vinculadas, por lo que solo son mayormente estáticas.

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

  • STATIC con el atributo full_static_link, en el que todo está vinculado estáticamente; p.ej., “gcc -static foo.o libbar.a libbaz.a -lm”.
    Este modo se habilita especificando fully_static_link en el atributo features.
  • ESTÁTICA, en la que todas las bibliotecas de usuario están vinculadas estáticamente (si un elemento está disponible), pero donde las bibliotecas del sistema (excluidas las bibliotecas en tiempo de ejecución C/C++) se vinculan de forma dinámica; p.ej., “gcc foo.o libfoo.a libbaz.a -lm”.
    Para habilitar este modo, debes especificar linkstatic=True.
  • DINÁMICA, en la que todas las bibliotecas se vinculan de forma dinámica (si se trata de una versión disponibles), p.ej., “gcc foo.o libfoo.so libbaz.so -lm”.
    Para habilitar este modo, debes especificar linkstatic=False.

El atributo linkstatic tiene un significado diferente si se usa en un Regla cc_library(). Para una biblioteca C++, linkstatic=True indica que solo Se permite la vinculación estática, por lo que no se producirá un .so. linkstatic=Falso hace no impide la creación de bibliotecas estáticas. El atributo sirve para controlar el la creación de bibliotecas dinámicas.

Si es linkstatic=False, la herramienta de compilación creará symlinks a depende de bibliotecas compartidas en el área *.runfiles.

local_defines

List of strings; optional

Lista de definiciones para agregar a la línea de compilación. Sujeto a "Marca" de variable y Asignación de token de shell de Bourne. Cada cadena, que debe constar de un solo token de shell de Bourne, se antepone -D y se agrega a la línea de comandos de compilación para este destino, pero no a sus dependientes.
malloc

Label; optional; default is @bazel_tools//tools/cpp:malloc

Anula la dependencia predeterminada en malloc.

De forma predeterminada, los objetos binarios de C++ están vinculados con //tools/cpp:malloc. que es una biblioteca vacía, por lo que el objeto binario termina usando libc malloc. Esta etiqueta debe hacer referencia a un cc_library. Si la compilación es para una compilación que no es de C++ regla, esta opción no tiene efecto. El valor de este atributo se ignora si Se especifica linkshared=True.

nocopts

String; optional

Se quitaron las opciones coincidentes del comando de compilación de C++. Sujeto a "Marca" de variables. El valor de este atributo se interpreta como una expresión regular. Cualquier COPTS preexistente que coincida con esta expresión regular (incluidos los valores especificados explícitamente en el atributo copts de la regla) se quitarán del COPTS para compilar esta regla. Rara vez se necesita este atributo.
stamp

Integer; optional; default is -1

Establece si se debe codificar información de compilación en el objeto binario. Valores posibles:
  • stamp = 1: Siempre marca la información de la compilación en el objeto binario, incluso en --nostamp. Este de configuración debe evitarse, ya que puede finalizar el almacenamiento en caché remoto binario y las acciones descendentes que dependan de él.
  • stamp = 0: Siempre reemplaza la información de compilación por valores constantes. Esta brinda un buen almacenamiento en caché de resultados de compilación.
  • stamp = -1: la incorporación de la información de la compilación está controlada por el --[no]stamp.

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

win_def_file

Label; optional

El archivo DEF de Windows que se pasará al vinculador.

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

Name; required

Un nombre único para este destino.

hdrs

List of labels; optional

La lista de archivos de encabezado publicados por esta biblioteca precompilada para que las fuentes la incluyan directamente en reglas dependientes.

Boolean; optional; default is False

Si es 1, cualquier objeto binario que depende (directa o indirectamente) de este C++ ya compilada se vincularán con todos los archivos de objetos archivados en la biblioteca estática incluso si algunos no contienen símbolos a los que el binario hace referencia. 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.

interface_library

Label; optional

Una biblioteca de interfaz única para vincular la biblioteca compartida.

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

shared_library

Label; optional

Una única biblioteca compartida precompilada Bazel se asegura de que esté disponible para el binario que depende de él durante el tiempo de ejecución.

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

static_library

Label; optional

Una única biblioteca estática precompilada

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

system_provided

Boolean; optional; default is False

Si es 1, indica que el sistema proporciona la biblioteca compartida requerida en el tiempo de ejecución. En este caso, se debe especificar interface_library y El campo shared_library debe estar vacío.

cc_library

cc_library(name, deps, srcs, data, hdrs, additional_compiler_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 archivoInclusiones permitidas
foo.hbar.h
foo.ccfoo.h bar.h
bar.hbar-impl.h baz.h
bar-impl.hbar.h baz.h
bar.ccbar.h bar-impl.h baz.h
baz.hbaz-impl.h
baz-impl.hbaz.h
baz.ccbaz.h baz-impl.h

Las reglas de verificación de inclusión solo se aplican a las 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

Name; required

Un nombre único para este destino.

deps

List of labels; optional

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

Pueden ser cc_library o objc_library. objetivos.

srcs

List of labels; optional

La lista de archivos C y C++ que se procesan para crear el destino. Estos son archivos de origen y encabezado C/C++, ya sean no generados (fuente normal) código) o que se generó.

Se harán los cambios en todos los archivos .cc, .c y .cpp compilarse. Estos pueden ser archivos generados: si un archivo nombrado se encuentra en el outs de otra regla, esta regla dependerá automáticamente de esa otra regla.

No se compilará un archivo .h, pero estará disponible para la inclusión por fuentes en esta regla. Tanto .cc como Los archivos .h pueden incluir directamente los encabezados enumerados en estos srcs o en el hdrs de cualquier regla que se mencione en el argumento deps.

Todos los archivos #included deben mencionarse en el srcs de esta regla o en la Atributo hdrs de los cc_library() a los que se hace referencia. El estilo recomendado es que los encabezados asociados con una biblioteca sean en el atributo hdrs de esa biblioteca y cualquier encabezados asociados con las fuentes de esta regla que se incluirán en srcs Consulta "Verificación de inclusión de encabezados" para obtener una descripción más detallada.

Si el nombre de una regla está en el srcs, esta regla automáticamente depende de esa regla. Si los outs de la regla nombrada son C o C++ de origen, se compilan en esta regla. si son archivos de la biblioteca, están vinculados.

Tipos de archivos srcs permitidos:

  • Archivos de origen C y C++: .c, .cc, .cpp, .cxx, .c++ y .C
  • Archivos de encabezado C y C++: .h, .hh, .hpp, .hxx, .inc, .inl y .H
  • Ensamblador con preprocesador en C: .S
  • Archivo: .a, .pic.a
  • "Vincular siempre" biblioteca: .lo, .pic.lo
  • Biblioteca compartida, con o sin versiones: .so, .so.version
  • Archivo de objeto: .o, .pic.o

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

List of labels; optional

La lista de archivos de encabezado publicados por esta biblioteca para que la incluyan directamente las fuentes en las reglas dependientes.

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 srcs, incluso si están se incluye en un encabezado publicado. Consulta "Inclusión de encabezados" verificación" para obtener una descripción más detallada.

additional_compiler_inputs

List of labels; optional

Cualquier archivo adicional que quieras pasar a la línea de comandos del compilador, como sanitizer listas de elementos ignorados, por ejemplo. Los archivos especificados aquí se pueden utilizar en copias con la función $(location).

Boolean; optional; default is False

Si es 1, cualquier objeto binario que depende (directa o indirectamente) de este C++ biblioteca vinculará todos los archivos de objeto de los archivos enumerados en 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

List of strings; optional

Agrega estas opciones al comando de compilación de C++. Con la sustitución "Make variable" y Asignación de token de shell de Bourne.

Cada cadena de este atributo se agrega en el orden determinado a COPTS antes de compilando el objetivo binario. Las marcas solo tienen efecto en la compilación de este destino, no sus dependencias, por lo que debes tener cuidado con los archivos de encabezado que se incluyan en otro lugar. Todas las rutas de acceso deben debe estar relacionada con el lugar de trabajo, no con el paquete actual.

Si el paquete declara la función no_copts_tokenization: La asignación de token de shell de Bourne se aplica solo a las cadenas. que constan de un solo “Marca” de salida.

defines

List of strings; optional

Lista de definiciones para agregar a la línea de compilación. Sujeto a "Marca" de variable y Asignación de token de shell de Bourne. Cada cadena, que debe constar de un solo token de shell de Bourne, se antepone -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

List of labels; optional

Es la lista de otras bibliotecas de las que depende la biblioteca objetivo. Desmarcar Me gusta con 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 --experimental_cc_implementation_deps

include_prefix

String; optional

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

Cuando se establece, se puede acceder a los encabezados en el atributo hdrs de esta regla arroba es el valor de este atributo antepuesto a su ruta de acceso relativa del repositorio.

Se quitó el prefijo del atributo strip_include_prefix antes de este se agregó el prefijo.

includes

List of strings; optional

Lista de dir de inclusión que se agregarán a la línea de compilación.

Sujeto a la sustitución "Make variable". Cada cadena está precedida por -isystem y se agrega a COPTS. A diferencia de COPTS, estas marcas se agregan a esta regla. y cada regla que depende de él. (Nota: No depende de las reglas de las que depende). Sé esto puede tener efectos de largo alcance. Si tienes dudas, agrega “-I” a COPTS.

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

List of strings; optional

Agrega estas marcas al comando del vinculador de C++. Sujeto a "Marca" de variable, la asignación de token de shell de Bourne y expansión de etiquetas. Cada cadena de este atributo se agrega a LINKOPTS antes de que vincula el objetivo binario.

Cada elemento de esta lista que no comienza con $ o - se se supone que es la etiqueta de un objetivo en deps. El La lista de archivos que genera ese destino se agrega al vinculador opciones de estado. Se informa un error si la etiqueta no es válida o no se declaró en deps.

linkstamp

Label; optional

De manera simultánea, compila y vincula el archivo de origen C++ especificado en la versión final binario. Este trucos es necesario para ingresar una marca de tiempo información en binarios; si compilamos el archivo fuente en un objeto de la manera usual, la marca de tiempo sería incorrecta. Una compilación de sellos de enlace no puede incluir ningún conjunto particular de indicadores de compilador y, por lo tanto, no deberían depender de ninguna configuración encabezado, opción de compilador y otra variable de compilación. Esta opción solo debería ser necesaria Paquete base.
linkstatic

Boolean; optional; default is False

Para 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 cc_binary y desactivada para el resto.

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 .a en lugar de .so para las bibliotecas de usuario siempre que sea posible. Algunas bibliotecas del sistema pueden seguir vinculadas de forma dinámica, al igual que las bibliotecas para las cuales no hay una biblioteca estática. Por lo tanto, el ejecutable resultante seguirá siendo dinámico vinculadas, por lo que solo son mayormente estáticas.

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

  • STATIC con el atributo full_static_link, en el que todo está vinculado estáticamente; p.ej., “gcc -static foo.o libbar.a libbaz.a -lm”.
    Este modo se habilita especificando fully_static_link en el atributo features.
  • ESTÁTICA, en la que todas las bibliotecas de usuario están vinculadas estáticamente (si un elemento está disponible), pero donde las bibliotecas del sistema (excluidas las bibliotecas en tiempo de ejecución C/C++) se vinculan de forma dinámica; p.ej., “gcc foo.o libfoo.a libbaz.a -lm”.
    Para habilitar este modo, debes especificar linkstatic=True.
  • DINÁMICA, en la que todas las bibliotecas se vinculan de forma dinámica (si se trata de una versión disponibles), p.ej., “gcc foo.o libfoo.so libbaz.so -lm”.
    Para habilitar este modo, debes especificar linkstatic=False.

El atributo linkstatic tiene un significado diferente si se usa en un Regla cc_library(). Para una biblioteca C++, linkstatic=True indica que solo Se permite la vinculación estática, por lo que no se producirá un .so. linkstatic=Falso hace no impide la creación de bibliotecas estáticas. El atributo sirve para controlar el la creación de bibliotecas dinámicas.

Si es linkstatic=False, la herramienta de compilación creará symlinks a depende de bibliotecas compartidas en el área *.runfiles.

local_defines

List of strings; optional

Lista de definiciones para agregar a la línea de compilación. Sujeto a "Marca" de variable y Asignación de token de shell de Bourne. Cada cadena, que debe constar de un solo token de shell de Bourne, se antepone -D y se agrega a la línea de comandos de compilación para este destino, pero no a sus dependientes.
nocopts

String; optional

Se quitaron las opciones coincidentes del comando de compilación de C++. Sujeto a "Marca" de variables. El valor de este atributo se interpreta como una expresión regular. Cualquier COPTS preexistente que coincida con esta expresión regular (incluidos los valores especificados explícitamente en el atributo copts de la regla) se quitarán del COPTS para compilar esta regla. Rara vez se necesita este atributo.
strip_include_prefix

String; optional

El prefijo para quitar las rutas de acceso de los encabezados de esta regla.

Cuando se establece, se puede acceder a los encabezados en el atributo hdrs de esta regla en su ruta con el prefijo cortado.

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 include_prefix se agrega después de que este prefijo despojado.

textual_hdrs

List of labels; optional

La lista de archivos de encabezado publicados por esta biblioteca para que las fuentes la incluyan textualmente en reglas dependientes.

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

win_def_file

Label; optional

El archivo DEF de Windows que se pasará al vinculador.

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

Name; required

Un nombre único para este destino.

deps

List of labels; optional

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

Name; required

Un nombre único para este destino.

profile

Label; optional

Etiqueta del perfil de sugerencias. El archivo de sugerencias tiene la extensión .afdo. La etiqueta también puede apuntar a una regla de perfil fdo_ muchísima_ruta.

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

Name; required

Un nombre único para este destino.

absolute_path_profile

String; optional

Ruta de acceso absoluta al perfil de FDO. El archivo FDO puede tener una de las siguientes extensiones: .profraw para el perfil de LLVM no indexado, .profdata para el perfil de LLVM indexado, .zip que contenga un perfil profraw de LLVM o .afdo para el perfil de AutoFDO.
profile

Label; optional

Etiqueta del perfil de FDO o una regla que lo genera. El archivo FDO puede tener uno de los Las siguientes extensiones: .profraw para el perfil de LLVM no indexado, .profdata para el LLVM indexado .zip que contiene un perfil profraw de LLVM, .afdo para el perfil de AutoFDO y .xfdo para el perfil perfil de XBinary. La etiqueta también puede apuntar a una regla de perfil fdo_ muchísima_ruta.
proto_profile

Label; optional

Etiqueta del perfil de protobuf.

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

Name; required

Un nombre único para este destino.

ld_profile

Label; optional

Etiqueta del perfil que se pasa a la acción de vinculación. Este archivo contiene la extensión .txt.

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

Name; required

Un nombre único para este destino.

deps

List of labels; optional

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

Pueden ser cc_library o objc_library. objetivos.

srcs

List of labels; optional

La lista de archivos C y C++ que se procesan para crear el destino. Estos son archivos de origen y encabezado C/C++, ya sean no generados (fuente normal) código) o que se generó.

Se harán los cambios en todos los archivos .cc, .c y .cpp compilarse. Estos pueden ser archivos generados: si un archivo nombrado se encuentra en el outs de otra regla, esta regla dependerá automáticamente de esa otra regla.

No se compilará un archivo .h, pero estará disponible para la inclusión por fuentes en esta regla. Tanto .cc como Los archivos .h pueden incluir directamente los encabezados enumerados en estos srcs o en el hdrs de cualquier regla que se mencione en el argumento deps.

Todos los archivos #included deben mencionarse en el srcs de esta regla o en la Atributo hdrs de los cc_library() a los que se hace referencia. El estilo recomendado es que los encabezados asociados con una biblioteca sean en el atributo hdrs de esa biblioteca y cualquier encabezados asociados con las fuentes de esta regla que se incluirán en srcs Consulta "Verificación de inclusión de encabezados" para obtener una descripción más detallada.

Si el nombre de una regla está en el srcs, esta regla automáticamente depende de esa regla. Si los outs de la regla nombrada son C o C++ de origen, se compilan en esta regla. si son archivos de la biblioteca, están vinculados.

Tipos de archivos srcs permitidos:

  • Archivos de origen C y C++: .c, .cc, .cpp, .cxx, .c++ y .C
  • Archivos de encabezado C y C++: .h, .hh, .hpp, .hxx, .inc, .inl y .H
  • Ensamblador con preprocesador en C: .S
  • Archivo: .a, .pic.a
  • "Vincular siempre" biblioteca: .lo, .pic.lo
  • Biblioteca compartida, con o sin versiones: .so, .so.version
  • Archivo de objeto: .o, .pic.o

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

List of labels; optional

Pasa estos archivos al comando del vinculador de C++.

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

copts

List of strings; optional

Agrega estas opciones al comando de compilación de C++. Con la sustitución "Make variable" y Asignación de token de shell de Bourne.

Cada cadena de este atributo se agrega en el orden determinado a COPTS antes de compilando el objetivo binario. Las marcas solo tienen efecto en la compilación de este destino, no sus dependencias, por lo que debes tener cuidado con los archivos de encabezado que se incluyan en otro lugar. Todas las rutas de acceso deben debe estar relacionada con el lugar de trabajo, no con el paquete actual.

Si el paquete declara la función no_copts_tokenization: La asignación de token de shell de Bourne se aplica solo a las cadenas. que constan de un solo “Marca” de salida.

defines

List of strings; optional

Lista de definiciones para agregar a la línea de compilación. Sujeto a "Marca" de variable y Asignación de token de shell de Bourne. Cada cadena, que debe constar de un solo token de shell de Bourne, se antepone -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

List of strings; optional

Lista de dir de inclusión que se agregarán a la línea de compilación.

Sujeto a la sustitución "Make variable". Cada cadena está precedida por -isystem y se agrega a COPTS. A diferencia de COPTS, estas marcas se agregan a esta regla. y cada regla que depende de él. (Nota: No depende de las reglas de las que depende). Sé esto puede tener efectos de largo alcance. Si tienes dudas, agrega “-I” a COPTS.

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

List of strings; optional

Agrega estas marcas al comando del vinculador de C++. Sujeto a "Marca" de variable, la asignación de token de shell de Bourne y expansión de etiquetas. Cada cadena de este atributo se agrega a LINKOPTS antes de que vincula el objetivo binario.

Cada elemento de esta lista que no comienza con $ o - se se supone que es la etiqueta de un objetivo en deps. El La lista de archivos que genera ese destino se agrega al vinculador opciones de estado. Se informa un error si la etiqueta no es válida o no se declaró en deps.

linkstatic

Boolean; optional; default is False

Para 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 cc_binary y desactivada para el resto.

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 .a en lugar de .so para las bibliotecas de usuario siempre que sea posible. Algunas bibliotecas del sistema pueden seguir vinculadas de forma dinámica, al igual que las bibliotecas para las cuales no hay una biblioteca estática. Por lo tanto, el ejecutable resultante seguirá siendo dinámico vinculadas, por lo que solo son mayormente estáticas.

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

  • STATIC con el atributo full_static_link, en el que todo está vinculado estáticamente; p.ej., “gcc -static foo.o libbar.a libbaz.a -lm”.
    Este modo se habilita especificando fully_static_link en el atributo features.
  • ESTÁTICA, en la que todas las bibliotecas de usuario están vinculadas estáticamente (si un elemento está disponible), pero donde las bibliotecas del sistema (excluidas las bibliotecas en tiempo de ejecución C/C++) se vinculan de forma dinámica; p.ej., “gcc foo.o libfoo.a libbaz.a -lm”.
    Para habilitar este modo, debes especificar linkstatic=True.
  • DINÁMICA, en la que todas las bibliotecas se vinculan de forma dinámica (si se trata de una versión disponibles), p.ej., “gcc foo.o libfoo.so libbaz.so -lm”.
    Para habilitar este modo, debes especificar linkstatic=False.

El atributo linkstatic tiene un significado diferente si se usa en un Regla cc_library(). Para una biblioteca C++, linkstatic=True indica que solo Se permite la vinculación estática, por lo que no se producirá un .so. linkstatic=Falso hace no impide la creación de bibliotecas estáticas. El atributo sirve para controlar el la creación de bibliotecas dinámicas.

Si es linkstatic=False, la herramienta de compilación creará symlinks a depende de bibliotecas compartidas en el área *.runfiles.

local_defines

List of strings; optional

Lista de definiciones para agregar a la línea de compilación. Sujeto a "Marca" de variable y Asignación de token de shell de Bourne. Cada cadena, que debe constar de un solo token de shell de Bourne, se antepone -D y se agrega a la línea de comandos de compilación para este destino, pero no a sus dependientes.
malloc

Label; optional; default is @bazel_tools//tools/cpp:malloc

Anula la dependencia predeterminada en malloc.

De forma predeterminada, los objetos binarios de C++ están vinculados con //tools/cpp:malloc. que es una biblioteca vacía, por lo que el objeto binario termina usando libc malloc. Esta etiqueta debe hacer referencia a un cc_library. Si la compilación es para una compilación que no es de C++ regla, esta opción no tiene efecto. El valor de este atributo se ignora si Se especifica linkshared=True.

nocopts

String; optional

Se quitaron las opciones coincidentes del comando de compilación de C++. Sujeto a "Marca" de variables. El valor de este atributo se interpreta como una expresión regular. Cualquier COPTS preexistente que coincida con esta expresión regular (incluidos los valores especificados explícitamente en el atributo copts de la regla) se quitarán del COPTS para compilar esta regla. Rara vez se necesita este atributo.
stamp

Integer; optional; default is 0

Establece si se debe codificar información de compilación en el objeto binario. Valores posibles:
  • stamp = 1: Siempre marca la información de la compilación en el objeto binario, incluso en --nostamp. Este de configuración debe evitarse, ya que puede finalizar el almacenamiento en caché remoto binario y las acciones descendentes que dependan de él.
  • stamp = 0: Siempre reemplaza la información de compilación por valores constantes. Esta brinda un buen almacenamiento en caché de resultados de compilación.
  • stamp = -1: la incorporación de la información de la compilación está controlada por el --[no]stamp.

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

win_def_file

Label; optional

El archivo DEF de Windows que se pasará al vinculador.

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

Name; required

Un nombre único para este destino.

all_files

Label; required

Es una colección de todos los artefactos de cc_toolchain. Estos artefactos se agregarán como entradas a todos acciones relacionadas con rules_cc (con la excepción de las acciones que usen conjuntos más precisos de artefactos de los atributos que se indican a continuación). Bazel supone que all_files es un superconjunto. de todos los demás atributos que proporcionan artefactos (p.ej., la compilación de huella de vínculos necesita compilación y archivos de vínculo, por lo que toma all_files).

Esto es lo que contiene cc_toolchain.files, y todo Starlark lo usa. con la cadena de herramientas de C++.

ar_files

Label; optional

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

as_files

Label; optional

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

compiler

String; optional; nonconfigurable

Obsoleta. En su lugar, usa el atributo 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

Label; required

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

Label; optional

Es una colección de todos los artefactos cc_toolchain necesarios para las acciones de compilación en caso de que ocurra lo siguiente: es compatible con el descubrimiento de entradas (por el momento, solo es compatible con Google).
coverage_files

Label; optional

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

String; optional; nonconfigurable

Obsoleta. En su lugar, usa el atributo toolchain_identifier. Será una noop después del 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.

dwp_files

Label; required

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

Label; optional

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

Se usará cuando “static_link_cpp_runtimes” está habilitada y vincularemos dependencias de forma dinámica.

exec_transition_for_inputs

Boolean; optional; default is True

Establece el valor en True para compilar todas las entradas de archivo en cc_toolchain para la plataforma ejecutiva. en lugar de no tener transición (es decir, plataforma de destino de forma predeterminada).
libc_top

Label; optional

Es un conjunto de artefactos para libc que se pasan como entradas a las acciones de compilación y vinculación.
linker_files

Label; required

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

Label; optional

Artefacto de mapa de módulos que se usará en compilaciones modulares.
objcopy_files

Label; required

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

Label; optional

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

Se usará cuando “static_link_cpp_runtimes” está habilitada y vincularemos dependencias de forma estática.

strip_files

Label; required

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

Boolean; optional; default is False

Se establece en True cuando cc_toolchain admite acciones de análisis de encabezados.
supports_param_files

Boolean; optional; default is True

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

Label; required

La etiqueta de la regla que proporciona cc_toolchain_config_info.
toolchain_identifier

String; optional; nonconfigurable

El identificador que se usa para hacer coincidir esta cc_toolchain con el crosstool_config.toolchain.

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

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

Name; required

Un nombre único para este destino.

toolchains

Dictionary mapping strings to labels; required; nonconfigurable

Un mapa desde “<cpu>” o “<cpu>|<compilador>” cadenas para Una etiqueta 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",
            },
          )