Reglas C y C++

Denuncia un problema Ver fuente Nightly · 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

Reglas

cc_binary

Ver el código fuente de la regla
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, link_extra_lib, 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 forma explícita): Es un fragmento versión del objeto binario. strip -g se ejecuta en el objeto binario para quitar los símbolos de depuración. 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 forma explícita.
  • name.dwp (solo se compila si se solicita de forma explícita): Si Fission está habilitado, es un archivo de paquete de información de depuración adecuado para depurar objetos binarios implementados de forma remota. De lo contrario, un archivo vacío.

Argumentos

Atributos
name

Nombre: Obligatorio

Un nombre único para este objetivo.

deps

Es una lista de etiquetas. El valor predeterminado es [].

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

Pueden ser cc_library o objc_library. objetivos.

srcs

Lista de etiquetas; el valor predeterminado es []

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 se enumeren en el atributo hdrs de esa biblioteca y que los encabezados restantes asociados con las fuentes de esta regla se enumeren 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 archivos de origen de C o C++, se compilan en esta regla. Si son archivos de biblioteca, se vinculan.

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
  • Biblioteca "Always link": .lo, .pic.lo
  • Biblioteca compartida, con o sin control de versiones: .so, .so.version
  • Archivo de objetos: .o, .pic.o

…y cualquier regla que genere esos archivos. Las diferentes extensiones denotan diferentes lenguajes de programación según la convención de gcc.

additional_linker_inputs

Es una lista de etiquetas. El valor predeterminado es [].

Pasa estos archivos al comando del vinculador C++.

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

copts

Lista de cadenas; el valor predeterminado es []

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 para compilar este objetivo, no para sus dependencias, así que ten cuidado con los archivos de encabezado incluidos 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 tokenización de shell de Bourne se aplica solo a cadenas que consisten en una sola variable "Make".

defines

Lista de cadenas; el valor predeterminado es []

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

Es una lista de cadenas. El valor predeterminado es [].

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

Sujeto a la sustitución de "Make variable". Cada cadena está precedida por -isystem y se agrega a COPTS. A diferencia de COPTS, estas marcas se agregan para esta regla y cada regla que depende de ella. (Nota: No depende de las reglas de las que depende). Ten mucho cuidado, ya que esto puede tener efectos de gran alcance. Si tienes dudas, agrega marcas "-I" a COPTS.

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

Etiqueta; el valor predeterminado es "@bazel_tools//tools/cpp:link_extra_lib"

Controla la vinculación de bibliotecas adicionales.

De forma predeterminada, los objetos binarios de C++ se vinculan con //tools/cpp:link_extra_lib, que, a su vez, depende de la marca de etiqueta //tools/cpp:link_extra_libs. Si no se configura la marca, esta biblioteca estará vacía de forma predeterminada. Configura la marca de la etiqueta permite vincular dependencias opcionales, como anulaciones de símbolos débiles, interceptores para funciones de bibliotecas compartidas o bibliotecas especiales de tiempo de ejecución (para reemplazos de malloc, preferir malloc o --custom_malloc). Establecer este atributo en None inhabilita este comportamiento.

linkopts

Es una lista de cadenas. El valor predeterminado es [].

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.

Se supone que cada elemento de esta lista que no comienza con $ o - es la etiqueta de un destino en deps. La lista de archivos generados por ese destino se agrega a las opciones del vinculador. Se informa un error si la etiqueta no es válida o no se declaró en deps.

linkshared

Booleano; no configurable; el valor predeterminado es False

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

La presencia de esta marca significa que la vinculación se produce con la marca -shared a gcc, y la biblioteca compartida resultante es adecuada para cargarse en, por ejemplo, un programa Java. Sin embargo, a los efectos de la compilación, nunca se vinculará al objeto binario dependiente, ya que se supone que las bibliotecas compartidas compiladas con una regla cc_binary solo se cargan de forma manual por otros programas, por lo que no se debe considerar un sustituto de la regla cc_library. Por motivos de escalabilidad, te recomendamos que evites este enfoque por completo y que, en su lugar, dejes que java_library dependa de las reglas de cc_library.

Si especificas linkopts=['-static'] y linkshared=True, obtienes una sola unidad completamente independiente. Si especificas linkstatic=True y linkshared=True, obtienes una sola unidad, en su mayoría independiente.

linkstatic

Booleano; el valor predeterminado es 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. Es posible que algunas bibliotecas del sistema aún estén vinculadas de forma dinámica, al igual que las bibliotecas para las que no hay una biblioteca estática. Por lo tanto, el ejecutable resultante seguirá 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.
  • DYNAMIC, en el que todas las bibliotecas se vinculan de forma dinámica (si hay una versión dinámica disponible), p. ej., "gcc foo.o libfoo.so libbaz.so -lm".
    Para habilitar este modo, especifica linkstatic=False.

El atributo linkstatic tiene un significado diferente si se usa en una regla cc_library(). Para una biblioteca de C++, linkstatic=True indica que solo se permite la vinculación estática, por lo que no se producirá ningún .so. linkstatic=False no impide que se creen bibliotecas estáticas. El atributo está diseñado para controlar la creación de bibliotecas dinámicas.

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

local_defines

Lista de cadenas; el valor predeterminado es []

Es la lista de definiciones que se agregarán a la línea de compilación. Sujeto a la sustitución de la variable “Make” y a la tokenización de Bourne Shell. 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

Etiqueta (Label); el valor predeterminado es "@bazel_tools//tools/cpp:malloc"

Anula la dependencia predeterminada en malloc.

De forma predeterminada, los objetos binarios de C++ se vinculan 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 regla que no es de C++, esta opción no tiene efecto. El valor de este atributo se ignora si se especifica linkshared=True.

nocopts

Cadena; el valor predeterminado es ""

Quita 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

Número entero (el valor predeterminado es -1)

Indica si se debe codificar la 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. Se debe evitar esta configuración, ya que puede finalizar la caché remota del objeto binario y cualquier acción descendente que dependa de ella.
  • stamp = 0: Siempre reemplaza la información de compilación por valores constantes. Esto proporciona una buena almacenamiento en caché de los resultados de la compilación.
  • stamp = -1: La incorporación de información de compilación está controlada por la marca --[no]stamp.

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

win_def_file

Etiqueta; el valor predeterminado es None

Es el archivo DEF de Windows que se pasará al vinculador.

Este atributo solo se debe usar cuando Windows es la plataforma de destino. Se puede usar para exportar símbolos durante la vinculación de una biblioteca compartida

cc_import

Ver la fuente de la regla
cc_import(name, deps, data, hdrs, alwayslink, compatible_with, deprecation, distribs, features, interface_library, licenses, restricted_to, shared_library, static_library, system_provided, tags, target_compatible_with, testonly, visibility)

Las reglas cc_import permiten que los usuarios importen bibliotecas C/C++ precompiladas.

Los siguientes 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) Vinculación de 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 an import library for mylib.dll which will be passed to linker
  interface_library = "mylib.lib",
  # mylib.dll will be available for runtime
  shared_library = "mylib.dll",
)
4) Vincula 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,
)
cc_import admite un atributo de inclusión. Por ejemplo:
  cc_import(
  name = "curl_lib",
  hdrs = glob(["vendor/curl/include/curl/*.h"]),
  includes = [ "vendor/curl/include" ],
  shared_library = "vendor/curl/lib/.libs/libcurl.dylib",
)

Argumentos

Atributos
name

Nombre: obligatorio.

Un nombre único para este destino.

deps

Es una lista de etiquetas. El valor predeterminado es [].

Es la lista de otras bibliotecas de las que depende el destino. Consulta los comentarios generales sobre deps en Atributos típicos definidos por la mayoría de las reglas de compilación.
hdrs

Es una lista de etiquetas. El valor predeterminado es [].

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

Booleano; el valor predeterminado es False

Si es 1, cualquier objeto binario que dependa (directa o indirectamente) de esta biblioteca precompilada en C++ vinculará todos los archivos de objetos archivados en la biblioteca estática, 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, es debido a un problema conocido. Actualiza tu VS 2017 a la versión más reciente.

interface_library

Etiqueta; el valor predeterminado es None

Una sola biblioteca de interfaz para vincular la biblioteca compartida.

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

shared_library

Etiqueta; el valor predeterminado es None

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

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

static_library

Etiqueta (Label); el valor predeterminado es None

Una sola biblioteca estática precompilada.

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

system_provided

Booleano; el valor predeterminado es False

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

cc_library

Ver el código fuente de la regla
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 encabezados

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 en srcs solo se deben incluir directamente desde los archivos en hdrs y srcs de la biblioteca. Cuando decidas si colocar un encabezado en hdrs o srcs, debes preguntarte si deseas que los consumidores de esta biblioteca puedan incluirlo directamente. Esta es aproximadamente la misma decisión que la que se toma entre la visibilidad de public y private en los lenguajes de programación.

Las reglas cc_binary y cc_test no tienen una interfaz exportada, por lo que tampoco tienen un atributo hdrs. Todos los encabezados que pertenecen al objeto binario o la prueba directamente debería aparecer en srcs.

Para ilustrar estas reglas, observa el siguiente ejemplo.

cc_binary(
    name = "foo",
    srcs = [
        "foo.cc",
        "foo.h",
    ],
    deps = [":bar"],
)

cc_library(
    name = "bar",
    srcs = [
        "bar.cc",
        "bar-impl.h",
    ],
    hdrs = ["bar.h"],
    deps = [":baz"],
)

cc_library(
    name = "baz",
    srcs = [
        "baz.cc",
        "baz-impl.h",
    ],
    hdrs = ["baz.h"],
)

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 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, foo.cc puede incluir bar.h, que puede incluir baz.h, que, a su vez, puede 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 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 sea permitido, baz se debe agregar a deps de foo.

Bazel depende de la compatibilidad con la cadena de herramientas para aplicar las reglas de verificación de inclusión. La cadena de herramientas debe admitir la función layering_check y solicitarla de forma explícita, por ejemplo, a través de la marca de línea de comandos --features=layering_check o el parámetro features de la función package. Las cadenas de herramientas que proporciona Bazel solo admiten esta función con Clang en Unix y macOS.

Argumentos

Atributos
name

Nombre: Obligatorio

Un nombre único para este objetivo.

deps

Es una lista de etiquetas. El valor predeterminado es [].

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

Pueden ser objetivos cc_library o objc_library.

srcs

Lista de etiquetas; el valor predeterminado es []

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 atributo srcs de esta regla o en el atributo hdrs de los cc_library() a los que se hace referencia. El estilo recomendado es que los encabezados asociados con una biblioteca se enumeren en el atributo hdrs de esa biblioteca y que los encabezados restantes asociados con las fuentes de esta regla se enumeren 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
  • Biblioteca "Always link": .lo, .pic.lo
  • Biblioteca compartida, con o sin control de versiones: .so, .so.version
  • Archivo de objetos: .o, .pic.o

…y cualquier regla que genere esos archivos. Las diferentes extensiones denotan diferentes lenguajes de programación en de acuerdo con la convención de GCC.

hdrs

Lista de etiquetas; el valor predeterminado es []

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 estarán disponibles para que las fuentes los incluyan 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

Lista de etiquetas; el valor predeterminado es []

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

Lista de etiquetas; el valor predeterminado es []

Pasa estos archivos al comando del vinculador C++.

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

Booleano; el valor predeterminado es False

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

Es una lista de cadenas. El valor predeterminado es [].

Agrega estas opciones al comando de compilación de C++. Sujeto a la sustitución de "Make variable" y la tokenización de Bourne shell.

Cada cadena de este atributo se agrega en el orden determinado a COPTS antes de compilando el objetivo binario. Las marcas solo tienen efecto para compilar este objetivo, no para sus dependencias, así que ten cuidado con los archivos de encabezado incluidos en otro lugar. Todas las rutas de acceso deben estar relacionadas con el lugar de trabajo, no con el paquete actual.

Si el paquete declara la función no_copts_tokenization, la tokenización de shell de Bourne se aplica solo a cadenas que consisten en una sola variable "Make".

defines

Es una lista de cadenas. El valor predeterminado es [].

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 puede tener efectos de gran alcance. Si tienes dudas, agrega valores definidos a local_defines.
implementation_deps

Lista de etiquetas; el valor predeterminado es []

Es la lista de otras bibliotecas de las que depende el destino de la biblioteca. A diferencia de deps, los encabezados y las rutas de inclusión de estas bibliotecas (y todas sus dependencias transitivas) solo se usan para la compilación de esta biblioteca, no para 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_libraries y está protegido por la marca --experimental_cc_implementation_deps.

include_prefix

Cadena; el valor predeterminado es ""

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 del atributo hdrs de esta regla en el valor de este atributo que se agrega al principio de su ruta de acceso relativa al repositorio.

El prefijo del atributo strip_include_prefix se quita antes de agregar este prefijo.

includes

Es una lista de cadenas. El valor predeterminado es [].

Es la lista de directorios de inclusión que se agregarán a la línea de compilación.

Sujeto a la sustitución de "Make variable". Cada cadena se antepone con -isystem y se agrega a COPTS. A diferencia de COPTS, estas marcas se agregan para esta regla y cada regla que depende de ella. (Nota: No son las reglas de las que depende). Ten mucho cuidado, ya que esto puede tener efectos de gran alcance. Si tienes dudas, agrega “-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

Es una lista de cadenas. El valor predeterminado es [].

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 vincular el destino 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

Etiqueta; el valor predeterminado es None

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

Booleano; el valor predeterminado es False

Para cc_binary y cc_test: vincula el objeto binario en 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. Es posible que algunas bibliotecas del sistema aún estén vinculadas de forma dinámica, al igual que las bibliotecas para las que no hay una biblioteca estática. Por lo tanto, el ejecutable resultante seguirá 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.
  • STATIC, en el que todas las bibliotecas del usuario se vinculan de forma estática (si hay una versión estática disponible), pero las bibliotecas del sistema (excepto las bibliotecas del tiempo de ejecución de C/C++) se vinculan de forma dinámica, p. ej., "gcc foo.o libfoo.a libbaz.a -lm".
    Para habilitar este modo, especifica 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”.
    Este modo se habilita especificando linkstatic=False.

El atributo linkstatic tiene un significado diferente si se usa en una 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 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

Lista de cadenas; el valor predeterminado es []

Es la lista de definiciones que se agregarán a la línea de compilación. Sujeto a la sustitución de la variable “Make” y a la tokenización de Bourne Shell. Cada cadena, que debe consistir en un solo token de shell de Bourne, se antepone con -D y se agrega a la línea de comandos de compilación para este destino, pero no a sus elementos dependientes.
nocopts

String; el valor predeterminado es ""

Quita 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. Este atributo rara vez debería ser necesario.
strip_include_prefix

String; el valor predeterminado es ""

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

Cuando se configuran, se puede acceder a los encabezados del atributo hdrs de esta regla en su ruta de acceso con este prefijo cortado.

Si es una ruta de acceso relativa, se considera una ruta de acceso relativa al 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 se quita este prefijo.

textual_hdrs

Es una lista de etiquetas. El valor predeterminado es [].

Es la lista de archivos de encabezado que publica esta biblioteca para que las fuentes la incluyan de forma textual en las 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 de forma textual en otros archivos de origen para compilar un código válido.

win_def_file

Etiqueta; el valor predeterminado es None

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

Ver el código fuente de la regla
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

Nombre: obligatorio.

Un nombre único para este objetivo.

deps

Es una lista de etiquetas. El valor predeterminado es [].

Lista de proto_library para generar el código C++.

cc_shared_library

Ver la fuente de la regla
cc_shared_library(name, deps, additional_linker_inputs, dynamic_deps, exports_filter, shared_lib_name, tags, user_link_flags, win_def_file)

Produce una biblioteca compartida.

Ejemplo

cc_shared_library(
    name = "foo_shared",
    deps = [
        ":foo",
    ],
    dynamic_deps = [
        ":bar_shared",
    ],
    additional_linker_inputs = [
        ":foo.lds",
    ],
    user_link_flags = [
        "-Wl,--version-script=$(location :foo.lds)",
    ],
)
cc_library(
    name = "foo",
    srcs = ["foo.cc"],
    hdrs = ["foo.h"],
    deps = [
        ":bar",
        ":baz",
    ],
)
cc_shared_library(
    name = "bar_shared",
    shared_lib_name = "bar.so",
    deps = [":bar"],
)
cc_library(
    name = "bar",
    srcs = ["bar.cc"],
    hdrs = ["bar.h"],
)
cc_library(
    name = "baz",
    srcs = ["baz.cc"],
    hdrs = ["baz.h"],
)

En el ejemplo, foo_shared vincula de forma estática foo. y baz, que es la última de una dependencia transitiva. No vínculo bar porque ya lo proporciona dinámicamente el bar_shared de dynamic_dep.

foo_shared usa un archivo *.lds de la secuencia de comandos del vinculador para controlar qué los símbolos deben exportarse. La lógica de la regla cc_shared_library no controla qué símbolos se exportan, solo usa lo que se supone que para dar errores durante la fase de análisis si dos bibliotecas compartidas exportan los mismos objetivos.

Se supone que cada dependencia directa de cc_shared_library y exportarse. Por lo tanto, Bazel supone durante el análisis que foo_shared está exportando foo. No se supone que foo_shared exporte baz. Todos los objetivos coincidieron con la exports_filter y se supone que también se exportan.

Cada cc_library del ejemplo debería aparecer como máximo en una cc_shared_library Si quisiéramos vincular baz también a bar_shared, tendríamos que agregar tags = ["LINKABLE_MORE_THAN_ONCE"] a baz.

Debido al atributo shared_lib_name, el archivo producido por bar_shared tendrá el nombre bar.so, en lugar de al nombre libbar.so que tendría de forma predeterminada en Linux.

Errores

Two shared libraries in dependencies export the same symbols.

Esto sucederá cuando crees un destino con dos cc_shared_library dependencias que exportan el mismo destino. Para solucionar este problema, debes evitar que las bibliotecas se exporten en una de las dependencias de cc_shared_library.

Esto sucederá cada vez que crees un cc_shared_library nuevo con dos dependencias cc_shared_library diferentes que vinculen el mismo objetivo de forma estática. Es similar al error con las exportaciones.

Una forma de solucionar este problema es dejar de vincular la biblioteca a una de las dependencias de cc_shared_library. Al mismo tiempo, la que lo vincula necesita exportar la biblioteca para que la que no la vincule mantenga la visibilidad los símbolos. Otra forma es extraer una tercera biblioteca que exporte el destino. Una tercera forma es etiquetar al culpable cc_library con LINKABLE_MORE_THAN_ONCE. pero esta solución debería ser poco común y debes asegurarte de que el Es seguro vincular cc_library más de una vez.

'//foo:foo' is already linked statically in '//bar:bar' but not exported`

Eso significa que se puede acceder a una biblioteca en el cierre transitivo de tu deps sin pasar por una de las dependencias cc_shared_library, pero ya vinculado a un cc_shared_library diferente en dynamic_deps y no está y exportarse.

La solución es exportarlo desde la dependencia cc_shared_library o extraer un tercer cc_shared_library que lo exporta.

Do not place libraries which only contain a precompiled dynamic library in deps.

Si tienes una biblioteca dinámica precompilada, no es necesario ni se puede vinculada de forma estática al destino actual cc_shared_library al que creando. Por lo tanto, no pertenece a deps de las cc_shared_library Si esta biblioteca dinámica precompilada es una dependencia de uno de tus cc_libraries, el cc_library debe depender de ella directamente.

Trying to export a library already exported by a different shared library

Verás este error si, en la regla actual, declaras que quieres exportar un objetivo que ya exporta una de tus dependencias dinámicas.

Para solucionar este problema, quita la segmentación de deps y confía en ella de la campaña dinámica. o asegúrate de que exports_filter no detecte este objetivo.

Argumentos

Atributos
name

Nombre: obligatorio.

Un nombre único para este objetivo.

deps

Es una lista de etiquetas. El valor predeterminado es [].

Son bibliotecas de nivel superior que se vincularán de forma estática y sin condiciones a la biblioteca compartida después de archivarse por completo.

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

Durante el análisis, la implementación de la regla considerará que la biblioteca compartida exporta cualquier destino que se enumere en deps para mostrar errores cuando varios cc_shared_libraries exporten los mismos destinos. La implementación de la regla no se encarga de informar al vinculador sobre qué símbolos debe exportar el objeto compartido. El usuario debería encargarse de esto con secuencias de comandos del vinculador o visibilidad. en el código fuente.

La implementación también activará errores cada vez que la misma biblioteca esté vinculada de forma estática en más de un cc_shared_library. Esto se puede evitar agregando "LINKABLE_MORE_THAN_ONCE" a cc_library.tags o por ficha `cc_library` como una exportación de una de las bibliotecas compartidas, de manera que se pueda convertir en una dynamic_dep de la otra.

additional_linker_inputs

Es una lista de etiquetas. El valor predeterminado es [].

Cualquier archivo adicional que quieras pasar al vinculador, por ejemplo, secuencias de comandos del vinculador Debes pasar por separado las marcas del vinculador que este necesita para estar al tanto de este archivo. Puedes hacerlo a través del atributo user_link_flags.
dynamic_deps

Lista de etiquetas; el valor predeterminado es []

Estas son otras dependencias de cc_shared_library de las que depende el objetivo actual.

La implementación de cc_shared_library usará la lista de dynamic_deps (de manera transitiva, es decir, también el dynamic_deps del dynamic_deps del objetivo actual) para decidir qué cc_libraries en el deps transitivo no debe vincularse porque ya lo proporciona un cc_shared_library diferente.

exports_filter

Es una lista de cadenas. El valor predeterminado es [].

Este atributo contiene una lista de destinos que se afirma que son exportados por el biblioteca compartida.

Se da por sentado que la biblioteca compartida exporta cualquier deps de destino. Este atributo se debe usar para enumerar todos los destinos exportados por la biblioteca compartida pero son dependencias transitivas de deps.

Ten en cuenta que este atributo en realidad no agrega una arista de dependencia a esos destinos, el el perímetro de dependencia, en su lugar, debe ser creado por deps.Las entradas de este son solo cadenas. Ten en cuenta que, cuando coloques un destino en este atributo, esto se considera una afirmación de que la biblioteca compartida exporta los símbolos de ese destino. La lógica de cc_shared_library no se encarga de indicarle al vinculador qué símbolos se deben exportar.

Se permite la siguiente sintaxis:

//foo:__package__ para representar cualquier destino en foo/BUILD

//foo:__subpackages__ para representar cualquier destino en foo/BUILD o cualquier otro paquete debajo de foo/ como foo/bar/BUILD

shared_lib_name

String; el valor predeterminado es ""

De forma predeterminada, cc_shared_library usará un nombre para el archivo de salida de la biblioteca compartida según el nombre del destino y la plataforma. Esto incluye una extensión y, a veces, un prefijo. A veces, es posible que no quieras el nombre predeterminado (por ejemplo, cuando cargas bibliotecas compartidas de C++) Para Python, a menudo no se desea el prefijo lib* predeterminado, en cuyo caso, puedes usar este para elegir un nombre personalizado.

Es una lista de cadenas. El valor predeterminado es [].

Cualquier marca adicional que desees pasar al vinculador. Por ejemplo, para que la vinculador reconoce una secuencia de comandos del vinculador pasada a través de additional_linker_inputs. Puedes usar el lo siguiente:
         cc_shared_library(
            name = "foo_shared",
            additional_linker_inputs = select({
              "//src/conditions:linux": [
                ":foo.lds",
                ":additional_script.txt",
              ],
              "//conditions:default": []}),
            user_link_flags = select({
              "//src/conditions:linux": [
                "-Wl,-rpath,kittens",
                "-Wl,--version-script=$(location :foo.lds)",
                "-Wl,--script=$(location :additional_script.txt)",
              ],
              "//conditions:default": []}),
              ...
         )
        
win_def_file

Etiqueta; el valor predeterminado es None

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

Este atributo solo se debe usar cuando Windows es la plataforma de destino. Se puede usar para exportar símbolos durante la vinculación de una biblioteca compartida.

fdo_prefetch_hints

Ver la fuente de la regla
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

Nombre: Obligatorio

Un nombre único para este destino.

profile

Etiqueta (Label); el valor predeterminado es None

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

Ver el código fuente de la regla
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

Nombre: Obligatorio

Un nombre único para este objetivo.

absolute_path_profile

String; el valor predeterminado es ""

Es la ruta de acceso absoluta al perfil de FDO. El archivo FDO puede tener una de las siguientes extensiones: .profraw para el perfil de LLVM sin indexar, .profdata para el perfil de LLVM indexado, .zip que contiene un perfil de profraw de LLVM o .afdo para el perfil de AutoFDO.
profile

Etiqueta (Label); el valor predeterminado es None

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

Etiqueta (Label); el valor predeterminado es None

Etiqueta del perfil de protobuf.

memprof_profile

Ver el código fuente de la regla
memprof_profile(name, absolute_path_profile, compatible_with, deprecation, distribs, features, licenses, profile, restricted_to, tags, target_compatible_with, testonly, visibility)

Representa un perfil MEMPROF que se encuentra en el espacio de trabajo o en un ruta de acceso absoluta. Ejemplos:

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

memprof_profile(
  name = "memprof_abs",
  absolute_path_profile = "/absolute/path/profile.afdo",
)

Argumentos

Atributos
name

Nombre: obligatorio.

Un nombre único para este destino.

absolute_path_profile

Cadena; el valor predeterminado es ""

Ruta de acceso absoluta al perfil MEMPROF. El archivo solo puede tener la extensión .profdata o .zip (en cuyo caso, el archivo ZIP debe contener un archivo memprof.profdata).
profile

Etiqueta; el valor predeterminado es None

Etiqueta del perfil MEMPROF. Se espera que el perfil tenga una extensión .profdata (para un perfil de memprof indexado o simbolizado) o una extensión .zip para un archivo ZIP que contenga un archivo memprof.profdata. La etiqueta también puede apuntar a una regla de perfil fdo_ muchísima_ruta.

propeller_optimize

Ver el código fuente de la regla
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

Nombre: Obligatorio

Un nombre único para este objetivo.

ld_profile

Etiqueta; el valor predeterminado es None

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

cc_test

Ver el código fuente de la regla
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, link_extra_lib, 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

Nombre: Obligatorio

Un nombre único para este destino.

deps

Es una lista de etiquetas. El valor predeterminado es [].

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

Pueden ser cc_library o objc_library. objetivos.

srcs

Lista de etiquetas; el valor predeterminado es []

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 atributo srcs de esta regla o en el atributo hdrs de los cc_library() a los que se hace referencia. El estilo recomendado es que los encabezados asociados con una biblioteca se enumeren en el atributo hdrs de esa biblioteca y que los encabezados restantes asociados con las fuentes de esta regla se enumeren 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
  • Biblioteca "Always link": .lo, .pic.lo
  • Biblioteca compartida, con o sin control de versiones: .so, .so.version
  • Archivo de objetos: .o, .pic.o

…y cualquier regla que genere esos archivos. Las diferentes extensiones denotan diferentes lenguajes de programación según la convención de gcc.

additional_linker_inputs

Lista de etiquetas; el valor predeterminado es []

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

Lista de cadenas; el valor predeterminado es []

Agrega estas opciones al comando de compilación de C++. Sujeto a la sustitución de "Make variable" y la tokenización de Bourne shell.

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

Lista de cadenas; el valor predeterminado es []

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 consistir en un solo token de shell de Bourne, se antepone con -D y se agrega a la línea de comandos de compilación a este destino, así como a cada regla que depende de él. Ten mucho cuidado, ya que esto puede tener efectos de gran alcance. Si tienes dudas, agrega valores definidos a local_defines en su lugar.
includes

Lista de cadenas; el valor predeterminado es []

Es la lista de directorios de inclusión que se agregarán a la línea de compilación.

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

Los encabezados se deben agregar a srcs o hdrs; de lo contrario, no estarán disponibles para las reglas dependientes cuando la compilación esté en zona de pruebas (la opción predeterminada).

Etiqueta; el valor predeterminado es "@bazel_tools//tools/cpp:link_extra_lib"

Controla la vinculación de bibliotecas adicionales.

De forma predeterminada, los objetos binarios de C++ se vinculan con //tools/cpp:link_extra_lib, que, a su vez, depende de la marca de etiqueta //tools/cpp:link_extra_libs. Si no se configura la marca, esta biblioteca estará vacía de forma predeterminada. Configura la marca de la etiqueta permite vincular dependencias opcionales, como anulaciones de símbolos débiles, interceptores para funciones de bibliotecas compartidas o bibliotecas especiales de tiempo de ejecución (para reemplazos de malloc, preferir malloc o --custom_malloc). Establecer este atributo en None inhabilita este comportamiento.

linkopts

Es una lista de cadenas. El valor predeterminado es [].

Agrega estas marcas al comando del vinculador de C++. Sujeto a la sustitución de la variable “Make”, la tokenización de shell de Bourne y la expansión de etiquetas. Cada cadena de este atributo se agrega a LINKOPTS antes de vincular el destino 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 declara en deps.

linkstatic

Booleano; el valor predeterminado es 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. Es posible que algunas bibliotecas del sistema aún estén vinculadas de forma dinámica, al igual que las bibliotecas para las que no hay una biblioteca estática. Por lo tanto, el ejecutable resultante seguirá 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.
  • STATIC, en el que todas las bibliotecas del usuario se vinculan de forma estática (si hay una versión estática disponible), pero las bibliotecas del sistema (excepto las bibliotecas del tiempo de ejecución de C/C++) se vinculan de forma dinámica, p. ej., "gcc foo.o libfoo.a libbaz.a -lm".
    Para habilitar este modo, especifica linkstatic=True.
  • DYNAMIC, en el que todas las bibliotecas se vinculan de forma dinámica (si hay una versión dinámica disponible), p. ej., "gcc foo.o libfoo.so libbaz.so -lm".
    Para habilitar este modo, especifica linkstatic=False.

El atributo linkstatic tiene un significado diferente si se usa en una regla cc_library(). Para una biblioteca de C++, linkstatic=True indica que solo se permite la vinculación estática, por lo que no se producirá ningún .so. linkstatic=False no impide que se creen bibliotecas estáticas. El atributo está diseñado para controlar la creación de bibliotecas dinámicas.

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

local_defines

Lista de cadenas; el valor predeterminado es []

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

Etiqueta (Label); el valor predeterminado es "@bazel_tools//tools/cpp:malloc"

Anula la dependencia predeterminada en malloc.

De forma predeterminada, los objetos binarios de C++ se vinculan 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 regla que no es de C++, esta opción no tiene efecto. El valor de este atributo se ignora si se especifica linkshared=True.

nocopts

Cadena; el valor predeterminado es ""

Quita las opciones coincidentes del comando de compilación de C++. Está sujeto a la sustitución de la variable “Make”. El valor de este atributo se interpreta como una expresión regular. Cualquier COPTS preexistente que coincida con esta expresión regular (incluidos los valores especificados explícitamente en el atributo copts de la regla) se quitarán del COPTS para compilar esta regla. Rara vez se necesita este atributo.
stamp

Integer; el valor predeterminado es 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 binario, incluso en las compilaciones de --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 información de compilación está controlada por la marca --[no]stamp.

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

win_def_file

Etiqueta (Label); el valor predeterminado es None

Es el archivo DEF de Windows que se pasará al vinculador.

Este atributo solo se debe usar cuando Windows es la plataforma de destino. Se puede usar para exportar símbolos durante la vinculación de una biblioteca compartida.

cc_toolchain

Ver la fuente de la regla
cc_toolchain(name, all_files, ar_files, as_files, compatible_with, compiler_files, compiler_files_without_includes, coverage_files, deprecation, 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.
  • Genera líneas de comandos correctas para 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

Nombre: obligatorio.

Un nombre único para este destino.

all_files

Etiqueta; obligatorio.

Es la colección de todos los artefactos de cc_toolchain. Estos artefactos se agregarán como entradas a todas las acciones relacionadas con rules_cc (con la excepción de las acciones que usan conjuntos más precisos de artefactos de los atributos que se indican a continuación). Bazel supone que all_files es un superconjunto de todos los demás atributos que proporcionan artefactos (p. ej., la compilación de linkstamp necesita archivos de compilación y vinculación, 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

Etiqueta (Label); el valor predeterminado es None

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

as_files

Etiqueta; el valor predeterminado es None

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

compiler_files

Etiqueta; obligatorio.

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

Etiqueta; el valor predeterminado es None

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

Etiqueta (Label); el valor predeterminado es None

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

Etiqueta; obligatorio.

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

Etiqueta; el valor predeterminado es None

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

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

exec_transition_for_inputs

Booleano; el valor predeterminado es True

Se establece como verdadero para compilar todas las entradas de archivos en cc_toolchain para la plataforma de ejecución, en lugar de no tener ninguna transición (es decir, la plataforma de destino de forma predeterminada).
libc_top

Etiqueta (Label); el valor predeterminado es None

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

Etiqueta (Label): Obligatorio

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

Etiqueta; el valor predeterminado es None

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

Etiqueta (Label): Obligatorio

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

Etiqueta (Label); el valor predeterminado es None

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

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

strip_files

Etiqueta (Label): Obligatorio

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

Booleano; el valor predeterminado es False

Establece como verdadero cuando cc_toolchain admita acciones de análisis de encabezados.
supports_param_files

Booleano; el valor predeterminado es True

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

Etiqueta (Label): Obligatorio

La etiqueta de la regla que proporciona cc_toolchain_config_info.
toolchain_identifier

Cadena; no configurable; el valor predeterminado es ""

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

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

cc_toolchain_suite

Ver la fuente de la regla
cc_toolchain_suite(name, compatible_with, deprecation, 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.

Consulta también esta página para obtener documentación detallada sobre la configuración y la selección de la cadena de herramientas de C++.

Argumentos

Atributos
name

Nombre: obligatorio.

Un nombre único para este destino.

toolchains

Cadenas de asignación de diccionarios a etiquetas; no configurable; obligatorio.

Un mapa de cadenas "<cpu>" o "<cpu>|<compiler>" a una etiqueta cc_toolchain Se usará "<cpu>" cuando solo se pase --cpu a Bazel, y se usará "<cpu>|<compiler>" 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",
            },
          )