Regras
- cc_binary
- cc_import
- cc_library
- cc_proto_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
Conferir origem da regracc_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)
Ela produz um binário executável.
O
name
do destino precisa ser igual ao nome do
arquivo de origem que é o ponto de entrada principal do aplicativo (menos a extensão).
Por exemplo, se o ponto de entrada estiver em main.cc
, seu nome deverá
ser main
.
Destinos de saída implícitos
name.stripped
(criado apenas se solicitado explicitamente): uma versão removida. versão do binário.strip -g
é executado no binário para remover a depuração. símbolos. Outras opções de remoção podem ser fornecidas na linha de comando usando--stripopt=-foo
:name.dwp
(criado apenas se solicitado explicitamente): se A fissão está ativada: uma depuração. arquivo de pacote de informações adequado para depurar binários implantados remotamente. Caso contrário: um arquivo vazio.
Argumentos
Atributos | |
---|---|
name |
Nome; obrigatório Um nome exclusivo para o destino. |
deps
|
Lista de rótulos o padrão é Eles podem ser |
srcs
|
Lista de rótulos o padrão é Todos os arquivos Os arquivos assembler puro (.s, .asm) não são pré-processados e normalmente são criados usando o assembler. Arquivos assembly pré-processados (.S) são pré-processados e normalmente criados usando o compilador C/C++. Um arquivo Todos os arquivos Os arquivos Se o atributo
Tipos de arquivo
... e todas as regras que produzem esses arquivos (por exemplo, |
data
|
Lista de rótulos o padrão é data
em Atributos típicos definidos pelo
a maioria das regras de build.
Se Se um Seu código C++ pode acessar esses arquivos de dados da seguinte forma:
|
additional_linker_inputs
|
Lista de rótulos o padrão é Por exemplo, arquivos .res compilados do Windows podem ser fornecidos aqui para serem incorporados em o destino binário. |
copts
|
Lista de strings o padrão é
Cada string nesse atributo é adicionada a
Se o pacote declarar o objeto feature
|
defines
|
Lista de strings o padrão é -D como prefixo e foi adicionado à linha de comando de compilação desse destino.
e todas as regras que dependem dele. Tenha muito cuidado, pois isso pode ter
efeitos mais amplos. Em caso de dúvida, adicione valores definidos ao
local_defines .
|
dynamic_deps
|
Lista de rótulos o padrão é cc_shared_library de que o destino atual depende.
A implementação de |
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 de escrita do Google para instruções #include.
Ao contrário de COPTS, essas sinalizações são adicionadas para esta regra
e todas as regras que dependem dele. Observação: não são as regras das quais ele depende. Tenha
tenha muito cuidado, já que isso pode ter efeitos mais amplos. Em caso de dúvida, adicione
"-Eu" para 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
ao 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 está 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 : vincular o binário na estática
modo Para cc_library.link_static : confira abaixo.
Por padrão, essa opção fica ativada para
Se ativada e for um binário ou teste, essa opção manda a ferramenta de build vincular
Sempre que possível, Existem três maneiras diferentes de vincular um executável:
Se o atributo
O atributo
O código criado com |
local_defines
|
Lista de strings o padrão é -D como prefixo e foi adicionado à linha de comando de compilação desse destino.
mas não aos dependentes.
|
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 C++ Standard não tem restrições sobre a extensão do arquivo de interface do módulo
O uso é protegido pela bandeira
|
nocopts
|
String; o padrão é COPTS preexistente que corresponda a essa expressão regular
(incluindo valores explicitamente especificados no atributo copts da regra)
será removido de COPTS para fins de compilação desta regra.
Esse atributo não pode ser necessário nem usado
fora de third_party . Os valores não são pré-processados
de forma diferente da "Marca" substituição de variáveis.
|
reexport_deps
|
Lista de rótulos o padrão é |
stamp
|
Número inteiro o padrão é
Os binários carimbos não são recriados, a menos que as dependências deles mudem. |
win_def_file
|
Rótulo o padrão é Esse atributo só deve ser usado quando o Windows for a plataforma de destino. Ele pode ser usado para exportar símbolos durante a vinculação de uma biblioteca compartilhada. |
cc_import
Conferir origem da regracc_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)
As regras cc_import
permitem que os usuários importem bibliotecas C/C++ pré-compiladas.
Confira a seguir os casos de uso mais comuns:
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 = 1,
)
2: Como vincular uma biblioteca compartilhada (Unix)
cc_import(
name = "mylib",
hdrs = ["mylib.h"],
shared_library = "libmylib.so",
)
3: Vincular uma biblioteca compartilhada à biblioteca de interface
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",
)
4) Vincular uma biblioteca compartilhada a 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 = 1,
)
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 = 1,
)
5) Vincular a uma biblioteca estática ou compartilhada
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 é o mesmo em Unix e 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
oferece suporte a um atributo "include". Por 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 o destino. |
deps
|
Lista de rótulos o padrão é deps
em Atributos típicos definidos pelo
a 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, é devido a problema conhecido, faça upgrade do seu 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 de escrita do Google para instruções #include.
Ao contrário de COPTS, essas sinalizações são adicionadas para esta regra
e todas as regras que dependem dele. Observação: não são as regras das quais ele depende. Tenha
tenha muito cuidado, já que isso pode ter efeitos mais amplos. Em caso de dúvida, adicione
"-Eu" para COPTS.
O caminho |
interface_library
|
Rótulo o padrão é Tipos de arquivos permitidos:
|
linkopts
|
Lista de strings o padrão é LINKOPTS antes
ao 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 arquivos permitidos:
|
static_library
|
Rótulo o padrão é Tipos de arquivos permitidos:
|
system_provided
|
Booleano; o padrão é interface_library deve ser especificado
shared_library deve estar vazio.
|
cc_library
Conferir origem da regracc_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)
Use cc_library()
para bibliotecas compiladas em C++.
O resultado é .so
, .lo
ou .a
, dependendo do que for necessário.
Se você criar algo com vinculação estática que dependa
um cc_library
, a saída de uma regra de biblioteca dependente
é o arquivo .a
. Se você especificar
alwayslink=True
, você recebe o arquivo .lo
.
O nome real do arquivo de saída é libfoo.so
para
a biblioteca compartilhada, em que foo é o nome da regra. O
outros tipos de biblioteca 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
para o nome desejado.
Verificação da inclusão de cabeçalho
Todos os arquivos de cabeçalho usados no build devem ser declarados em
a hdrs
ou srcs
de regras cc_*
.
Isso é obrigatório.
Para as regras cc_library
, os cabeçalhos em hdrs
compreendem
interface pública da biblioteca e podem ser incluídos diretamente
dos arquivos em hdrs
e srcs
da biblioteca
e dos 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. Quando
decidir se coloca um cabeçalho em hdrs
ou srcs
,
você deve perguntar se quer que os consumidores dessa biblioteca possam
incluí-lo diretamente. Essa é aproximadamente a mesma decisão que
entre a visibilidade public
e private
nas linguagens de programação.
As regras cc_binary
e cc_test
não têm um
para que elas também não tenham um atributo hdrs
. Todos os cabeçalhos
que pertencem diretamente ao binário ou ao teste devem ser listados
o srcs
.
Para ilustrar essas regras, veja 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, o foo.cc
tem permissão para
incluem 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 |
barra-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 eventos diretos
inclusões. No exemplo acima, foo.cc
pode
incluem bar.h
, que pode incluir baz.h
, que em
sua vez pode incluir baz-impl.h
. Tecnicamente, os
a compilação de um arquivo .cc
pode incluir transitivamente qualquer cabeçalho
no arquivo hdrs
ou srcs
na
qualquer cc_library
na interdição transitiva de deps
. Em
Nesse caso, o compilador pode ler baz.h
e baz-impl.h
.
ao compilar foo.cc
, mas foo.cc
não pode
contêm #include "baz.h"
. Para que isso seja
permitido, adicione baz
a deps
de foo
.
O Bazel depende do suporte ao conjunto de ferramentas para aplicar as regras de verificação de inclusão.
O recurso layering_check
precisa ser compatível com o conjunto de ferramentas.
e solicitado explicitamente, por exemplo, por meio do
a sinalização de linha de comando --features=layering_check
parâmetro features
do
package
. Os conjuntos de ferramentas
fornecidos pelo Bazel só são compatíveis com esse recurso com Clang no Unix e no macOS.
Exemplos
Usamos a sinalização alwayslink
para forçar o vinculador a vincular
esse código, embora 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 = 1,
)
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).
especifica a opção de vinculação -ldl
para vincular a
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 os arquivos .so
pré-criados no depósito.
Os arquivos principais 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
.
Códigos de terceiros geralmente precisam 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 o destino. |
deps
|
Lista de rótulos o padrão é Podem ser Leia os comentários gerais sobre Esses são os nomes das regras da biblioteca C++.
Ao criar um binário que vincule a biblioteca dessa regra,
você também vai vincular as bibliotecas em Apesar das "dependências" , nem todos os clientes da biblioteca
pertence aqui. As dependências de dados do ambiente de execução pertencem a Para vincular uma biblioteca de terceiros pré-compilada, adicione o nome dela a
o Para depender de algo sem vinculá-lo a esta biblioteca, adicione seu
nome ao |
srcs
|
Lista de rótulos o padrão é Todos os arquivos Os arquivos assembler puro (.s, .asm) não são pré-processados e normalmente são criados usando o assembler. Arquivos assembly pré-processados (.S) são pré-processados e normalmente criados usando o compilador C/C++. Um arquivo Todos os arquivos Os arquivos Se o atributo
Tipos de arquivo
... e todas as regras que produzem esses arquivos (por exemplo, |
data
|
Lista de rótulos o padrão é data
em Atributos típicos definidos pelo
a maioria das regras de build.
Se Se um Seu código C++ pode acessar esses arquivos de dados da seguinte forma:
|
hdrs
|
Lista de rótulos o padrão é Esse é o local mais recomendado para declarar arquivos de cabeçalho que
e descrever a interface da biblioteca. Esses cabeçalhos serão feitos
disponíveis para inclusão pelas origens nesta regra ou em regras dependentes.
Os cabeçalhos que não devem ser incluídos por um cliente desta biblioteca devem ser
no atributo Tipos de arquivo |
additional_compiler_inputs
|
Lista de rótulos o padrão é |
additional_linker_inputs
|
Lista de rótulos o padrão é Por exemplo, arquivos .res compilados do Windows podem ser fornecidos aqui para serem incorporados em o 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 por código em
o binário, por exemplo, caso seu código seja registrado para receber algum callback
por algum serviço.
Se o Alwayslink não funcionar com o VS 2017 no Windows, é devido a problema conhecido, faça upgrade do seu VS 2017 para a versão mais recente. |
copts
|
Lista de strings o padrão é
Cada string nesse atributo é adicionada a
Se o pacote declarar o objeto feature
|
defines
|
Lista de strings o padrão é -D como prefixo e foi adicionado à linha de comando de compilação desse destino.
e todas as regras que dependem dele. Tenha muito cuidado, pois isso pode ter
efeitos mais amplos. Em caso de dúvida, adicione valores definidos ao
local_defines .
|
hdrs_check
|
String; o padrão é |
implementation_deps
|
Lista de rótulos o padrão é deps , os cabeçalhos e os caminhos de inclusão dessas bibliotecas (e de todas
transitives) são usadas apenas para compilação dessa biblioteca, e não para bibliotecas que
dependerem disso. As bibliotecas especificadas com implementation_deps ainda estão vinculadas na
binários que dependem dessa biblioteca.
Por enquanto, o uso é limitado a cc_libraries e protegido pela sinalização.
|
include_prefix
|
String; o padrão é Quando definido, os cabeçalhos no atributo O prefixo no atributo Esse atributo só é legal de acordo com |
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 de escrita do Google para instruções #include.
Ao contrário de COPTS, essas sinalizações são adicionadas para esta regra
e todas as regras que dependem dele. Observação: não são as regras das quais ele depende. Tenha
tenha muito cuidado, já que isso pode ter efeitos mais amplos. Em caso de dúvida, adicione
"-Eu" para COPTS.
Os caminhos |
linkopts
|
Lista de strings o padrão é cc_binary.linkopts .
O atributo linkopts também é aplicado a qualquer destino que
depende, direta ou indiretamente, dessa biblioteca usando deps .
(ou por meio de outros atributos que são tratados de forma semelhante:
malloc
atributo de cc_binary ). Dependência
linkopts têm precedência sobre linkopts dependentes (por exemplo, linkopts de dependência
aparecem mais tarde na linha de comando). Linkopts especificados em
--linkopt
têm precedência sobre os linksopts de regra.
O atributo Além disso, é importante observar que "-Wl,-soname" ou "-Xlinker -sonome" não são suportadas 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 : vincular o binário na estática
modo Para cc_library.link_static : confira abaixo.
Por padrão, essa opção fica ativada para
Se ativada e for um binário ou teste, essa opção manda a ferramenta de build vincular
Sempre que possível, Existem três maneiras diferentes de vincular um executável:
Se o atributo
O atributo
O código criado com |
local_defines
|
Lista de strings o padrão é -D como prefixo e foi adicionado à linha de comando de compilação desse destino.
mas não aos dependentes.
|
module_interfaces
|
Lista de rótulos o padrão é O C++ Standard não tem restrições sobre a extensão do arquivo de interface do módulo
O uso é protegido pela bandeira
|
strip_include_prefix
|
String; o padrão é Quando definido, os cabeçalhos no atributo Se for um caminho relativo, ele será considerado como relativo ao pacote. Se for absoluta, ela é entendida como um caminho relativo ao repositório. O prefixo no atributo Esse atributo só é legal de acordo com |
textual_hdrs
|
Lista de rótulos o padrão é Esse é o local para declarar os arquivos de cabeçalho que não podem ser compilados sozinhos. ou seja, eles sempre precisam ser incluídos textualmente por outros arquivos-fonte para criar versões válidas o código-fonte. |
win_def_file
|
Rótulo o padrão é Esse atributo só deve ser usado quando o Windows for a plataforma de destino. Ele pode ser usado para exportar símbolos durante a vinculação de uma biblioteca compartilhada. |
cc_proto_library
Conferir origem da regracc_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
gera código C++ de arquivos .proto
.
deps
precisa apontar para regras proto_library
.
Exemplo:
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 |
Nome; obrigatório Um nome exclusivo para o destino. |
deps
|
Lista de rótulos o padrão é proto_library
para gerar código C++.
|
cc_shared_library
Conferir origem da regracc_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)
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
, esta última sendo uma dependência transitiva. Ela não
vincular bar
porque ele já é fornecido dinamicamente pelo
dynamic_dep
: bar_shared
.
O foo_shared
usa um arquivo script de vinculador *.lds para controlar quais
símbolos deve ser exportado. A lógica de regra cc_shared_library
não controla quais símbolos são exportados, ele usa apenas o que é considerado
exportados para apresentar erros durante a fase de análise se duas bibliotecas compartilhadas exportarem o
as mesmas metas.
Toda dependência direta de cc_shared_library
é considerada como
exportados. Portanto, o Bazel presume, durante a análise, que foo
está sendo
exportado por foo_shared
. Não é esperado que o baz
seja exportado
por foo_shared
. Todos os destinos correspondentes a exports_filter
também será considerado exportado.
Cada cc_library
no exemplo precisa aparecer no máximo em uma
cc_shared_library
. Se quiséssemos vincular baz
também a
bar_shared
, precisaríamos adicionar
tags = ["LINKABLE_MORE_THAN_ONCE"]
para baz
.
Devido ao atributo shared_lib_name
, o arquivo produzido pelo
bar_shared
terá o nome bar.so
em vez
ao nome libbar.so
que ele teria por padrão no Linux.
Erros
Two shared libraries in dependencies export the same symbols.
Isso acontecerá sempre que você criar um destino com duas métricas diferentes
cc_shared_library
dependências que exportam o mesmo destino. Para corrigir isso
será necessário interromper a exportação das bibliotecas em um dos
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 dois
dependências cc_shared_library
diferentes que vinculam o mesmo destino estaticamente.
Semelhante ao erro das exportações.
Uma forma de corrigir isso é parar de vincular a biblioteca a um dos
cc_shared_library
. Ao mesmo tempo, aquela que ainda o vincula
precisa exportar a biblioteca para que aquela que não está vinculada mantenha a visibilidade
os símbolos. Outra maneira é extrair uma terceira biblioteca que exporte o destino.
Uma terceira maneira é marcar o culpado cc_library
com LINKABLE_MORE_THAN_ONCE
.
mas essa correção deve ser rara, e você deve se certificar de que os
É realmente seguro vincular cc_library
mais de uma vez.
'//foo:foo' is already linked statically in '//bar:bar' but not exported`
Isso significa que uma biblioteca no fechamento transitivo da deps
está acessível
sem passar por uma das dependências cc_shared_library
, mas já está
vinculado a outro cc_shared_library
no dynamic_deps
e não
exportados.
A solução é exportá-lo da dependência cc_shared_library
ou extraí-lo
um terceiro cc_shared_library
que o exporta.
Do not place libraries which only contain a precompiled dynamic library in deps.
Se você tiver uma biblioteca dinâmica pré-compilada, isso não é necessário e não pode ser
vinculado estaticamente ao destino cc_shared_library
atual que você está
sendo criados no momento. Portanto, ele não pertence a deps
do
cc_shared_library
. Se essa biblioteca dinâmica pré-compilada for uma dependência de um
do seu cc_libraries
, o cc_library
precisa depender dele;
diretamente.
Trying to export a library already exported by a different shared library
Você verá esse erro se, na regra atual, você estiver alegando exportar um que já esteja sendo exportado por uma das suas dependências dinâmicas.
Para corrigir isso, remova o destino de deps
e dependa dele para o fluxo dinâmico.
ou garantir que o exports_filter
não capture esse destino.
Argumentos
Atributos | |
---|---|
name |
Nome; obrigatório Um nome exclusivo para o destino. |
deps
|
Lista de rótulos o padrão é
As dependências de biblioteca transitiva dessas dependências diretas serão vinculadas a esse arquivo
biblioteca, desde que não tenham sido vinculadas por um
Durante a análise, a implementação da regra vai considerar qualquer destino listado em
A implementação também vai acionar erros sempre que a mesma biblioteca for vinculada estaticamente.
em 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 de |
experimental_disable_topo_sort_do_not_use_remove_before_7_0
|
Booleano; o padrão é |
exports_filter
|
Lista de strings o padrão é
Qualquer destino
Observe que esse atributo não está realmente adicionando uma borda de dependência a esses destinos, o
borda 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 for a plataforma de destino. Ele pode ser usado para exportar símbolos durante a vinculação de uma biblioteca compartilhada. |
cc_static_library
Conferir origem da regracc_static_library(name, deps, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)Produz uma biblioteca estática a partir de uma lista de destinos e das respectivas dependências transitivas.
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 para
objetos PIC
.
Grupos de saída
linkdeps
Um arquivo de texto contendo os rótulos dessas dependências transitivas dos destinos listados em
deps
que não contribuíram com arquivos de objeto para a biblioteca estática, mas
forneça 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 contendo o linkopts
fornecido pelo usuário de todos os valores
dependências dos destinos listados em deps
.
Símbolos duplicados
Por padrão, a regra cc_static_library
verifica se o resultado estático
a biblioteca não contém símbolos duplicados. Se isso acontecer, o build falhará com um 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 pacote ao
features = ["-symbol_check"]
ou globalmente via
--features=-symbol_check
.
Suporte a conjuntos de ferramentas para symbol_check
Os conjuntos de ferramentas em C++ configurados automaticamente e enviados com o Bazel são compatíveis com o
symbol_check
em todas as plataformas. Os conjuntos de ferramentas personalizados podem adicionar suporte
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 a existência de símbolos duplicados e o caminho de um arquivo que precisa ser criado se a verificação for aprovada. - Usar o recurso
symbol_check
para adicionar sinalizações do arquivador que fazem com que o criar a biblioteca estática para falhar em símbolos duplicados.
Argumentos
Atributos | |
---|---|
name |
Nome; obrigatório Um nome exclusivo para o destino. |
deps
|
Lista de rótulos o padrão é As dependências que não fornecem nenhum arquivo de objeto não são incluídas no arquivo
mas seus rótulos são reunidos no arquivo fornecido pela
Grupo de saída |
cc_test
Conferir origem da regracc_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)
Uma regra cc_test()
compila um teste. Aqui, um teste
é um wrapper binário em torno de um 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
.
Seria bom comentar por que seu teste precisa
linkstatic
isso provavelmente não é óbvio.
Destinos de saída implícitos
name.stripped
(criado apenas se solicitado explicitamente): uma versão removida. versão do binário.strip -g
é executado no binário para remover a depuração. símbolos. Outras opções de remoção podem ser fornecidas na linha de comando usando--stripopt=-foo
:name.dwp
(criado apenas se solicitado explicitamente): se A fissão está ativada: uma depuração. arquivo de pacote de informações 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 extras
atributos comuns a todas as regras de teste (*_test).
Argumentos
Atributos | |
---|---|
name |
Nome; obrigatório Um nome exclusivo para o destino. |
deps
|
Lista de rótulos o padrão é Eles podem ser |
srcs
|
Lista de rótulos o padrão é Todos os arquivos Os arquivos assembler puro (.s, .asm) não são pré-processados e normalmente são criados usando o assembler. Arquivos assembly pré-processados (.S) são pré-processados e normalmente criados usando o compilador C/C++. Um arquivo Todos os arquivos Os arquivos Se o atributo
Tipos de arquivo
... e todas as regras que produzem esses arquivos (por exemplo, |
data
|
Lista de rótulos o padrão é data
em Atributos típicos definidos pelo
a maioria das regras de build.
Se Se um Seu código C++ pode acessar esses arquivos de dados da seguinte forma:
|
additional_linker_inputs
|
Lista de rótulos o padrão é Por exemplo, arquivos .res compilados do Windows podem ser fornecidos aqui para serem incorporados em o destino binário. |
copts
|
Lista de strings o padrão é
Cada string nesse atributo é adicionada a
Se o pacote declarar o objeto feature
|
defines
|
Lista de strings o padrão é -D como prefixo e foi adicionado à linha de comando de compilação desse destino.
e todas as regras que dependem dele. Tenha muito cuidado, pois isso pode ter
efeitos mais amplos. Em caso de dúvida, adicione valores definidos ao
local_defines .
|
dynamic_deps
|
Lista de rótulos o padrão é cc_shared_library de que o destino atual depende.
A implementação de |
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 de escrita do Google para instruções #include.
Ao contrário de COPTS, essas sinalizações são adicionadas para esta regra
e todas as regras que dependem dele. Observação: não são as regras das quais ele depende. Tenha
tenha muito cuidado, já que isso pode ter efeitos mais amplos. Em caso de dúvida, adicione
"-Eu" para 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
ao 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 está 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 : vincular o binário na estática
modo Para cc_library.link_static : confira abaixo.
Por padrão, essa opção fica ativada para
Se ativada e for um binário ou teste, essa opção manda a ferramenta de build vincular
Sempre que possível, Existem três maneiras diferentes de vincular um executável:
Se o atributo
O atributo
O código criado com |
local_defines
|
Lista de strings o padrão é -D como prefixo e foi adicionado à linha de comando de compilação desse destino.
mas não aos dependentes.
|
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 C++ Standard não tem restrições sobre a extensão do arquivo de interface do módulo
O uso é protegido pela bandeira
|
nocopts
|
String; o padrão é COPTS preexistente que corresponda a essa expressão regular
(incluindo valores explicitamente especificados no atributo copts da regra)
será removido de COPTS para fins de compilação desta regra.
Esse atributo não pode ser necessário nem usado
fora de third_party . Os valores não são pré-processados
de forma diferente da "Marca" substituição de variáveis.
|
reexport_deps
|
Lista de rótulos o padrão é |
stamp
|
Número inteiro o padrão é
Os binários carimbos não são recriados, a menos que as dependências deles mudem. |
win_def_file
|
Rótulo o padrão é Esse atributo só deve ser usado quando o Windows for a plataforma de destino. Ele pode ser usado para exportar símbolos durante a vinculação de uma biblioteca compartilhada. |
cc_toolchain
Conferir origem da regracc_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 um conjunto de ferramentas C++.
Essa regra é responsável por:
-
Coletar todos os artefatos necessários para que as ações C++ sejam executadas. Isso é feito pela
atributos como
all_files
,compiler_files
,linker_files
ou outros atributos terminados em_files
). São geralmente são grupos de arquivos que contêm todos os arquivos necessários. -
Geração de linhas de comando corretas para ações C++. Para isso, usamos
CcToolchainConfigInfo
provedor (detalhes abaixo).
Use o atributo toolchain_config
para configurar o conjunto de ferramentas do C++.
Consulte também este
página
para ver a documentação elaborada sobre a configuração do conjunto de ferramentas C++ e a seleção do conjunto de ferramentas.
Usar tags = ["manual"]
para impedir que os conjuntos de ferramentas sejam criados e configurados
desnecessariamente ao invocar bazel build //...
Argumentos
Atributos | |
---|---|
name |
Nome; obrigatório Um nome exclusivo para o destino. |
all_files
|
Rótulo obrigatório Coleção de todos os artefatos cc_Dataset. Esses artefatos serão adicionados como entradas regras_cc (exceto as ações que usam conjuntos mais precisos de artefatos dos atributos abaixo). Bazel supõe queall_files é um superconjunto
de todos os outros atributos que fornecem artefatos (por exemplo, a compilação do linktamp precisa ser compilada
e arquivos de link, o que leva all_files ).
Isso é o 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_Dataset 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_dataset necessários para ações dwp. |
dynamic_runtime_lib
|
Rótulo o padrão é Vai ser usado quando "static_link_cpp_runtimes" está ativado e estamos vinculando dependências de maneira dinâmica. |
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_Dataset 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_Dataset necessários para ações objcopy. |
output_licenses
|
Lista de strings o padrão é |
static_runtime_lib
|
Rótulo o padrão é Vai ser usado quando "static_link_cpp_runtimes" está ativado e estamos vinculando dependências estaticamente. |
strip_files
|
Rótulo obrigatório Coleção de todos os artefatos cc_Dataset 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 A etiqueta da regra que fornececc_toolchain_config_info .
|
toolchain_identifier
|
String; o padrão é
Até que o problema 5380 seja corrigido
essa é a forma recomendada de associar |
cc_toolchain_suite
Conferir origem da regracc_toolchain_suite(name, compatible_with, deprecation, distribs, features, licenses, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)
Obsoleto: a regra é autônoma e será removida.
Argumentos
Atributos | |
---|---|
name |
Nome; obrigatório Um nome exclusivo para o destino. |
fdo_prefetch_hints
Conferir origem da regrafdo_prefetch_hints(name, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, 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 o destino. |
profile
|
Rótulo obrigatório Identificador 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
Conferir origem da regrafdo_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 um perfil 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 o destino. |
memprof_profile
|
Rótulo o padrão é |
profile
|
Rótulo obrigatório Rótulo do perfil do FDO ou uma regra que o gera. O arquivo FDO pode ter um dos seguintes extensões: .profraw para perfis de LLVM não indexados, .profdata para LLVM indexados perfil, .zip que contenha um perfil de perfil LLVM, .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
Conferir origem da regramemprof_profile(name, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, profile, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)
Representa um perfil MEMPROF que está 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 o destino. |
profile
|
Rótulo obrigatório Rótulo do perfil MEMPROF. Espera-se que o perfil tenha extensão .profdata (para um memprof indexado/simbolizado) ou uma extensão .zip para um arquivo ZIP contendo um arquivo memprof.profdata . O rótulo também pode apontar para uma regra fdo_absolute_path_profile. |
propeller_optimize
Conferir origem da regrapropeller_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 um perfil de otimização de hélice 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 o destino. |
cc_profile
|
Rótulo obrigatório Rótulo do perfil transmitido para as várias ações de compilação. Este arquivo tem a extensão .txt. |
ld_profile
|
Rótulo obrigatório Rótulo do perfil transmitido para a ação de vinculação. Este arquivo tem a extensão .txt. |