Reglas C y C++

Informar un problema Ver fuente Noche

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, dynamic_deps, env, exec_compatible_with, exec_properties, features, hdrs_check, includes, licenses, link_extra_lib, linkopts, linkshared, linkstatic, local_defines, malloc, module_interfaces, nocopts, output_licenses, reexport_deps, restricted_to, stamp, tags, target_compatible_with, testonly, toolchains, visibility, win_def_file)

Produce un objeto binario ejecutable.


El name del destino debe ser el mismo que el nombre del archivo de origen que es el punto de entrada principal de la aplicación (menos la extensión). Por ejemplo, si tu punto de entrada está en main.cc, tu nombre debería ser main.

Destinos de salida implícitos

  • name.stripped (solo se compila si se solicita de manera explícita): Es una versión reducida del objeto binario. Se ejecuta strip -g en el objeto binario para quitar los símbolos de depuración. Se pueden proporcionar opciones de barra adicionales en la línea de comandos mediante --stripopt=-foo.
  • name.dwp (solo se compila si se solicita explícitamente): Si Fission está habilitada, un archivo de paquete de información de depuración adecuado para depurar objetos binarios implementados de forma remota. De lo contrario, debe ser un archivo vacío.

Argumentos

Atributos
name

Name; obligatorio

Un nombre único para este destino.

deps

Lista de etiquetas; el valor predeterminado es []

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

Pueden ser objetivos cc_library o objc_library.

También se permite colocar secuencias de comandos del vinculador (.lds) en dependencias y hacer referencia a ellas en linkopts.
srcs

Lista de etiquetas; el valor predeterminado es []

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

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

Los archivos ensambladores puros (.s, .asm) no se procesan previamente y, por lo general, se compilan con el ensamblador. Los archivos de ensamblado (.S) previamente procesados y, por lo general, se compilan con el compilador C/C++.

No se compilará un archivo .h, pero estará disponible para que lo incluyan las fuentes en esta regla. Los archivos .cc y .h pueden incluir directamente encabezados enumerados en estos srcs, en el hdrs de esta regla o en cualquier regla que se enumere en el argumento deps.

Todos los archivos #included deben mencionarse en el atributo hdrs de esta o las reglas cc_library a las que se hace referencia. De lo contrario, deben aparecer en srcs si son privados de esta biblioteca. Consulta "Verificación de inclusión de encabezado" para obtener una descripción más detallada.

Los archivos .so, .lo y .a son archivos compilados previamente. Es posible que tu biblioteca los tenga como srcs si usa código de terceros para el que no tenemos código fuente.

Si el atributo srcs incluye la etiqueta de otra regla, cc_library usará los archivos de salida de esa regla como archivos de origen para compilar. Esto es útil para la generación única de código fuente (para más que un uso ocasional, es mejor implementar una clase de regla de Starlark y usar la API de cc_common).

Tipos de archivos srcs permitidos:

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

... y las reglas que generan esos archivos (p.ej., cc_embed_data). Las diferentes extensiones denotan diferentes lenguajes de programación según la convención de GCC.

data

Lista de etiquetas; el valor predeterminado es []

Es la lista de archivos que necesita esta biblioteca en el entorno de ejecución. Consulta los comentarios generales sobre data en Atributos típicos definidos por la mayoría de las reglas de compilación.

Si data es el nombre de un archivo generado, esta regla cc_library depende automáticamente de la regla que se genera.

Si data es el nombre de una regla, esta regla cc_library depende automáticamente de ella, y sus outs se agregan de forma automática a los archivos de datos de esta cc_library.

Tu código C++ puede acceder a estos archivos de datos de la siguiente manera:


  const std::string path = devtools_build::GetDataDependencyFilepath(
      "my/test/data/file");
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 objetivo binario.

copts

Lista de cadenas; el valor predeterminado es []

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

Cada cadena de este atributo se agrega en el orden determinado a COPTS antes de compilar el destino binario. Las marcas solo se aplican para compilar este destino, no sus dependencias, por lo que debes tener 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. Este atributo no debería ser necesario fuera de third_party.

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 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 la sustitución de la variable"Make" y la asignación de token de shell de Bourne. Cada cadena, que debe consistir en un solo token de shell de Bourne, está precedida por -D y se agrega a la línea de comandos de compilación de este destino, así como a cada regla que depende de ella. Ten mucho cuidado, ya que esto puede tener efectos de gran alcance. Si tienes dudas, agrega valores definidos a local_defines en su lugar.
dynamic_deps

Lista de etiquetas; el valor predeterminado es []

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

La implementación de cc_shared_library usará la lista de dynamic_deps (de forma transitiva, es decir, también el dynamic_deps del dynamic_deps del destino actual) para decidir en qué cc_libraries del deps transitivo no se debe vincular, porque ya los proporciona otro cc_shared_library.

hdrs_check

String; el valor predeterminado es ""

Obsoleto, no-op.
includes

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 "Make variable". A cada cadena se le antepone la ruta de acceso del paquete y se pasa a la cadena de herramientas de C++ para la expansión a través de la función CROSSTOOL "include_paths". Una cadena de herramientas que se ejecuta en un sistema POSIX con definiciones de atributos típicas producirá -isystem path_to_package/include_entry. Solo debe usarse para bibliotecas de terceros que no cumplan con el estilo de escritura de las sentencias #include de Google. 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 largo alcance. Si tienes dudas, agrega marcas "-I" a COPTS.

Las rutas de acceso include agregadas incluirán archivos generados y archivos en el árbol de fuentes.

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++ están vinculados con //tools/cpp:link_extra_lib, que 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. Si configuras la marca de etiqueta, podrás vincular dependencias opcionales, como anulaciones para símbolos débiles, interceptores para funciones de bibliotecas compartidas o bibliotecas de tiempo de ejecución especiales (para reemplazos de malloc, es preferible usar malloc o --custom_malloc). Si configuras este atributo en None, se inhabilita este comportamiento.

linkopts

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 asignación de token de shell de Bourne y la expansión de etiquetas. Cada cadena de este atributo se agrega a LINKOPTS antes de vincular 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 que genera ese destino se agrega a las opciones del vinculador. Se informa un error si la etiqueta no es válida o no se declara en deps.

linkshared

Booleano; el valor predeterminado es False

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

La presencia de esta marca significa que la vinculación se realiza con la marca -shared a gcc, y la biblioteca compartida resultante es adecuada para cargarse, por ejemplo, en un programa Java. Sin embargo, para fines de 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 manualmente por otros programas, por lo que no debe considerarse un sustituto de la regla cc_library. Para mejorar la escalabilidad, te recomendamos que evites este enfoque por completo y que, en su lugar, permitas que java_library dependa de las reglas cc_library.

Si especificas linkopts=['-static'] y linkshared=True, obtendrás una sola unidad completamente independiente. Si especificas linkstatic=True y linkshared=True, obtendrás 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 modo estático. Para cc_library.link_static: consulta a continuación.

De forma predeterminada, esta opción está activada para cc_binary y desactivada para el resto.

Si está habilitada y es un objeto binario o de prueba, esta opción indica a la herramienta de compilación que vincule las bibliotecas de usuario .a en lugar de .so para las bibliotecas de usuario, siempre que sea posible. Las bibliotecas de sistema como libc (pero no las bibliotecas en tiempo de ejecución C/C++, ver a continuación) siguen 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á vinculado de forma dinámica y, por lo tanto, solo será principalmente estático.

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

  • STATIC con la función full_static_link, en la 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: Todas las bibliotecas de usuario están vinculadas de forma estática (si hay una versión estática disponible), pero las bibliotecas del sistema (excepto las bibliotecas de tiempo de ejecución C/C++) están vinculadas de forma dinámica, p.ej., "gcc foo.o libfoo.a libbaz.a -lm".
    Este modo se habilita especificando linkstatic=True.
  • DINÁMICO, 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".
    Este modo se habilita especificando linkstatic=False.

Si el atributo linkstatic o fully_static_link en features se usan fuera de //third_party, incluye un comentario cerca de la regla para explicar el motivo.

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

Debería haber muy poco código compilado con linkstatic=False en producción. Si es linkstatic=False, la herramienta de compilación creará symlinks a las 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 la sustitución de la variable"Make" y la asignación de token de shell de Bourne. Cada cadena, que debe consistir en un solo token de shell de Bourne, está precedida por -D y se agrega a la línea de comandos de compilación para este destino, pero no a sus dependientes.
malloc

Etiqueta; el valor predeterminado es "@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 regla que no es de C++, esta opción no tiene efecto. El valor de este atributo se ignora si se especifica linkshared=True.

module_interfaces

Lista de etiquetas; el valor predeterminado es []

La lista de archivos se considera interfaz de módulos de C++20.

C++ Standard no tiene restricciones sobre la extensión de archivo de la interfaz del módulo.

  • Usa cppm de Clang
  • GCC puede usar cualquier extensión de archivo fuente.
  • Uso de ixx de MSVC

El uso está protegido por la marca --experimental_cpp_modules.

nocopts

String; el valor predeterminado es ""

Se quitaron las opciones coincidentes del comando de compilación de C++. Sujeto a la sustitución "Make" variable. 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 de manera explícita en el atributo copts de la regla) se quitará de COPTS para la compilación de esta regla. Este atributo no debe ser necesario ni usarse fuera de third_party. Los valores no se procesan de ninguna manera, excepto mediante la sustitución de variables “Make”.
reexport_deps

Lista de etiquetas; el valor predeterminado es []

stamp

Número entero; el valor predeterminado es -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 compilaciones de --nostamp. Se debe evitar esta configuración, ya que es posible que elimine el almacenamiento en caché remoto del objeto binario y cualquier acción descendente que dependa de él.
  • stamp = 0: Siempre reemplaza la información de compilación por valores constantes. Esto brinda un buen almacenamiento en caché de resultados de compilación.
  • stamp = -1: La marca --[no]stamp controla la incorporación de la información de compilación.

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

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_import

Ver el código fuente de la regla
cc_import(name, deps, data, hdrs, alwayslink, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, includes, interface_library, linkopts, objects, pic_objects, pic_static_library, restricted_to, shared_library, static_library, system_provided, tags, target_compatible_with, testonly, toolchains, visibility)

Las reglas cc_import permiten a los usuarios importar 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. Vincula una biblioteca compartida (Unix)

cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  shared_library = "libmylib.so",
)
3. Cómo vincular una biblioteca compartida con una biblioteca de interfaz

En Unix:


cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  # libmylib.ifso is an interface library for libmylib.so which will be passed to linker
  interface_library = "libmylib.ifso",
  # libmylib.so will be available for runtime
  shared_library = "libmylib.so",
)

En Windows:


cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  # mylib.lib is an import library for mylib.dll which will be passed to linker
  interface_library = "mylib.lib",
  # mylib.dll will be available for runtime
  shared_library = "mylib.dll",
)
4. Vincula una biblioteca compartida con system_provided=True

En Unix:


cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  interface_library = "libmylib.ifso", # Or we can also use libmylib.so as its own interface library
  # libmylib.so is provided by system environment, for example it can be found in LD_LIBRARY_PATH.
  # This indicates that Bazel is not responsible for making libmylib.so available.
  system_provided = 1,
)

En Windows:


cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  # mylib.lib is an import library for mylib.dll which will be passed to linker
  interface_library = "mylib.lib",
  # mylib.dll is provided by system environment, for example it can be found in PATH.
  # This indicates that Bazel is not responsible for making mylib.dll available.
  system_provided = 1,
)
5. Cómo vincular a bibliotecas estáticas o compartidas

En Unix:


cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  static_library = "libmylib.a",
  shared_library = "libmylib.so",
)

En Windows:


cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  static_library = "libmylib.lib", # A normal static library
  interface_library = "mylib.lib", # An import library for mylib.dll
  shared_library = "mylib.dll",
)

El resto es el mismo en Unix y Windows:


# first will link to libmylib.a (or libmylib.lib)
cc_binary(
  name = "first",
  srcs = ["first.cc"],
  deps = [":mylib"],
  linkstatic = 1, # default value
)

# second will link to libmylib.so (or libmylib.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

Name; obligatorio

Un nombre único para este destino.

deps

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

Lista de etiquetas; el valor predeterminado es []

Es la lista de archivos de encabezado publicados por esta biblioteca precompilada que se incluirán directamente en las fuentes en reglas dependientes.

Booleano; el valor predeterminado es False

Si es 1, cualquier objeto binario que dependa (directa o indirectamente) de esta biblioteca C++ precompilada se vinculará en todos los archivos de objeto archivados en la biblioteca estática, incluso si algunos no contienen símbolos a los que el objeto binario hace referencia. Esto es útil si no se llama explícitamente a tu código en el objeto binario, p.ej., si se registra para recibir alguna devolución de llamada que proporciona algún servicio.

Si Alwayslink no funciona con VS 2017 en Windows, debido a un problema conocido, actualiza VS 2017 a la versión más reciente.

includes

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 "Make variable". A cada cadena se le antepone la ruta de acceso del paquete y se pasa a la cadena de herramientas de C++ para la expansión a través de la función CROSSTOOL "include_paths". Una cadena de herramientas que se ejecuta en un sistema POSIX con definiciones de atributos típicas producirá -isystem path_to_package/include_entry. Solo debe usarse para bibliotecas de terceros que no cumplan con el estilo de escritura de las sentencias #include de Google. 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 largo alcance. Si tienes dudas, agrega marcas "-I" a COPTS.

La ruta de acceso include predeterminada no incluye los archivos generados. Si necesitas #include un archivo de encabezado generado, enuméralo en srcs.

interface_library

Etiqueta; el valor predeterminado es None

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

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

linkopts

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 asignación de token de shell de Bourne y la expansión de etiquetas. Cada cadena de este atributo se agrega a LINKOPTS antes de vincular 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 que genera ese destino se agrega a las opciones del vinculador. Se informa un error si la etiqueta no es válida o no se declara en deps.

objects

Lista de etiquetas; el valor predeterminado es []

pic_objects

Lista de etiquetas; el valor predeterminado es []

pic_static_library

Etiqueta; el valor predeterminado es None

shared_library

Etiqueta; el valor predeterminado es None

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

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

static_library

Etiqueta; el valor predeterminado es None

Una única biblioteca estática precompilada

Tipos de archivo 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 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, hdrs_check, implementation_deps, include_prefix, includes, licenses, linkopts, linkstamp, linkstatic, local_defines, module_interfaces, restricted_to, strip_include_prefix, tags, target_compatible_with, testonly, textual_hdrs, toolchains, visibility, win_def_file)

Usa cc_library() para las bibliotecas compiladas con C++. El resultado es un .so, .lo o .a, según lo que se necesite.

Si compilas algo con vinculación estática que depende de un cc_library, el resultado de una regla de biblioteca dependiente es el archivo .a. Si especificas alwayslink=True, obtendrás el archivo .lo.

El nombre real del archivo de salida es libfoo.so para la biblioteca compartida, donde foo es el nombre de la regla. Los otros tipos de bibliotecas terminan con .lo y .a, respectivamente. Si necesitas un nombre de biblioteca compartida específico, por ejemplo, para definir un módulo de Python, usa una genrule a fin de copiar la biblioteca con el nombre deseado.

Verificación de inclusión de encabezado

Todos los archivos de encabezado que se usan en la compilación deben declararse en las reglas hdrs o srcs de cc_*. Esto se aplica de manera forzosa.

Para las reglas cc_library, los encabezados de hdrs comprenden la interfaz pública de la biblioteca y se pueden incluir directamente desde los archivos en hdrs y srcs de la propia biblioteca y desde los archivos en hdrs y srcs de las reglas cc_* que enumeran la biblioteca en su deps. Los encabezados en srcs solo se deben incluir directamente desde los archivos en hdrs y srcs de la propia biblioteca. Cuando decidas si colocar un encabezado en hdrs o srcs, debes preguntar si deseas que los consumidores de esta biblioteca puedan incluirla directamente. Esta decisión es más o menos la misma que la que se tomó entre la visibilidad de public y private en los lenguajes de programación.

Las reglas cc_binary y cc_test no tienen una interfaz exportada, por lo que tampoco tienen un atributo hdrs. Todos los encabezados que pertenecen directamente al objeto binario o a la prueba deben enumerarse en el 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 inclusiones directas. En el ejemplo anterior, foo.cc puede incluir bar.h, que puede incluir baz.h, que, a su vez, puede incluir baz-impl.h. Técnicamente, la compilación de un archivo .cc puede incluir de forma transitiva cualquier archivo de encabezado en hdrs o srcs en cualquier cc_library del cierre transitivo de deps. En este caso, el compilador puede leer baz.h y baz-impl.h cuando compila foo.cc, pero foo.cc no debe contener #include "baz.h". Para que se permita, se debe agregar baz 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 función layering_check debe ser compatible con la cadena de herramientas y se debe solicitar de manera explícita, por ejemplo, a través de la marca de línea de comandos --features=layering_check o el parámetro features de la función package. Las cadenas de herramientas que proporciona Bazel solo admiten esta función con clang en Unix y macOS.

Ejemplos


cc_library(
    name = "ast_inspector_lib",
    srcs = ["ast_inspector_lib.cc"],
    hdrs = ["ast_inspector_lib.h"],
    visibility = ["//visibility:public"],
    deps = ["//third_party/llvm/llvm/tools/clang:frontend"],
    # alwayslink as we want to be able to call things in this library at
    # debug time, even if they aren't used anywhere in the code.
    alwayslink = 1,
)

El siguiente ejemplo proviene de third_party/python2_4_3/BUILD. Parte del código usa la biblioteca dl (para cargar otra biblioteca dinámica), por lo que esta regla especifica la opción de vínculo -ldl para vincular la biblioteca dl.


cc_library(
    name = "python2_4_3",
    linkopts = [
        "-ldl",
        "-lutil",
    ],
    deps = ["//third_party/expat"],
)

El siguiente ejemplo proviene de third_party/kde/BUILD. Mantenemos en el depósito los archivos .so compilados previamente. Los archivos de encabezado se encuentran en un subdirectorio llamado include.


cc_library(
    name = "kde",
    srcs = [
        "lib/libDCOP.so",
        "lib/libkdesu.so",
        "lib/libkhtml.so",
        "lib/libkparts.so",
        ...more .so files...,
    ],
    includes = ["include"],
    deps = ["//third_party/X11"],
)

El siguiente ejemplo proviene de third_party/gles/BUILD. A menudo, el código de terceros necesita defines y linkopts.


cc_library(
    name = "gles",
    srcs = [
        "GLES/egl.h",
        "GLES/gl.h",
        "ddx.c",
        "egl.c",
    ],
    defines = [
        "USE_FLOAT",
        "__GL_FLOAT",
        "__GL_COMMON",
    ],
    linkopts = ["-ldl"],  # uses dlopen(), dl library
    deps = [
        "es",
        "//third_party/X11",
    ],
)

Argumentos

Atributos
name

Name; obligatorio

Un nombre único para este destino.

deps

Lista de etiquetas; el valor predeterminado es []

Es la lista de otras bibliotecas de las que depende la biblioteca objetivo.

Estos pueden ser objetivos de cc_library o objc_library.

Consulta los comentarios generales sobre deps en Atributos típicos definidos por la mayoría de las reglas de compilación.

Estos deberían ser nombres de reglas de la biblioteca C++. Cuando compiles un objeto binario que vincule la biblioteca de esta regla, también vincularás las bibliotecas en deps.

A pesar del nombre "deps", no todos los clientes de esta biblioteca pertenecen a esta ubicación. Las dependencias de datos del entorno de ejecución pertenecen a data. Los archivos de origen generados por otras reglas pertenecen a srcs.

Para vincular una biblioteca de terceros precompilada, agrega su nombre a srcs.

Para depender de algo sin vincularlo a esta biblioteca, agrega su nombre a data.

srcs

Lista de etiquetas; el valor predeterminado es []

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

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

Los archivos ensambladores puros (.s, .asm) no se procesan previamente y, por lo general, se compilan con el ensamblador. Los archivos de ensamblado (.S) previamente procesados y, por lo general, se compilan con el compilador C/C++.

No se compilará un archivo .h, pero estará disponible para que lo incluyan las fuentes en esta regla. Los archivos .cc y .h pueden incluir directamente encabezados enumerados en estos srcs, en el hdrs de esta regla o en cualquier regla que se enumere en el argumento deps.

Todos los archivos #included deben mencionarse en el atributo hdrs de esta o las reglas cc_library a las que se hace referencia. De lo contrario, deben aparecer en srcs si son privados de esta biblioteca. Consulta "Verificación de inclusión de encabezado" para obtener una descripción más detallada.

Los archivos .so, .lo y .a son archivos compilados previamente. Es posible que tu biblioteca los tenga como srcs si usa código de terceros para el que no tenemos código fuente.

Si el atributo srcs incluye la etiqueta de otra regla, cc_library usará los archivos de salida de esa regla como archivos de origen para compilar. Esto es útil para la generación única de código fuente (para más que un uso ocasional, es mejor implementar una clase de regla de Starlark y usar la API de cc_common).

Tipos de archivos srcs permitidos:

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

... y las reglas que generan esos archivos (p.ej., cc_embed_data). Las diferentes extensiones denotan diferentes lenguajes de programación según la convención de GCC.

data

Lista de etiquetas; el valor predeterminado es []

Es la lista de archivos que necesita esta biblioteca en el entorno de ejecución. Consulta los comentarios generales sobre data en Atributos típicos definidos por la mayoría de las reglas de compilación.

Si data es el nombre de un archivo generado, esta regla cc_library depende automáticamente de la regla que se genera.

Si data es el nombre de una regla, esta regla cc_library depende automáticamente de ella, y sus outs se agregan de forma automática a los archivos de datos de esta cc_library.

Tu código C++ puede acceder a estos archivos de datos de la siguiente manera:


  const std::string path = devtools_build::GetDataDependencyFilepath(
      "my/test/data/file");
hdrs

Lista de etiquetas; el valor predeterminado es []

Es la lista de archivos de encabezado publicados por esta biblioteca que se incluirán directamente en las fuentes en reglas dependientes.

Esta es la ubicación más recomendable para declarar archivos de encabezado que describen la interfaz para la biblioteca. Estos encabezados estarán disponibles para que los incluyan fuentes en esta regla o en reglas dependientes. Los encabezados que no pueda incluir un cliente de esta biblioteca deben enumerarse en el atributo srcs, incluso si se incluyen en un encabezado publicado. Consulta "Verificación de inclusión de encabezado" para obtener una descripción más detallada.

Tipos de archivos headers permitidos: .h, .hh, .hpp y .hxx.

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 elementos ignorados de Sanitizer, por ejemplo. Los archivos especificados aquí se pueden usar en copias con la función $(location).
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 objetivo binario.

Booleano; el valor predeterminado es False

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

Si Alwayslink no funciona con VS 2017 en Windows, debido a un problema conocido, actualiza VS 2017 a la versión más reciente.

copts

Lista de cadenas; el valor predeterminado es []

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

Cada cadena de este atributo se agrega en el orden determinado a COPTS antes de compilar el destino binario. Las marcas solo se aplican para compilar este destino, no sus dependencias, por lo que debes tener 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. Este atributo no debería ser necesario fuera de third_party.

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 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 la sustitución de la variable"Make" y la asignación de token de shell de Bourne. Cada cadena, que debe consistir en un solo token de shell de Bourne, está precedida por -D y se agrega a la línea de comandos de compilación de este destino, así como a cada regla que depende de ella. Ten mucho cuidado, ya que esto puede tener efectos de gran alcance. Si tienes dudas, agrega valores definidos a local_defines en su lugar.
hdrs_check

String; el valor predeterminado es ""

Obsoleto, no-op.
implementation_deps

Lista de etiquetas; el valor predeterminado es []

Es la lista de otras bibliotecas de las que depende la biblioteca objetivo. A diferencia de deps, los encabezados y las rutas de acceso de inclusión de estas bibliotecas (y todas sus dependencias transitivas) solo se usan para la compilación de esta biblioteca, y no para las bibliotecas que dependen de ella. Las bibliotecas especificadas con implementation_deps siguen vinculadas en destinos binarios que dependen de esta.

Por ahora, el uso se limita a cc_libraries y está protegido por la marca --experimental_cc_implementation_deps.

include_prefix

String; 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 en el atributo hdrs de esta regla en el valor de este atributo antepuesto a su ruta de acceso relativa del repositorio.

Se quita el prefijo del atributo strip_include_prefix antes de agregar este prefijo.

Este atributo solo es legal según las third_party.

includes

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 "Make variable". A cada cadena se le antepone la ruta de acceso del paquete y se pasa a la cadena de herramientas de C++ para la expansión a través de la función CROSSTOOL "include_paths". Una cadena de herramientas que se ejecuta en un sistema POSIX con definiciones de atributos típicas producirá -isystem path_to_package/include_entry. Solo debe usarse para bibliotecas de terceros que no cumplan con el estilo de escritura de las sentencias #include de Google. 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 largo alcance. Si tienes dudas, agrega marcas "-I" a COPTS.

Las rutas de acceso include agregadas incluirán archivos generados y archivos en el árbol de fuentes.

linkopts

Lista de cadenas; el valor predeterminado es []

Consulta cc_binary.linkopts. El atributo linkopts también se aplica a cualquier destino que dependa, directa o indirectamente, de esta biblioteca a través de los atributos deps (o de otros atributos que se traten de manera similar: el atributo malloc de cc_binary). Los linkopts de dependencia tienen prioridad sobre los dependientes (es decir, los vínculos de dependencia dependientes aparecen más adelante en la línea de comandos). Las opciones de vínculo especificadas en --linkopt tienen prioridad sobre las de reglas.

Ten en cuenta que el atributo linkopts solo se aplica cuando se crean archivos .so o ejecutables, no cuando se crean archivos .a o .lo. Por lo tanto, si se establece el atributo linkstatic=True, el atributo linkopts no tiene efecto en la creación de esta biblioteca, solo en otros destinos que dependen de ella.

Además, es importante tener en cuenta que las opciones “-Wl,-soname” o “-Xlinker -soname” no son compatibles y nunca deben especificarse en este atributo.

Los archivos .so que producen las reglas cc_library no están vinculados con las bibliotecas de las que dependen. Si intentas crear una biblioteca compartida para usarla fuera del repositorio principal, p.ej., para uso manual con dlopen() o LD_PRELOAD, puede ser mejor usar una regla cc_binary con el atributo linkshared=True. Consulta cc_binary.linkshared.

linkstamp

Etiqueta; el valor predeterminado es None

De manera simultánea, compila y vincula el archivo de origen C++ especificado al objeto binario final. Este engaño es necesario para introducir la información de la marca de tiempo en objetos binarios; si compilamos el archivo de origen en un archivo de objeto de la manera habitual, la marca de tiempo sería incorrecta. Es posible que una compilación de marcas de vínculos no incluya ningún conjunto particular de indicadores de compilador y, por lo tanto, no debe depender de ningún encabezado, opción de compilador ni otra variable de compilación en particular. 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 modo estático. Para cc_library.link_static: consulta a continuación.

De forma predeterminada, esta opción está activada para cc_binary y desactivada para el resto.

Si está habilitada y es un objeto binario o de prueba, esta opción indica a la herramienta de compilación que vincule las bibliotecas de usuario .a en lugar de .so para las bibliotecas de usuario, siempre que sea posible. Las bibliotecas de sistema como libc (pero no las bibliotecas en tiempo de ejecución C/C++, ver a continuación) siguen 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á vinculado de forma dinámica y, por lo tanto, solo será principalmente estático.

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

  • STATIC con la función full_static_link, en la 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: Todas las bibliotecas de usuario están vinculadas de forma estática (si hay una versión estática disponible), pero las bibliotecas del sistema (excepto las bibliotecas de tiempo de ejecución C/C++) están vinculadas de forma dinámica, p.ej., "gcc foo.o libfoo.a libbaz.a -lm".
    Este modo se habilita especificando linkstatic=True.
  • DINÁMICO, 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".
    Este modo se habilita especificando linkstatic=False.

Si el atributo linkstatic o fully_static_link en features se usan fuera de //third_party, incluye un comentario cerca de la regla para explicar el motivo.

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

Debería haber muy poco código compilado con linkstatic=False en producción. Si es linkstatic=False, la herramienta de compilación creará symlinks a las 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 la sustitución de la variable"Make" y la asignación de token de shell de Bourne. Cada cadena, que debe consistir en un solo token de shell de Bourne, está precedida por -D y se agrega a la línea de comandos de compilación para este destino, pero no a sus dependientes.
module_interfaces

Lista de etiquetas; el valor predeterminado es []

La lista de archivos se considera interfaz de módulos de C++20.

C++ Standard no tiene restricciones sobre la extensión de archivo de la interfaz del módulo.

  • Usa cppm de Clang
  • GCC puede usar cualquier extensión de archivo fuente.
  • Uso de ixx de MSVC

El uso está protegido por la marca --experimental_cpp_modules.

strip_include_prefix

String; el valor predeterminado es ""

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 de acceso con este corte de prefijo.

Si es una ruta de acceso relativa, se toma como una ruta relativa de paquete. Si es absoluta, se entiende como una ruta de acceso relativa de repositorio.

El prefijo del atributo include_prefix se agrega después de que se quita este prefijo.

Este atributo solo es legal según las third_party.

textual_hdrs

Lista de etiquetas; el valor predeterminado es []

Es la lista de archivos de encabezado publicados por esta biblioteca que se incluirán de manera textual en las fuentes en reglas dependientes.

Esta es la ubicación para declarar archivos de encabezado que no se pueden compilar por sí mismos; es decir, siempre deben ser incluidos de forma textual por otros archivos fuente para compilar 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, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, restricted_to, tags, target_compatible_with, testonly, toolchains, 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; obligatorio

Un nombre único para este destino.

deps

Lista de etiquetas; el valor predeterminado es []

Es la lista de reglas proto_library para las que se generará código C++.

cc_shared_library

Ver el código fuente de la regla
cc_shared_library(name, deps, additional_linker_inputs, compatible_with, deprecation, distribs, dynamic_deps, exec_compatible_with, exec_properties, experimental_disable_topo_sort_do_not_use_remove_before_7_0, exports_filter, features, restricted_to, roots, shared_lib_name, static_deps, tags, target_compatible_with, testonly, toolchains, user_link_flags, visibility, win_def_file)

Produce una biblioteca compartida.

Ejemplo

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

En el ejemplo, foo_shared vincula estáticamente foo y baz. Este último es una dependencia transitiva. No vincula bar porque ya lo proporciona dynamic_dep bar_shared de forma dinámica.

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

Se supone que se exporta cada dependencia directa de cc_shared_library. Por lo tanto, durante el análisis, Bazel supone que foo_shared está exportando foo. No se supone que foo_shared exporta baz. También se supone que se exportarán todos los destinos que coincidan con exports_filter.

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 que produce bar_shared tendrá el nombre bar.so, a diferencia del nombre libbar.so, que tendría de forma predeterminada en Linux.

Errores

Two shared libraries in dependencies export the same symbols.

Esto sucederá cada vez que crees un destino con dos dependencias cc_shared_library diferentes que exporten el mismo destino. Para solucionar este problema, debes evitar que las bibliotecas se exporten en una de las dependencias 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 destino de manera 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 cc_shared_library. Al mismo tiempo, el que aún lo vincula debe exportar la biblioteca para que el que no lo vincula mantenga la visibilidad de los símbolos. Otra forma es extraer una tercera biblioteca que exporte el destino. Una tercera manera es etiquetar el elemento cc_library con LINKABLE_MORE_THAN_ONCE, pero esta corrección debería ser poco común y debes asegurarte de que cc_library sea seguro para vincularlo más de una vez.

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

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

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

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

Si tienes una biblioteca dinámica precompilada, no es necesario ni se puede vincular de forma estática al destino cc_shared_library actual que estás creando en ese momento. Por lo tanto, no pertenece a deps de cc_shared_library. Si esta biblioteca dinámica precompilada depende de uno de tus cc_libraries, cc_library necesitará 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, reclamas que exportas un destino que una de tus dependencias dinámicas ya exporta.

Para solucionar este problema, quita el destino de deps y confía en él de la dependencia dinámica, o bien asegúrate de que exports_filter no detecte este destino.

Argumentos

Atributos
name

Name; obligatorio

Un nombre único para este destino.

deps

Lista de etiquetas; el valor predeterminado es []

Bibliotecas de nivel superior que se vincularán de forma estática de forma incondicional 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 esté vinculada por un cc_shared_library en dynamic_deps.

Durante el análisis, la implementación de reglas considerará que la biblioteca compartida exporta todos los destinos enumerados en deps para generar errores cuando varios cc_shared_libraries exporten los mismos destinos. La implementación de reglas no se encarga de informar al vinculador qué símbolos debe exportar el objeto compartido. El usuario debe encargarse de esto mediante secuencias de comandos del vinculador o declaraciones de 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 a más de un cc_shared_library. Para evitar esto, agrega "LINKABLE_MORE_THAN_ONCE" a cc_library.tags o enumera la biblioteca "cc_library" como una exportación de una de las bibliotecas compartidas para que una pueda convertirse en dynamic_dep de la otra.

additional_linker_inputs

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 necesite el vinculador para estar al tanto de este archivo. Puedes hacerlo mediante el 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 destino actual.

La implementación de cc_shared_library usará la lista de dynamic_deps (de forma transitiva, es decir, también el dynamic_deps del dynamic_deps del destino actual) para decidir en qué cc_libraries del deps transitivo no se debe vincular, porque ya los proporciona otro cc_shared_library.

experimental_disable_topo_sort_do_not_use_remove_before_7_0

Booleano; el valor predeterminado es False

exports_filter

Lista de cadenas; el valor predeterminado es []

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

La Biblioteca compartida ya considera que cualquier deps de destino se exportará. Se debe usar este atributo para enumerar todos los destinos que exporta la biblioteca compartida, pero que son dependencias transitivas de deps.

Ten en cuenta que este atributo en realidad no agrega una arista de dependencia a esos destinos; en su lugar, deps debe crearla.Las entradas de este atributo son solo strings. Ten en cuenta que, cuando colocas un destino en este atributo, esto se considera una reclamación de que la biblioteca compartida exporta los símbolos desde ese destino. La lógica cc_shared_library no controla la indicación al vinculador de los símbolos que 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 inferior a foo/, como foo/bar/BUILD

roots

Lista de etiquetas; el valor predeterminado es []

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. En ocasiones, 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 predeterminado lib*. En ese caso, puedes usar este atributo para elegir un nombre personalizado.
static_deps

Lista de cadenas; el valor predeterminado es []

Lista de cadenas; el valor predeterminado es []

Cualquier marca adicional que desees pasar al vinculador. Por ejemplo, para que el vinculador reconozca una secuencia de comandos del vinculador pasada a través de additional_linker_inputs, puedes usar 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 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_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, dynamic_deps, env, env_inherit, exec_compatible_with, exec_properties, features, flaky, hdrs_check, includes, licenses, link_extra_lib, linkopts, linkshared, linkstatic, local, local_defines, malloc, module_interfaces, nocopts, reexport_deps, restricted_to, shard_count, size, stamp, tags, target_compatible_with, testonly, timeout, toolchains, visibility, win_def_file)

Una regla cc_test() compila una prueba. En este caso, una prueba es un wrapper binario para un código de prueba.

De forma predeterminada, las pruebas de C++ se vinculan de forma dinámica.
Para vincular de forma estática una prueba de unidades, especifica linkstatic=True. Probablemente sería bueno indicar por qué tu prueba necesita linkstatic; esto no es obvio.

Destinos de salida implícitos

  • name.stripped (solo se compila si se solicita de manera explícita): Es una versión reducida del objeto binario. Se ejecuta strip -g en el objeto binario para quitar los símbolos de depuración. Se pueden proporcionar opciones de barra adicionales en la línea de comandos mediante --stripopt=-foo.
  • name.dwp (solo se compila si se solicita explícitamente): Si Fission está habilitada, un archivo de paquete de información de depuración adecuado para depurar objetos binarios implementados de forma remota. De lo contrario, debe ser un archivo vacío.

Consulta los argumentos cc_binary(), con la excepción de que el argumento stamp está configurado en 0 de forma predeterminada para las pruebas y que cc_test tiene atributos adicionales comunes a todas las reglas de prueba (*_test).

Argumentos

Atributos
name

Name; obligatorio

Un nombre único para este destino.

deps

Lista de etiquetas; el valor predeterminado es []

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

Pueden ser objetivos cc_library o objc_library.

También se permite colocar secuencias de comandos del vinculador (.lds) en dependencias y hacer referencia a ellas en linkopts.
srcs

Lista de etiquetas; el valor predeterminado es []

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

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

Los archivos ensambladores puros (.s, .asm) no se procesan previamente y, por lo general, se compilan con el ensamblador. Los archivos de ensamblado (.S) previamente procesados y, por lo general, se compilan con el compilador C/C++.

No se compilará un archivo .h, pero estará disponible para que lo incluyan las fuentes en esta regla. Los archivos .cc y .h pueden incluir directamente encabezados enumerados en estos srcs, en el hdrs de esta regla o en cualquier regla que se enumere en el argumento deps.

Todos los archivos #included deben mencionarse en el atributo hdrs de esta o las reglas cc_library a las que se hace referencia. De lo contrario, deben aparecer en srcs si son privados de esta biblioteca. Consulta "Verificación de inclusión de encabezado" para obtener una descripción más detallada.

Los archivos .so, .lo y .a son archivos compilados previamente. Es posible que tu biblioteca los tenga como srcs si usa código de terceros para el que no tenemos código fuente.

Si el atributo srcs incluye la etiqueta de otra regla, cc_library usará los archivos de salida de esa regla como archivos de origen para compilar. Esto es útil para la generación única de código fuente (para más que un uso ocasional, es mejor implementar una clase de regla de Starlark y usar la API de cc_common).

Tipos de archivos srcs permitidos:

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

... y las reglas que generan esos archivos (p.ej., cc_embed_data). Las diferentes extensiones denotan diferentes lenguajes de programación según la convención de GCC.

data

Lista de etiquetas; el valor predeterminado es []

Es la lista de archivos que necesita esta biblioteca en el entorno de ejecución. Consulta los comentarios generales sobre data en Atributos típicos definidos por la mayoría de las reglas de compilación.

Si data es el nombre de un archivo generado, esta regla cc_library depende automáticamente de la regla que se genera.

Si data es el nombre de una regla, esta regla cc_library depende automáticamente de ella, y sus outs se agregan de forma automática a los archivos de datos de esta cc_library.

Tu código C++ puede acceder a estos archivos de datos de la siguiente manera:


  const std::string path = devtools_build::GetDataDependencyFilepath(
      "my/test/data/file");
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 objetivo binario.

copts

Lista de cadenas; el valor predeterminado es []

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

Cada cadena de este atributo se agrega en el orden determinado a COPTS antes de compilar el destino binario. Las marcas solo se aplican para compilar este destino, no sus dependencias, por lo que debes tener 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. Este atributo no debería ser necesario fuera de third_party.

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 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 la sustitución de la variable"Make" y la asignación de token de shell de Bourne. Cada cadena, que debe consistir en un solo token de shell de Bourne, está precedida por -D y se agrega a la línea de comandos de compilación de este destino, así como a cada regla que depende de ella. Ten mucho cuidado, ya que esto puede tener efectos de gran alcance. Si tienes dudas, agrega valores definidos a local_defines en su lugar.
dynamic_deps

Lista de etiquetas; el valor predeterminado es []

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

La implementación de cc_shared_library usará la lista de dynamic_deps (de forma transitiva, es decir, también el dynamic_deps del dynamic_deps del destino actual) para decidir en qué cc_libraries del deps transitivo no se debe vincular, porque ya los proporciona otro cc_shared_library.

hdrs_check

String; el valor predeterminado es ""

Obsoleto, no-op.
includes

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 "Make variable". A cada cadena se le antepone la ruta de acceso del paquete y se pasa a la cadena de herramientas de C++ para la expansión a través de la función CROSSTOOL "include_paths". Una cadena de herramientas que se ejecuta en un sistema POSIX con definiciones de atributos típicas producirá -isystem path_to_package/include_entry. Solo debe usarse para bibliotecas de terceros que no cumplan con el estilo de escritura de las sentencias #include de Google. 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 largo alcance. Si tienes dudas, agrega marcas "-I" a COPTS.

Las rutas de acceso include agregadas incluirán archivos generados y archivos en el árbol de fuentes.

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++ están vinculados con //tools/cpp:link_extra_lib, que 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. Si configuras la marca de etiqueta, podrás vincular dependencias opcionales, como anulaciones para símbolos débiles, interceptores para funciones de bibliotecas compartidas o bibliotecas de tiempo de ejecución especiales (para reemplazos de malloc, es preferible usar malloc o --custom_malloc). Si configuras este atributo en None, se inhabilita este comportamiento.

linkopts

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 asignación de token de shell de Bourne y la expansión de etiquetas. Cada cadena de este atributo se agrega a LINKOPTS antes de vincular 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 que genera ese destino se agrega a las opciones del vinculador. Se informa un error si la etiqueta no es válida o no se declara en deps.

linkshared

Booleano; el valor predeterminado es False

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

La presencia de esta marca significa que la vinculación se realiza con la marca -shared a gcc, y la biblioteca compartida resultante es adecuada para cargarse, por ejemplo, en un programa Java. Sin embargo, para fines de 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 manualmente por otros programas, por lo que no debe considerarse un sustituto de la regla cc_library. Para mejorar la escalabilidad, te recomendamos que evites este enfoque por completo y que, en su lugar, permitas que java_library dependa de las reglas cc_library.

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

linkstatic

Booleano; el valor predeterminado es False

Para cc_binary y cc_test, vincula el objeto binario en modo estático. Para cc_library.link_static: consulta a continuación.

De forma predeterminada, esta opción está activada para cc_binary y desactivada para el resto.

Si está habilitada y es un objeto binario o de prueba, esta opción indica a la herramienta de compilación que vincule las bibliotecas de usuario .a en lugar de .so para las bibliotecas de usuario, siempre que sea posible. Las bibliotecas de sistema como libc (pero no las bibliotecas en tiempo de ejecución C/C++, ver a continuación) siguen 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á vinculado de forma dinámica y, por lo tanto, solo será principalmente estático.

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

  • STATIC con la función full_static_link, en la 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: Todas las bibliotecas de usuario están vinculadas de forma estática (si hay una versión estática disponible), pero las bibliotecas del sistema (excepto las bibliotecas de tiempo de ejecución C/C++) están vinculadas de forma dinámica, p.ej., "gcc foo.o libfoo.a libbaz.a -lm".
    Este modo se habilita especificando linkstatic=True.
  • DINÁMICO, 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".
    Este modo se habilita especificando linkstatic=False.

Si el atributo linkstatic o fully_static_link en features se usan fuera de //third_party, incluye un comentario cerca de la regla para explicar el motivo.

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

Debería haber muy poco código compilado con linkstatic=False en producción. Si es linkstatic=False, la herramienta de compilación creará symlinks a las 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 la sustitución de la variable"Make" y la asignación de token de shell de Bourne. Cada cadena, que debe consistir en un solo token de shell de Bourne, está precedida por -D y se agrega a la línea de comandos de compilación para este destino, pero no a sus dependientes.
malloc

Etiqueta; el valor predeterminado es "@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 regla que no es de C++, esta opción no tiene efecto. El valor de este atributo se ignora si se especifica linkshared=True.

module_interfaces

Lista de etiquetas; el valor predeterminado es []

La lista de archivos se considera interfaz de módulos de C++20.

C++ Standard no tiene restricciones sobre la extensión de archivo de la interfaz del módulo.

  • Usa cppm de Clang
  • GCC puede usar cualquier extensión de archivo fuente.
  • Uso de ixx de MSVC

El uso está protegido por la marca --experimental_cpp_modules.

nocopts

String; el valor predeterminado es ""

Se quitaron las opciones coincidentes del comando de compilación de C++. Sujeto a la sustitución "Make" variable. 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 de manera explícita en el atributo copts de la regla) se quitará de COPTS para la compilación de esta regla. Este atributo no debe ser necesario ni usarse fuera de third_party. Los valores no se procesan de ninguna manera, excepto mediante la sustitución de variables “Make”.
reexport_deps

Lista de etiquetas; el valor predeterminado es []

stamp

Número entero; 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 objeto binario, incluso en compilaciones de --nostamp. Se debe evitar esta configuración, ya que es posible que elimine el almacenamiento en caché remoto del objeto binario y cualquier acción descendente que dependa de él.
  • stamp = 0: Siempre reemplaza la información de compilación por valores constantes. Esto brinda un buen almacenamiento en caché de resultados de compilación.
  • stamp = -1: La marca --[no]stamp controla la incorporación de la información de compilación.

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

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_toolchain

Ver el código 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_compatible_with, exec_properties, exec_transition_for_inputs, features, libc_top, licenses, linker_files, module_map, objcopy_files, output_licenses, restricted_to, static_runtime_lib, strip_files, supports_header_parsing, supports_param_files, tags, target_compatible_with, testonly, toolchain_config, toolchain_identifier, toolchains, visibility)

Representa una cadena de herramientas de C++.

Esta regla es responsable de lo siguiente:

  • Recopila todos los artefactos necesarios para que se ejecuten las acciones de C++. Esto se hace mediante atributos como all_files, compiler_files, linker_files y otros que terminan en _files. Por lo general, estos son grupos de archivos que globalizan todos los archivos necesarios.
  • Generando líneas de comandos correctas para las acciones de C++. Esto se hace con el proveedor CcToolchainConfigInfo (consulta más detalles a continuación).

Usa el atributo toolchain_config para configurar la cadena de herramientas de C++. Consulta también esta página para ver documentación elaborada de la cadena de herramientas de C++ y de su selección.

Usa tags = ["manual"] para evitar que se compilen y configuren cadenas de herramientas innecesariamente cuando se invoque bazel build //....

Argumentos

Atributos
name

Name; obligatorio

Un nombre único para este destino.

all_files

Label; obligatorio

Es una colección de todos los artefactos de cc_toolchain. Estos artefactos se agregarán como entradas a todas las acciones relacionadas con rules_cc (excepto aquellas que usen conjuntos más precisos de artefactos de los atributos que aparecen 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 sellos de vínculos necesita archivos de compilación y de vínculo, por lo que toma all_files).

Es lo que contiene cc_toolchain.files, y todas las reglas de Starlark lo usan con la cadena de herramientas de C++.

ar_files

Etiqueta; el valor predeterminado es None

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

Etiqueta; el valor predeterminado es None

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

Label; 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 de cc_toolchain necesarios para las acciones de compilación en caso de que se admita la detección de entradas (por el momento, solo para Google).
coverage_files

Etiqueta; 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, se usa all_files.
dwp_files

Label; 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 en tiempo de ejecución C++ (p.ej., libstdc++.so).

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

exec_transition_for_inputs

Booleano; el valor predeterminado es False

Ya no está disponible. No-ops.
libc_top

Etiqueta; el valor predeterminado es None

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

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

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

Label; obligatorio

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

Lista de cadenas; el valor predeterminado es []

static_runtime_lib

Etiqueta; el valor predeterminado es None

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

Se usará cuando la función “static_link_cpp_runtimes” esté habilitada y cuando vinculemos las dependencias de forma estática.

strip_files

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

Se establece en True cuando cc_toolchain admite 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

Label; obligatorio

La etiqueta de la regla que proporciona cc_toolchain_config_info.
toolchain_identifier

String; el valor predeterminado es ""

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

Hasta que se corrija 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 el código fuente de la regla
cc_toolchain_suite(name, compatible_with, deprecation, distribs, features, licenses, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)

Obsoleto: la regla no es operativa y se quitará.

Argumentos

Atributos
name

Name; obligatorio

Un nombre único para este destino.

fdo_prefetch_hints

Ver el código fuente de la regla
fdo_prefetch_hints(name, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, profile, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)

Representa un perfil de sugerencias de carga previa de FDO que se encuentra en el lugar de trabajo. Ejemplos:


fdo_prefetch_hints(
    name = "hints",
    profile = "//path/to/hints:profile.afdo",
)

Argumentos

Atributos
name

Name; obligatorio

Un nombre único para este destino.

profile

Label; obligatorio

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

fdo_profile

Ver el código fuente de la regla
fdo_profile(name, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, memprof_profile, profile, proto_profile, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)

Representa un perfil de FDO que se encuentra en el lugar de trabajo. Ejemplo:


fdo_profile(
    name = "fdo",
    profile = "//path/to/fdo:profile.zip",
)

Argumentos

Atributos
name

Name; obligatorio

Un nombre único para este destino.

memprof_profile

Etiqueta; el valor predeterminado es None

Etiqueta del perfil de 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.
profile

Label; obligatorio

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

Etiqueta; el valor predeterminado es None

Etiqueta del perfil de protobuf.

memprof_profile

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

Representa un perfil de MEMPROF que se encuentra en el lugar de trabajo. Ejemplo:


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

Argumentos

Atributos
name

Name; obligatorio

Un nombre único para este destino.

profile

Label; obligatorio

Etiqueta del perfil de 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, cc_profile, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, ld_profile, restricted_to, tags, target_compatible_with, testonly, toolchains, 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"
)

Argumentos

Atributos
name

Name; obligatorio

Un nombre único para este destino.

cc_profile

Label; obligatorio

Etiqueta del perfil que se pasó a las distintas acciones de compilación. Este archivo tiene la extensión .txt.
ld_profile

Label; obligatorio

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