Regras
- cc_binary
- cc_import
- cc_library
- cc_shared_library
- cc_static_library
- cc_test
- cc_toolchain
- cc_toolchain_suite
- fdo_prefetch_hints
- fdo_profile
- memprof_profile
- propeller_optimize
cc_binary
Ver origem da regracc_binary(name, deps, srcs, data, additional_linker_inputs, args, compatible_with, conlyopts, copts, cxxopts, defines, deprecation, dynamic_deps, env, exec_compatible_with, exec_group_compatible_with, exec_properties, features, hdrs_check, includes, licenses, link_extra_lib, linkopts, linkshared, linkstatic, local_defines, malloc, module_interfaces, nocopts, output_licenses, package_metadata, reexport_deps, restricted_to, stamp, tags, target_compatible_with, testonly, toolchains, visibility, win_def_file)
Ele produz um binário executável.
O
name
do destino precisa ser o mesmo nome do arquivo de origem que é o ponto de entrada principal do aplicativo (sem a extensão).
Por exemplo, se o ponto de entrada estiver em main.cc
, o nome deverá ser main
.
Metas de saída implícitas
name.stripped
(criado somente se solicitado explicitamente): uma versão reduzida do binário. Ostrip -g
é executado no binário para remover símbolos de depuração. Outras opções de remoção podem ser fornecidas na linha de comando usando--stripopt=-foo
.name.dwp
(criado apenas se solicitado explicitamente): se o Fission estiver ativado, um arquivo de pacote de informações de depuração adequado para depurar binários implantados remotamente. Caso contrário, um arquivo vazio.
Argumentos
Atributos | |
---|---|
name |
Nome: obrigatório Um nome exclusivo para essa segmentação. |
deps
|
Lista de rótulos. O padrão é Podem ser destinos linkopts ,
mas considere
additional_linker_inputs
para esse caso de uso.
|
srcs
|
Lista de rótulos. O padrão é Todos os arquivos Arquivos de assembler puro (.s, .asm) não são pré-processados e geralmente são criados usando o assembler. Os arquivos de assembly pré-processados (.S) são pré-processados e geralmente criados usando o compilador C/C++. Um arquivo Todos os arquivos Os arquivos Se o atributo
Tipos de arquivos
... e todas as regras que produzem esses arquivos (por exemplo, |
data
|
Lista de rótulos. O padrão é data em Atributos típicos definidos pela maioria das regras de build.
Se um Se um Seu código C++ pode acessar esses arquivos de dados da seguinte maneira:
|
additional_linker_inputs
|
Lista de rótulos. O padrão é
Ao contrário de Por exemplo, arquivos .res do Windows compilados podem ser fornecidos aqui para serem incorporados ao destino binário. |
conlyopts
|
Lista de strings. O padrão é |
copts
|
Lista de strings. O padrão é
Cada string nesse atributo é adicionada na ordem especificada a
Se o pacote declarar o recurso
|
cxxopts
|
Lista de strings. O padrão é |
defines
|
Lista de strings. O padrão é -D e adicionada à linha de comando de compilação para esse destino,
bem como a todas as regras que dependem dele. Tenha muito cuidado, porque isso pode ter efeitos de longo alcance. As definições são adicionadas a todos os destinos que dependem desse destino. Em caso de dúvida, adicione valores de definição a
local_defines .
|
dynamic_deps
|
Lista de rótulos. O padrão é cc_shared_library de que o destino atual depende.
A implementação |
hdrs_check
|
String; o padrão é |
includes
|
Lista de strings. O padrão é -isystem path_to_package/include_entry .
Isso só deve ser usado para bibliotecas de terceiros que
não estão em conformidade com o estilo do Google de escrever instruções #include.
Ao contrário do COPTS, essas flags são adicionadas a essa regra e a todas as regras que dependem dela. Observação: não as regras de que ele depende. Tome muito cuidado, porque isso pode ter efeitos abrangentes. Em caso de dúvida, adicione flags "-I" a COPTS.
Os caminhos |
link_extra_lib
|
Rótulo; o padrão é
Por padrão, os binários C++ são vinculados a |
linkopts
|
Lista de strings. O padrão é LINKOPTS antes de vincular o destino binário.
Cada elemento dessa lista que não começa com |
linkshared
|
Booleano; o padrão é linkshared=True na sua regra. Por padrão, essa opção fica desativada.
A presença dessa flag significa que a vinculação ocorre com a flag
Se você especificar |
linkstatic
|
Booleano; o padrão é cc_binary e
cc_test : vincule o binário no modo
estático. Para cc_library.link_static : consulte abaixo.
Por padrão, essa opção fica ativada para
Se ativada e se for um binário ou teste, essa opção vai instruir a ferramenta de build a vincular
Há três maneiras diferentes de vincular um executável:
Se o atributo
O atributo
É preciso haver muito pouco código criado com |
local_defines
|
Lista de strings. O padrão é -D e adicionada à linha de comando de compilação para essa meta,
mas não para os dependentes dela. Ao contrário de defines , as definições só são adicionadas à
linha de comando de compilação para essa meta.
|
malloc
|
Rótulo; o padrão é
Por padrão, os binários C++ são vinculados a |
module_interfaces
|
Lista de rótulos. O padrão é O padrão C++ não tem restrição sobre a extensão do arquivo de interface do módulo.
O uso é protegido pela flag
|
nocopts
|
String; o padrão é COPTS preexistente que corresponda a essa expressão regular (incluindo valores especificados explicitamente no atributo copts da regra) será removido de COPTS para fins de compilação dessa regra.
Esse atributo não deve ser necessário nem usado
fora de third_party . Os valores não são pré-processados de nenhuma outra forma além da substituição da variável "Make".
|
reexport_deps
|
Lista de rótulos. O padrão é |
stamp
|
Número inteiro. O padrão é
Os binários carimbados não são recriados, a menos que as dependências mudem. |
win_def_file
|
Rótulo; o padrão é Esse atributo só deve ser usado quando o Windows é a plataforma de destino. Ele pode ser usado para exportar símbolos durante a vinculação de uma biblioteca compartilhada. |
cc_import
Ver origem da regracc_import(name, deps, data, hdrs, alwayslink, compatible_with, deprecation, exec_compatible_with, exec_group_compatible_with, exec_properties, features, includes, interface_library, linkopts, objects, package_metadata, pic_objects, pic_static_library, restricted_to, shared_library, static_library, strip_include_prefix, system_provided, tags, target_compatible_with, testonly, toolchains, visibility)
As regras do cc_import
permitem que os usuários importem bibliotecas C/C++ pré-compiladas.
Confira os casos de uso típicos:
1. Como vincular uma 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 = True,
)
cc_import(
name = "mylib",
hdrs = ["mylib.h"],
shared_library = "libmylib.so",
)
No 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",
)
No 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",
)
system_provided=True
No 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 = True,
)
No 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 = True,
)
No Unix:
cc_import(
name = "mylib",
hdrs = ["mylib.h"],
static_library = "libmylib.a",
shared_library = "libmylib.so",
)
No 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",
)
O restante é igual no Unix e no Windows:
# first will link to libmylib.a (or libmylib.lib)
cc_binary(
name = "first",
srcs = ["first.cc"],
deps = [":mylib"],
linkstatic = True, # default value
)
# second will link to libmylib.so (or libmylib.lib)
cc_binary(
name = "second",
srcs = ["second.cc"],
deps = [":mylib"],
linkstatic = False,
)
O cc_import
oferece suporte a um atributo de inclusão. Exemplo:
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 |
Nome: obrigatório Um nome exclusivo para essa segmentação. |
deps
|
Lista de rótulos. O padrão é deps em Atributos típicos definidos pela maioria das regras de build.
|
hdrs
|
Lista de rótulos. O padrão é |
alwayslink
|
Booleano; o padrão é Se o alwayslink não funcionar com o VS 2017 no Windows, isso é devido a um problema conhecido. Faça upgrade do VS 2017 para a versão mais recente. |
includes
|
Lista de strings. O padrão é -isystem path_to_package/include_entry .
Isso só deve ser usado para bibliotecas de terceiros que
não estão em conformidade com o estilo do Google de escrever instruções #include.
Ao contrário do COPTS, essas flags são adicionadas a essa regra e a todas as regras que dependem dela. Observação: não as regras de que ele depende. Tome muito cuidado, porque isso pode ter efeitos abrangentes. Em caso de dúvida, adicione flags "-I" a COPTS.
O caminho |
interface_library
|
Rótulo; o padrão é Tipos de arquivos permitidos:
|
linkopts
|
Lista de strings. O padrão é LINKOPTS antes de vincular o destino binário.
Cada elemento dessa lista que não começa com |
objects
|
Lista de rótulos. O padrão é |
pic_objects
|
Lista de rótulos. O padrão é |
pic_static_library
|
Rótulo; o padrão é |
shared_library
|
Rótulo; o padrão é Tipos de arquivo permitidos:
|
static_library
|
Rótulo; o padrão é Tipos de arquivo permitidos:
|
strip_include_prefix
|
String; o padrão é Quando definido, os cabeçalhos no atributo Se for um caminho relativo, ele será considerado relativo ao pacote. Se for absoluto, ele será entendido como um caminho relativo ao repositório. O prefixo no atributo Esse atributo só é permitido em |
system_provided
|
Booleano; o padrão é interface_library precisa ser especificado e shared_library precisa estar vazio.
|
cc_library
Ver origem da regracc_library(name, deps, srcs, data, hdrs, additional_compiler_inputs, additional_linker_inputs, alwayslink, compatible_with, conlyopts, copts, cxxopts, defines, deprecation, exec_compatible_with, exec_group_compatible_with, exec_properties, features, hdrs_check, implementation_deps, include_prefix, includes, licenses, linkopts, linkstamp, linkstatic, local_defines, module_interfaces, package_metadata, restricted_to, strip_include_prefix, tags, target_compatible_with, testonly, textual_hdrs, toolchains, visibility, win_def_file)
Use cc_library()
para bibliotecas compiladas em C++.
O resultado é um .so
, .lo
ou .a
, dependendo do que for necessário.
Se você criar algo com vinculação estática que dependa de
um cc_library
, a saída de uma regra de biblioteca dependente
será o arquivo .a
. Se você especificar alwayslink=True
, vai receber o arquivo .lo
.
O nome real do arquivo de saída é libfoo.so
para
a biblioteca compartilhada, em que foo é o nome da regra. Os
outros tipos de bibliotecas terminam com .lo
e .a
,
respectivamente. Se você precisar de um nome de biblioteca compartilhada específico, por exemplo, para definir um módulo Python, use uma genrule para copiar a biblioteca com o nome desejado.
Verificação da inclusão de cabeçalho
Todos os arquivos de cabeçalho usados no build precisam ser declarados no hdrs
ou srcs
das regras cc_*
.
Isso é aplicado.
Para regras cc_library
, os cabeçalhos em hdrs
compreendem a interface pública da biblioteca e podem ser incluídos diretamente nos arquivos em hdrs
e srcs
da própria biblioteca, bem como nos arquivos em hdrs
e srcs
das regras cc_*
que listam a biblioteca no deps
.
Os cabeçalhos em srcs
só podem ser incluídos diretamente dos arquivos
em hdrs
e srcs
da própria biblioteca. Ao decidir se um cabeçalho vai para hdrs
ou srcs
, pergunte se você quer que os consumidores dessa biblioteca possam incluí-la diretamente. Essa é aproximadamente a mesma decisão que entre a visibilidade public
e private
em linguagens de programação.
As regras cc_binary
e cc_test
não têm uma interface exportada e, portanto, também não têm um atributo hdrs
. Todos os cabeçalhos que pertencem diretamente ao binário ou ao teste precisam ser listados no srcs
.
Para ilustrar essas regras, confira o exemplo a seguir.
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"],
)
As inclusões diretas permitidas neste exemplo estão listadas na tabela abaixo.
Por exemplo, foo.cc
pode incluir diretamente foo.h
e bar.h
, mas não baz.h
.
Incluindo arquivo | Inclusões permitidas |
---|---|
foo.h | bar.h |
foo.cc | foo.h bar.h |
bar.h | bar-impl.h baz.h |
bar-impl.h | bar.h baz.h |
bar.cc | bar.h bar-impl.h baz.h |
baz.h | baz-impl.h |
baz-impl.h | baz.h |
baz.cc | baz.h baz-impl.h |
As regras de verificação de inclusão só se aplicam a inclusões diretas. No exemplo acima, foo.cc
pode incluir bar.h
, que pode incluir baz.h
, que, por sua vez, pode incluir baz-impl.h
. Tecnicamente, a compilação de um arquivo .cc
pode incluir transitivamente qualquer arquivo de cabeçalho em hdrs
ou srcs
em qualquer cc_library
no fechamento transitivo de deps
. Nesse caso, o compilador pode ler baz.h
e baz-impl.h
ao compilar foo.cc
, mas foo.cc
não pode conter #include "baz.h"
. Para que isso seja
permitido, baz
precisa ser adicionado ao deps
de foo
.
O Bazel depende do suporte do conjunto de ferramentas para aplicar as regras de verificação de inclusão.
O recurso layering_check
precisa ser compatível com a cadeia de ferramentas
e solicitado explicitamente, por exemplo, usando a flag de linha de comando
--features=layering_check
ou o parâmetro
features
da função
package
. As toolchains
fornecidas pelo Bazel só oferecem suporte a esse recurso com clang no Unix e no macOS.
Exemplos
Usamos a flag alwayslink
para forçar o vinculador a vincular esse código, mesmo que o código binário principal não o referencie.
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 = True,
)
O exemplo a seguir vem de
third_party/python2_4_3/BUILD
.
Parte do código usa a biblioteca dl
(para carregar
outra biblioteca dinâmica), então essa
regra especifica a opção de vinculação -ldl
para vincular a
biblioteca dl
.
cc_library(
name = "python2_4_3",
linkopts = [
"-ldl",
"-lutil",
],
deps = ["//third_party/expat"],
)
O exemplo a seguir vem de third_party/kde/BUILD
.
Mantemos arquivos .so
pré-criados no depósito.
Os arquivos de cabeçalho ficam em um subdiretório chamado 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"],
)
O exemplo a seguir vem de third_party/gles/BUILD
.
O código de terceiros geralmente precisa de um pouco de defines
e
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 |
Nome: obrigatório Um nome exclusivo para essa segmentação. |
deps
|
Lista de rótulos. O padrão é Podem ser destinos Consulte comentários gerais sobre Eles precisam ser nomes de regras de biblioteca C++.
Ao criar um binário que vincula a biblioteca dessa regra,
você também vincula as bibliotecas em Apesar do nome "deps", nem todos os clientes dessa biblioteca
pertencem a este lugar. As dependências de dados de tempo de execução pertencem a Para vincular uma biblioteca de terceiros pré-compilada, adicione o nome dela ao
Para depender de algo sem vincular a esta biblioteca, adicione o nome ao |
srcs
|
Lista de rótulos. O padrão é Todos os arquivos Arquivos de assembler puro (.s, .asm) não são pré-processados e geralmente são criados usando o assembler. Os arquivos de assembly pré-processados (.S) são pré-processados e geralmente criados usando o compilador C/C++. Um arquivo Todos os arquivos Os arquivos Se o atributo
Tipos de arquivos
... e todas as regras que produzem esses arquivos (por exemplo, |
data
|
Lista de rótulos. O padrão é data em Atributos típicos definidos pela maioria das regras de build.
Se um Se um Seu código C++ pode acessar esses arquivos de dados da seguinte maneira:
|
hdrs
|
Lista de rótulos. O padrão é Esse é o local preferido para declarar arquivos de cabeçalho que
descrevem a interface da biblioteca. Esses cabeçalhos serão disponibilizados para inclusão por fontes nesta regra ou em regras dependentes.
Os cabeçalhos que não devem ser incluídos por um cliente dessa biblioteca precisam ser listados no atributo Tipos de arquivos |
additional_compiler_inputs
|
Lista de rótulos. O padrão é |
additional_linker_inputs
|
Lista de rótulos. O padrão é
Ao contrário de Por exemplo, arquivos .res do Windows compilados podem ser fornecidos aqui para serem incorporados ao destino binário. |
alwayslink
|
Booleano; o padrão é srcs , mesmo que alguns não contenham símbolos referenciados pelo binário.
Isso é útil se o código não for chamado explicitamente pelo código no
binário, por exemplo, se o código se registrar para receber algum callback
fornecido por algum serviço.
Se o alwayslink não funcionar com o VS 2017 no Windows, isso é devido a um problema conhecido. Faça upgrade do VS 2017 para a versão mais recente. |
conlyopts
|
Lista de strings. O padrão é |
copts
|
Lista de strings. O padrão é
Cada string nesse atributo é adicionada na ordem especificada a
Se o pacote declarar o recurso
|
cxxopts
|
Lista de strings. O padrão é |
defines
|
Lista de strings. O padrão é -D e adicionada à linha de comando de compilação para esse destino,
bem como a todas as regras que dependem dele. Tenha muito cuidado, porque isso pode ter efeitos de longo alcance. As definições são adicionadas a todos os destinos que dependem desse destino. Em caso de dúvida, adicione valores de definição a
local_defines .
|
hdrs_check
|
String; o padrão é |
implementation_deps
|
Lista de rótulos. O padrão é deps , os cabeçalhos e caminhos de inclusão dessas bibliotecas (e todas as dependências
transitivas delas) são usados apenas para a compilação dessa biblioteca, e não das bibliotecas que
dependem dela. As bibliotecas especificadas com implementation_deps ainda são vinculadas em
destinos binários que dependem dessa biblioteca.
|
include_prefix
|
String; o padrão é Quando definido, os cabeçalhos no atributo O prefixo no atributo Esse atributo só é permitido em |
includes
|
Lista de strings. O padrão é -isystem path_to_package/include_entry .
Isso só deve ser usado para bibliotecas de terceiros que
não estão em conformidade com o estilo do Google de escrever instruções #include.
Ao contrário do COPTS, essas flags são adicionadas a essa regra e a todas as regras que dependem dela. Observação: não as regras de que ele depende. Tome muito cuidado, porque isso pode ter efeitos abrangentes. Em caso de dúvida, adicione flags "-I" a COPTS.
Os caminhos |
linkopts
|
Lista de strings. O padrão é cc_binary.linkopts .
O atributo linkopts também é aplicado a qualquer destino que dependa, direta ou indiretamente, dessa biblioteca usando atributos deps ou outros atributos tratados de maneira semelhante: o atributo malloc de cc_binary . As opções de vinculação de dependência têm precedência sobre as opções de vinculação dependentes (ou seja, as opções de vinculação de dependência aparecem mais tarde na linha de comando). As linkopts especificadas em
--linkopt
têm precedência sobre as linkopts de regra.
O atributo Além disso, é importante observar que as opções "-Wl,-soname" ou "-Xlinker -soname" não são compatíveis e nunca devem ser especificadas nesse atributo. Os arquivos |
linkstamp
|
Rótulo; o padrão é base .
|
linkstatic
|
Booleano; o padrão é cc_binary e
cc_test : vincule o binário no modo
estático. Para cc_library.link_static : consulte abaixo.
Por padrão, essa opção fica ativada para
Se ativada e se for um binário ou teste, essa opção vai instruir a ferramenta de build a vincular
Há três maneiras diferentes de vincular um executável:
Se o atributo
O atributo
É preciso haver muito pouco código criado com |
local_defines
|
Lista de strings. O padrão é -D e adicionada à linha de comando de compilação para essa meta,
mas não para os dependentes dela. Ao contrário de defines , as definições só são adicionadas à
linha de comando de compilação para essa meta.
|
module_interfaces
|
Lista de rótulos. O padrão é O padrão C++ não tem restrição sobre a extensão do arquivo de interface do módulo.
O uso é protegido pela flag
|
strip_include_prefix
|
String; o padrão é Quando definido, os cabeçalhos no atributo Se for um caminho relativo, ele será considerado relativo ao pacote. Se for absoluto, ele será entendido como um caminho relativo ao repositório. O prefixo no atributo Esse atributo só é permitido em |
textual_hdrs
|
Lista de rótulos. O padrão é Esse é o local para declarar arquivos de cabeçalho que não podem ser compilados por conta própria. Ou seja, eles sempre precisam ser incluídos textualmente por outros arquivos de origem para criar um código válido. |
win_def_file
|
Rótulo; o padrão é Esse atributo só deve ser usado quando o Windows é a plataforma de destino. Ele pode ser usado para exportar símbolos durante a vinculação de uma biblioteca compartilhada. |
cc_shared_library
Ver origem da regracc_shared_library(name, deps, additional_linker_inputs, compatible_with, deprecation, dynamic_deps, exec_compatible_with, exec_group_compatible_with, exec_properties, exports_filter, features, package_metadata, restricted_to, roots, shared_lib_name, static_deps, tags, target_compatible_with, testonly, toolchains, user_link_flags, visibility, win_def_file)
Ela produz uma biblioteca compartilhada.
Exemplo
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"], )
No exemplo, foo_shared
vincula estaticamente foo
e baz
, sendo este último uma dependência transitiva. Ele não
vincula bar
porque já é fornecido dinamicamente pelo
dynamic_dep
bar_shared
.
O foo_shared
usa um arquivo de script do vinculador *.lds para controlar quais símbolos devem ser exportados. A lógica da regra cc_shared_library
não controla quais símbolos são exportados. Ela usa apenas o que se supõe ser exportado para gerar erros durante a fase de análise se duas bibliotecas compartilhadas exportarem os mesmos destinos.
Todas as dependências diretas de cc_shared_library
são consideradas
exportadas. Portanto, durante a análise, o Bazel pressupõe que foo
está sendo exportado por foo_shared
. Não se presume que baz
seja exportado por foo_shared
. Todos os destinos correspondentes ao exports_filter
também são considerados exportados.
Cada cc_library
no exemplo precisa aparecer no máximo em um
cc_shared_library
. Se quisermos vincular baz
também a
bar_shared
, precisaremos adicionar
tags = ["LINKABLE_MORE_THAN_ONCE"]
a baz
.
Devido ao atributo shared_lib_name
, o arquivo produzido por
bar_shared
terá o nome bar.so
em vez
do nome libbar.so
que teria por padrão no Linux.
Erros
Two shared libraries in dependencies export the same symbols.
Isso acontece sempre que você cria um destino com duas dependências cc_shared_library
diferentes que exportam o mesmo destino. Para corrigir isso, impeça que as bibliotecas sejam exportadas em uma das dependências do
cc_shared_library
.
Two shared libraries in dependencies link the same library statically
Isso vai acontecer sempre que você criar um novo cc_shared_library
com duas
dependências cc_shared_library
diferentes que vinculam o mesmo destino de forma estática.
Semelhante ao erro com exportações.
Uma maneira de corrigir isso é parar de vincular a biblioteca a uma das
dependências cc_shared_library
. Ao mesmo tempo, o que ainda o vincula
precisa exportar a biblioteca para que o que não o vincula mantenha a visibilidade dos
símbolos. Outra maneira é extrair uma terceira biblioteca que exporta o destino.
Uma terceira maneira é marcar o cc_library
culpado com LINKABLE_MORE_THAN_ONCE
, mas essa correção deve ser rara. Além disso, é preciso ter certeza de que o cc_library
é seguro para ser vinculado mais de uma vez.
'//foo:foo' is already linked statically in '//bar:bar' but not exported`
Isso significa que uma biblioteca no fechamento transitivo do seu deps
pode ser acessada
sem passar por uma das dependências cc_shared_library
, mas já está
vinculada a um cc_shared_library
diferente em dynamic_deps
e não é
exportada.
A solução é exportar da dependência cc_shared_library
ou extrair um terceiro cc_shared_library
que a exporte.
Do not place libraries which only contain a precompiled dynamic library in deps.
Se você tiver uma biblioteca dinâmica pré-compilada, ela não precisará e não poderá ser
vinculada estaticamente ao destino cc_shared_library
atual que você está
criando. Portanto, ele não pertence a deps
do
cc_shared_library
. Se essa biblioteca dinâmica pré-compilada for uma dependência de um dos seus cc_libraries
, o cc_library
precisará depender dela diretamente.
Trying to export a library already exported by a different shared library
Esse erro aparece se você estiver reivindicando exportar um destino que já está sendo exportado por uma das suas dependências dinâmicas na regra atual.
Para corrigir isso, remova o destino de deps
e confie apenas na dependência dinâmica ou verifique se o exports_filter
não captura esse destino.
Argumentos
Atributos | |
---|---|
name |
Nome: obrigatório Um nome exclusivo para essa segmentação. |
deps
|
Lista de rótulos. O padrão é
Qualquer dependência transitiva de biblioteca dessas dependências diretas será vinculada a essa biblioteca
compartilhada, desde que ainda não tenha sido vinculada por um
Durante a análise, a implementação da regra considera qualquer destino listado em
A implementação também vai gerar erros sempre que a mesma biblioteca for vinculada estaticamente
a mais de um |
additional_linker_inputs
|
Lista de rótulos. O padrão é user_link_flags .
|
dynamic_deps
|
Lista de rótulos. O padrão é cc_shared_library de que o destino atual depende.
A implementação |
exports_filter
|
Lista de strings. O padrão é
Qualquer destino
Observe que esse atributo não adiciona uma aresta de dependência a essas metas. Em vez disso, a aresta de dependência deve ser criada por A seguinte sintaxe é permitida:
|
roots
|
Lista de rótulos. O padrão é |
shared_lib_name
|
String; o padrão é |
static_deps
|
Lista de strings. O padrão é |
user_link_flags
|
Lista de strings. O padrão é
|
win_def_file
|
Rótulo; o padrão é Esse atributo só deve ser usado quando o Windows é a plataforma de destino. Ele pode ser usado para exportar símbolos durante a vinculação de uma biblioteca compartilhada. |
cc_static_library
Ver origem da regracc_static_library(name, deps, compatible_with, deprecation, exec_compatible_with, exec_group_compatible_with, exec_properties, features, package_metadata, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)
A biblioteca estática resultante contém os arquivos de objeto dos destinos listados em
deps
, bem como as dependências transitivas deles, com preferência dada a objetos
PIC
.
Grupos de saída
linkdeps
Um arquivo de texto que contém os rótulos das dependências transitivas dos destinos listados em
deps
que não contribuíram com arquivos de objeto para a biblioteca estática, mas
fornecem pelo menos uma biblioteca estática, dinâmica ou de interface. A biblioteca estática resultante
pode exigir que essas bibliotecas estejam disponíveis no momento da vinculação.
linkopts
Um arquivo de texto que contém o linkopts
fornecido pelo usuário de todas as dependências transitivas dos destinos listados em deps
.
Símbolos duplicados
Por padrão, a regra cc_static_library
verifica se a biblioteca estática resultante não contém símbolos duplicados. Se isso acontecer, o build vai falhar com uma mensagem de erro
que lista os símbolos duplicados e os arquivos de objeto que os contêm.
Essa verificação pode ser desativada por destino ou por pacote definindo
features = ["-symbol_check"]
ou globalmente via
--features=-symbol_check
.
Suporte a cadeia de ferramentas para symbol_check
As toolchains C++ autoconfiguradas enviadas com o Bazel são compatíveis com o recurso
symbol_check
em todas as plataformas. As toolchains personalizadas podem adicionar suporte para
isso de duas maneiras:
- Implementar a ação
ACTION_NAMES.validate_static_library
e ativá-la com o recursosymbol_check
. O conjunto de ferramentas na ação é invocado com dois argumentos: a biblioteca estática para verificar símbolos duplicados e o caminho de um arquivo que precisa ser criado se a verificação for aprovada. - O recurso
symbol_check
adiciona flags de arquivamento que fazem com que a ação de criação da biblioteca estática falhe em símbolos duplicados.
Argumentos
Atributos | |
---|---|
name |
Nome: obrigatório Um nome exclusivo para essa segmentação. |
deps
|
Lista de rótulos. O padrão é As dependências que não fornecem arquivos de objeto não são incluídas na biblioteca estática, mas os rótulos delas são coletados no arquivo fornecido pelo grupo de saída |
cc_test
Ver origem da regracc_test(name, deps, srcs, data, additional_linker_inputs, args, compatible_with, conlyopts, copts, cxxopts, defines, deprecation, dynamic_deps, env, env_inherit, exec_compatible_with, exec_group_compatible_with, exec_properties, features, flaky, hdrs_check, includes, licenses, link_extra_lib, linkopts, linkshared, linkstatic, local, local_defines, malloc, module_interfaces, nocopts, package_metadata, reexport_deps, restricted_to, shard_count, size, stamp, tags, target_compatible_with, testonly, timeout, toolchains, visibility, win_def_file)
Uma regra cc_test()
compila um teste. Aqui, um teste é um wrapper binário em torno de algum código de teste.
Por padrão, os testes em C++ são vinculados dinamicamente.
Para vincular estaticamente um teste de unidade, especifique
linkstatic=True
.
É recomendável comentar por que seu teste precisa de
linkstatic
, já que isso provavelmente não é óbvio.
Metas de saída implícitas
name.stripped
(criado somente se solicitado explicitamente): uma versão reduzida do binário. Ostrip -g
é executado no binário para remover símbolos de depuração. Outras opções de remoção podem ser fornecidas na linha de comando usando--stripopt=-foo
.name.dwp
(criado apenas se solicitado explicitamente): se o Fission estiver ativado, um arquivo de pacote de informações de depuração adequado para depurar binários implantados remotamente. Caso contrário, um arquivo vazio.
Consulte os argumentos cc_binary(), exceto que o argumento stamp
é definido como 0 por padrão para testes e que cc_test
tem
atributos extras comuns a todas as regras de teste (*_test).
Argumentos
Atributos | |
---|---|
name |
Nome: obrigatório Um nome exclusivo para essa segmentação. |
deps
|
Lista de rótulos. O padrão é Podem ser destinos linkopts ,
mas considere
additional_linker_inputs
para esse caso de uso.
|
srcs
|
Lista de rótulos. O padrão é Todos os arquivos Arquivos de assembler puro (.s, .asm) não são pré-processados e geralmente são criados usando o assembler. Os arquivos de assembly pré-processados (.S) são pré-processados e geralmente criados usando o compilador C/C++. Um arquivo Todos os arquivos Os arquivos Se o atributo
Tipos de arquivos
... e todas as regras que produzem esses arquivos (por exemplo, |
data
|
Lista de rótulos. O padrão é data em Atributos típicos definidos pela maioria das regras de build.
Se um Se um Seu código C++ pode acessar esses arquivos de dados da seguinte maneira:
|
additional_linker_inputs
|
Lista de rótulos. O padrão é
Ao contrário de Por exemplo, arquivos .res do Windows compilados podem ser fornecidos aqui para serem incorporados ao destino binário. |
conlyopts
|
Lista de strings. O padrão é |
copts
|
Lista de strings. O padrão é
Cada string nesse atributo é adicionada na ordem especificada a
Se o pacote declarar o recurso
|
cxxopts
|
Lista de strings. O padrão é |
defines
|
Lista de strings. O padrão é -D e adicionada à linha de comando de compilação para esse destino,
bem como a todas as regras que dependem dele. Tenha muito cuidado, porque isso pode ter efeitos de longo alcance. As definições são adicionadas a todos os destinos que dependem desse destino. Em caso de dúvida, adicione valores de definição a
local_defines .
|
dynamic_deps
|
Lista de rótulos. O padrão é cc_shared_library de que o destino atual depende.
A implementação |
hdrs_check
|
String; o padrão é |
includes
|
Lista de strings. O padrão é -isystem path_to_package/include_entry .
Isso só deve ser usado para bibliotecas de terceiros que
não estão em conformidade com o estilo do Google de escrever instruções #include.
Ao contrário do COPTS, essas flags são adicionadas a essa regra e a todas as regras que dependem dela. Observação: não as regras de que ele depende. Tome muito cuidado, porque isso pode ter efeitos abrangentes. Em caso de dúvida, adicione flags "-I" a COPTS.
Os caminhos |
link_extra_lib
|
Rótulo; o padrão é
Por padrão, os binários C++ são vinculados a |
linkopts
|
Lista de strings. O padrão é LINKOPTS antes de vincular o destino binário.
Cada elemento dessa lista que não começa com |
linkshared
|
Booleano; o padrão é linkshared=True na sua regra. Por padrão, essa opção fica desativada.
A presença dessa flag significa que a vinculação ocorre com a flag
Se você especificar |
linkstatic
|
Booleano; o padrão é cc_binary e
cc_test : vincule o binário no modo
estático. Para cc_library.link_static : consulte abaixo.
Por padrão, essa opção fica ativada para
Se ativada e se for um binário ou teste, essa opção vai instruir a ferramenta de build a vincular
Há três maneiras diferentes de vincular um executável:
Se o atributo
O atributo
É preciso haver muito pouco código criado com |
local_defines
|
Lista de strings. O padrão é -D e adicionada à linha de comando de compilação para essa meta,
mas não para os dependentes dela. Ao contrário de defines , as definições só são adicionadas à
linha de comando de compilação para essa meta.
|
malloc
|
Rótulo; o padrão é
Por padrão, os binários C++ são vinculados a |
module_interfaces
|
Lista de rótulos. O padrão é O padrão C++ não tem restrição sobre a extensão do arquivo de interface do módulo.
O uso é protegido pela flag
|
nocopts
|
String; o padrão é COPTS preexistente que corresponda a essa expressão regular (incluindo valores especificados explicitamente no atributo copts da regra) será removido de COPTS para fins de compilação dessa regra.
Esse atributo não deve ser necessário nem usado
fora de third_party . Os valores não são pré-processados de nenhuma outra forma além da substituição da variável "Make".
|
reexport_deps
|
Lista de rótulos. O padrão é |
stamp
|
Número inteiro. O padrão é
Os binários carimbados não são recriados, a menos que as dependências mudem. |
win_def_file
|
Rótulo; o padrão é Esse atributo só deve ser usado quando o Windows é a plataforma de destino. Ele pode ser usado para exportar símbolos durante a vinculação de uma biblioteca compartilhada. |
cc_toolchain
Ver origem da regracc_toolchain(name, all_files, ar_files, as_files, compatible_with, compiler_files, compiler_files_without_includes, coverage_files, deprecation, dwp_files, dynamic_runtime_lib, exec_compatible_with, exec_group_compatible_with, exec_properties, exec_transition_for_inputs, features, libc_top, licenses, linker_files, module_map, objcopy_files, output_licenses, package_metadata, 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 um conjunto de ferramentas C++.
Essa regra é responsável por:
-
Coletando todos os artefatos necessários para a execução de ações em C++. Isso é feito por
atributos como
all_files
,compiler_files
,linker_files
ou outros atributos que terminam com_files
. Geralmente, esses são filegroups que agrupam todos os arquivos necessários. -
Gerar linhas de comando corretas para ações em C++. Isso é feito usando o provedor
CcToolchainConfigInfo
(detalhes abaixo).
Use o atributo toolchain_config
para configurar a cadeia de ferramentas do C++.
Consulte também esta
página
para ver a documentação detalhada sobre configuração e seleção do conjunto de ferramentas C++.
Use tags = ["manual"]
para evitar que as toolchains sejam criadas e configuradas
sem necessidade ao invocar bazel build //...
.
Argumentos
Atributos | |
---|---|
name |
Nome: obrigatório Um nome exclusivo para essa segmentação. |
all_files
|
Rótulo; obrigatório Coleção de todos os artefatos cc_toolchain. Esses artefatos serão adicionados como entradas a todas as ações relacionadas a rules_cc, exceto as que usam conjuntos mais precisos de artefatos dos atributos abaixo. O Bazel pressupõe queall_files é um superconjunto de todos os outros atributos que fornecem artefatos. Por exemplo, a compilação de linkstamp precisa de arquivos de compilação e de link, então usa all_files .
É isso que |
ar_files
|
Rótulo; o padrão é |
as_files
|
Rótulo; o padrão é |
compiler_files
|
Rótulo; obrigatório Coleção de todos os artefatos cc_toolchain necessários para ações de compilação. |
compiler_files_without_includes
|
Rótulo; o padrão é |
coverage_files
|
Rótulo; o padrão é |
dwp_files
|
Rótulo; obrigatório Coleção de todos os artefatos cc_toolchain necessários para ações de dwp. |
dynamic_runtime_lib
|
Rótulo; o padrão é Isso será usado quando o recurso "static_link_cpp_runtimes" estiver ativado e estivermos vinculando dependências dinamicamente. |
exec_transition_for_inputs
|
Booleano; o padrão é |
libc_top
|
Rótulo; o padrão é |
linker_files
|
Rótulo; obrigatório Coleção de todos os artefatos cc_toolchain necessários para ações de vinculação. |
module_map
|
Rótulo; o padrão é |
objcopy_files
|
Rótulo; obrigatório Coleção de todos os artefatos cc_toolchain necessários para ações objcopy. |
output_licenses
|
Lista de strings. O padrão é |
static_runtime_lib
|
Rótulo; o padrão é Isso será usado quando o recurso "static_link_cpp_runtimes" estiver ativado e estivermos vinculando dependências de forma estática. |
strip_files
|
Rótulo; obrigatório Coleção de todos os artefatos cc_toolchain necessários para ações de remoção. |
supports_header_parsing
|
Booleano; o padrão é |
supports_param_files
|
Booleano; o padrão é |
toolchain_config
|
Rótulo; obrigatório O rótulo da regra que fornececc_toolchain_config_info .
|
toolchain_identifier
|
String; o padrão é
Até que o problema #5380 seja corrigido,
esta é a maneira recomendada de associar |
cc_toolchain_suite
Ver origem da regracc_toolchain_suite(name, compatible_with, deprecation, features, licenses, package_metadata, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)
Descontinuada: a regra é uma operação nula e será removida.
Argumentos
Atributos | |
---|---|
name |
Nome: obrigatório Um nome exclusivo para essa segmentação. |
fdo_prefetch_hints
Ver origem da regrafdo_prefetch_hints(name, compatible_with, deprecation, exec_compatible_with, exec_group_compatible_with, exec_properties, features, package_metadata, profile, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)
Representa um perfil de dicas de pré-busca do FDO que está no espaço de trabalho. Exemplos:
fdo_prefetch_hints(
name = "hints",
profile = "//path/to/hints:profile.afdo",
)
Argumentos
Atributos | |
---|---|
name |
Nome: obrigatório Um nome exclusivo para essa segmentação. |
profile
|
Rótulo; obrigatório Rótulo do perfil de dicas. O arquivo de dicas tem a extensão .afdo. O rótulo também pode apontar para uma regra fdo_absolute_path_profile. |
fdo_profile
Ver origem da regrafdo_profile(name, compatible_with, deprecation, exec_compatible_with, exec_group_compatible_with, exec_properties, features, memprof_profile, package_metadata, profile, proto_profile, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)
Representa um perfil do FDO que está no espaço de trabalho. Exemplo:
fdo_profile(
name = "fdo",
profile = "//path/to/fdo:profile.zip",
)
Argumentos
Atributos | |
---|---|
name |
Nome: obrigatório Um nome exclusivo para essa segmentação. |
memprof_profile
|
Rótulo; o padrão é |
profile
|
Rótulo; obrigatório Rótulo do perfil de FDO ou uma regra que o gera. O arquivo FDO pode ter uma das seguintes extensões: .profraw para perfil LLVM não indexado, .profdata para perfil LLVM indexado, .zip que contém um perfil LLVM profraw, .afdo para perfil AutoFDO, .xfdo para perfil XBinary. O rótulo também pode apontar para uma regra fdo_absolute_path_profile. |
proto_profile
|
Rótulo; o padrão é |
memprof_profile
Ver origem da regramemprof_profile(name, compatible_with, deprecation, exec_compatible_with, exec_group_compatible_with, exec_properties, features, package_metadata, profile, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)
Representa um perfil MEMPROF no espaço de trabalho. Exemplo:
memprof_profile(
name = "memprof",
profile = "//path/to/memprof:profile.afdo",
)
Argumentos
Atributos | |
---|---|
name |
Nome: obrigatório Um nome exclusivo para essa segmentação. |
profile
|
Rótulo; obrigatório Rótulo do perfil MEMPROF. O perfil precisa ter uma extensão .profdata (para um perfil memprof indexado/simbolizado) ou .zip (para um arquivo zip que contém um arquivo memprof.profdata). O rótulo também pode apontar para uma regra fdo_absolute_path_profile. |
propeller_optimize
Ver origem da regrapropeller_optimize(name, cc_profile, compatible_with, deprecation, exec_compatible_with, exec_group_compatible_with, exec_properties, features, ld_profile, package_metadata, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)
Representa um perfil de otimização do Propeller no espaço de trabalho. Exemplo:
propeller_optimize(
name = "layout",
cc_profile = "//path:cc_profile.txt",
ld_profile = "//path:ld_profile.txt"
)
Argumentos
Atributos | |
---|---|
name |
Nome: obrigatório Um nome exclusivo para essa segmentação. |
cc_profile
|
Rótulo; obrigatório Rótulo do perfil transmitido para as várias ações de compilação. Esse arquivo tem a extensão .txt. |
ld_profile
|
Rótulo; obrigatório Rótulo do perfil transmitido para a ação de link. Esse arquivo tem a extensão .txt. |