Regras
- cc_binary
- cc_import
- cc_library
- cc_proto_library
- fdo_prefetch_hints
- fdo_profile
- propeller_optimize
- cc_test
- cc_toolchain
- cc_toolchain_suite
cc_binary
cc_binary(name, deps, srcs, data, additional_linker_inputs, args, compatible_with, copts, defines, deprecation, distribs, env, exec_compatible_with, exec_properties, features, includes, licenses, linkopts, linkshared, linkstatic, local_defines, malloc, nocopts, output_licenses, restricted_to, stamp, tags, target_compatible_with, testonly, toolchains, visibility, win_def_file)
Destinos de saída implícitos
name.stripped
(criado apenas se solicitado explicitamente): uma versão reduzida do binário. Ostrip -g
é executado no binário para remover os símbolos de depuração. Use--stripopt=-foo
para fornecer outras opções de faixa na linha de comando. Essa saída só será criada se explicitamente solicitada.name.dwp
(criado apenas se solicitado explicitamente): se a fissão estiver ativada: 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 |
Um nome exclusivo para o destino. |
deps
|
Eles podem ser destinos |
srcs
|
Todos os arquivos Um arquivo Todos os arquivos Se o nome de uma regra estiver no
Tipos de arquivos
...e as regras que produzem esses arquivos. Extensões diferentes indicam linguagens de programação distintas de acordo com a convenção da gcc. |
additional_linker_inputs
|
Por exemplo, arquivos .res compilados do Windows podem ser fornecidos aqui para serem incorporados no destino binário. |
copts
|
Cada string nesse atributo é adicionada na ordem indicada a
Se o pacote declarar o recurso
|
defines
|
-D e adicionada à linha de comando de compilação para esse destino,
bem como a todas as regras que dependem dele. Tenha muito cuidado, já que isso pode ter efeitos muito amplos. Em caso de dúvida, adicione valores definidos a
local_defines .
|
includes
|
Sujeito à substituição "Criar variável".
Cada string é precedida por Os cabeçalhos precisam ser adicionados a srcs ou hdrs. Caso contrário, eles não estarão disponíveis para as regras dependentes quando a compilação estiver no sandbox (padrão). |
linkopts
|
LINKOPTS antes da vinculação do destino binário.
Cada elemento dessa lista que não começa com |
linkshared
|
linkshared=True na sua regra. Por padrão,
essa opção fica desativada.
A presença dessa sinalização significa que a vinculação ocorre com a sinalização
Se você especificar |
linkstatic
|
cc_binary e
cc_test : vincule o binário no modo
estático. Para cc_library.linkstatic : confira abaixo.
Por padrão, essa opção fica ativada para o
Se ativada e for um binário ou um teste, essa opção instrui a ferramenta de build a vincular as
Há realmente três maneiras diferentes de vincular um executável:
O atributo
Se for |
local_defines
|
-D e adicionada à linha de comando de compilação desse destino,
mas não aos dependentes.
|
malloc
|
Por padrão, os binários C++ são vinculados a |
nocopts
|
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 da regra.
Esse atributo raramente é necessário.
|
stamp
|
Os binários carimbos não são recriados, a menos que as dependências deles mudem. |
win_def_file
|
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
cc_import(name, data, hdrs, alwayslink, compatible_with, deprecation, distribs, features, interface_library, licenses, restricted_to, shared_library, static_library, system_provided, tags, target_compatible_with, testonly, visibility)
As regras cc_import
permitem que os usuários importem bibliotecas C/C++ pré-compiladas.
Veja a seguir os casos de uso típicos:
1. 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. Vincular uma biblioteca compartilhada (Unix)
cc_import( name = "mylib", hdrs = ["mylib.h"], shared_library = "libmylib.so", )3. Vincular uma biblioteca compartilhada à biblioteca de interface (Windows)
cc_import( name = "mylib", hdrs = ["mylib.h"], # mylib.lib is a import library for mylib.dll which will be passed to linker interface_library = "mylib.lib", # mylib.dll will be available for runtime shared_library = "mylib.dll", )4. Vincular uma biblioteca compartilhada ao
system_provided=True
(Windows)
cc_import( name = "mylib", hdrs = ["mylib.h"], # mylib.lib is an import library for mylib.dll which will be passed to linker interface_library = "mylib.lib", # mylib.dll is provided by system environment, for example it can be found in PATH. # This indicates that Bazel is not responsible for making mylib.dll available. system_provided = 1, )5. 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", ) # first will link to libmylib.a cc_binary( name = "first", srcs = ["first.cc"], deps = [":mylib"], linkstatic = 1, # default value ) # second will link to libmylib.so cc_binary( name = "second", srcs = ["second.cc"], deps = [":mylib"], linkstatic = 0, )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", ) # first will link to libmylib.lib cc_binary( name = "first", srcs = ["first.cc"], deps = [":mylib"], linkstatic = 1, # default value ) # second will link to mylib.dll through mylib.lib cc_binary( name = "second", srcs = ["second.cc"], deps = [":mylib"], linkstatic = 0, )
Argumentos
Atributos | |
---|---|
name |
Um nome exclusivo para o destino. |
hdrs
|
|
alwayslink
|
Se o Alwayslink não funcionar com o VS 2017 no Windows, isso se deve a um problema conhecido, faça upgrade do VS 2017 para a versão mais recente. |
interface_library
|
Tipos de arquivos permitidos:
|
shared_library
|
Tipos de arquivos permitidos:
|
static_library
|
Tipos de arquivos permitidos:
|
system_provided
|
interface_library precisa ser especificado e
shared_library precisa estar vazio.
|
cc_library
cc_library(name, deps, srcs, data, hdrs, additional_compiler_inputs, additional_linker_inputs, alwayslink, compatible_with, copts, defines, deprecation, distribs, exec_compatible_with, exec_properties, features, implementation_deps, include_prefix, includes, licenses, linkopts, linkstamp, linkstatic, local_defines, nocopts, restricted_to, strip_include_prefix, tags, target_compatible_with, testonly, textual_hdrs, toolchains, visibility, win_def_file)
Verificação de inclusão de cabeçalho
Todos os arquivos principais usados no build precisam ser declarados em hdrs
ou
srcs
das regras cc_*
. Isso é obrigatório.
Para regras cc_library
, os cabeçalhos em hdrs
compõem a interface pública da biblioteca e podem ser incluídos diretamente dos arquivos em hdrs
e srcs
da própria biblioteca, bem como de arquivos em hdrs
e srcs
de 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 colocar um cabeçalho em hdrs
ou srcs
, pergunte se você quer que os consumidores dessa biblioteca possam incluí-lo diretamente. Essa é aproximadamente a mesma decisão entre a visibilidade de public
e private
em linguagens de programação.
As regras cc_binary
e cc_test
não têm uma interface exportada, então elas também não têm um atributo hdrs
. Todos os cabeçalhos que pertencem ao binário ou ao teste
diretamente precisam ser listados no srcs
.
Para entender 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, 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 |
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 se aplicam somente 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
principal no hdrs
ou srcs
em
qualquer cc_library
na interdição transitiva 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
.
No momento, o Bazel não consegue distinguir entre inclusões diretas e transitivas. Portanto, ele não detecta casos de erro em que um arquivo inclui ilegalmente um cabeçalho diretamente que só pode ser incluído de forma transitiva. Por exemplo, o Bazel não seria declarado se no exemplo acima foo.cc
incluísse diretamente baz.h
. Isso seria ilegal, porque foo
não depende diretamente de baz
. Atualmente, nenhum erro é produzido nesse caso, mas essa verificação de erros pode ser adicionada no futuro.
Argumentos
Atributos | |
---|---|
name |
Um nome exclusivo para o destino. |
deps
|
Eles podem ser destinos |
srcs
|
Todos os arquivos Um arquivo Todos os arquivos Se o nome de uma regra estiver no
Tipos de arquivos
...e as regras que produzem esses arquivos. Extensões diferentes indicam linguagens de programação distintas de acordo com a convenção da gcc. |
hdrs
|
Esse é o local recomendado para declarar arquivos de cabeçalho que
descrevem a interface da biblioteca. Esses cabeçalhos serão disponibilizados para inclusão pelas fontes nesta regra ou em regras dependentes.
Os cabeçalhos que não podem ser incluídos por um cliente dessa biblioteca precisam ser
listados no atributo |
additional_compiler_inputs
|
|
additional_linker_inputs
|
Por exemplo, arquivos .res compilados do Windows podem ser fornecidos aqui para serem incorporados no destino binário. |
alwayslink
|
srcs , mesmo que alguns não contenham símbolos referenciados pelo binário.
Isso é útil se o código não é chamado explicitamente pelo código no
binário, por exemplo, se ele é registrado para receber algum callback
fornecido por algum serviço.
Se o Alwayslink não funcionar com o VS 2017 no Windows, isso se deve a um problema conhecido, faça upgrade do VS 2017 para a versão mais recente. |
copts
|
Cada string nesse atributo é adicionada na ordem indicada a
Se o pacote declarar o recurso
|
defines
|
-D e adicionada à linha de comando de compilação para esse destino,
bem como a todas as regras que dependem dele. Tenha muito cuidado, já que isso pode ter efeitos muito amplos. Em caso de dúvida, adicione valores definidos a
local_defines .
|
implementation_deps
|
deps , os cabeçalhos e os caminhos dessas bibliotecas (e todas as
dependências transitivas) 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 estão vinculadas em
destinos binários que dependem dessa biblioteca.
Por enquanto, o uso é limitado a cc_library e protegido pela flag
|
include_prefix
|
Quando definidos, os cabeçalhos no atributo O prefixo no atributo |
includes
|
Sujeito à substituição "Criar variável".
Cada string é precedida por Os cabeçalhos precisam ser adicionados a srcs ou hdrs. Caso contrário, eles não estarão disponíveis para as regras dependentes quando a compilação estiver no sandbox (padrão). |
linkopts
|
LINKOPTS antes da vinculação do destino binário.
Cada elemento dessa lista que não começa com |
linkstamp
|
base .
|
linkstatic
|
cc_binary e
cc_test : vincule o binário no modo
estático. Para cc_library.linkstatic : confira abaixo.
Por padrão, essa opção fica ativada para o
Se ativada e for um binário ou um teste, essa opção instrui a ferramenta de build a vincular as
Há realmente três maneiras diferentes de vincular um executável:
O atributo
Se for |
local_defines
|
-D e adicionada à linha de comando de compilação desse destino,
mas não aos dependentes.
|
nocopts
|
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 da regra.
Esse atributo raramente é necessário.
|
strip_include_prefix
|
Quando definido, os cabeçalhos no atributo Se for um caminho relativo, será usado como relativo ao pacote. Se for absoluto, ele será entendido como um caminho relativo ao repositório. O prefixo no atributo |
textual_hdrs
|
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
|
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
cc_proto_library(name, deps, data, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, licenses, restricted_to, tags, target_compatible_with, testonly, visibility)
cc_proto_library
gera código C++ de arquivos .proto
.
deps
precisa apontar para regras proto_library
.
Exemplos
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 |
Um nome exclusivo para o destino. |
deps
|
proto_library
para as quais gerar o código C++.
|
fdo_prefetch_hints
fdo_prefetch_hints(name, compatible_with, deprecation, distribs, features, licenses, profile, restricted_to, tags, target_compatible_with, testonly, visibility)
Representa um perfil de dicas de pré-busca de FDO que está no espaço de trabalho ou em um caminho absoluto especificado. Exemplos:
fdo_prefetch_hints( name = "hints", profile = "//path/to/hints:profile.afdo", ) fdo_profile( name = "hints_abs", absolute_path_profile = "/absolute/path/profile.afdo", )
Argumentos
Atributos | |
---|---|
name |
Um nome exclusivo para o destino. |
profile
|
|
fdo_profile
fdo_profile(name, absolute_path_profile, compatible_with, deprecation, distribs, features, licenses, profile, proto_profile, restricted_to, tags, target_compatible_with, testonly, visibility)
Representa um perfil do FDO que está no espaço de trabalho ou em um caminho absoluto especificado. Exemplos:
fdo_profile( name = "fdo", profile = "//path/to/fdo:profile.zip", ) fdo_profile( name = "fdo_abs", absolute_path_profile = "/absolute/path/profile.zip", )
Argumentos
Atributos | |
---|---|
name |
Um nome exclusivo para o destino. |
absolute_path_profile
|
|
profile
|
|
proto_profile
|
|
propeller_optimize
propeller_optimize(name, compatible_with, deprecation, distribs, features, ld_profile, licenses, restricted_to, tags, target_compatible_with, testonly, visibility)
Representa um perfil de otimização de hélice no espaço de trabalho. Exemplos
propeller_optimize( name = "layout", cc_profile = "//path:cc_profile.txt", ld_profile = "//path:ld_profile.txt" ) propeller_optimize( name = "layout_absolute", absolute_cc_profile = "/absolute/cc_profile.txt", absolute_ld_profile = "/absolute/ld_profile.txt" )
Argumentos
Atributos | |
---|---|
name |
Um nome exclusivo para o destino. |
ld_profile
|
|
cc_test
cc_test(name, deps, srcs, data, additional_linker_inputs, args, compatible_with, copts, defines, deprecation, distribs, env, env_inherit, exec_compatible_with, exec_properties, features, flaky, includes, licenses, linkopts, linkstatic, local, local_defines, malloc, nocopts, restricted_to, shard_count, size, stamp, tags, target_compatible_with, testonly, timeout, toolchains, visibility, win_def_file)
Argumentos
Atributos | |
---|---|
name |
Um nome exclusivo para o destino. |
deps
|
Eles podem ser destinos |
srcs
|
Todos os arquivos Um arquivo Todos os arquivos Se o nome de uma regra estiver no
Tipos de arquivos
...e as regras que produzem esses arquivos. Extensões diferentes indicam linguagens de programação distintas de acordo com a convenção da gcc. |
additional_linker_inputs
|
Por exemplo, arquivos .res compilados do Windows podem ser fornecidos aqui para serem incorporados no destino binário. |
copts
|
Cada string nesse atributo é adicionada na ordem indicada a
Se o pacote declarar o recurso
|
defines
|
-D e adicionada à linha de comando de compilação para esse destino,
bem como a todas as regras que dependem dele. Tenha muito cuidado, já que isso pode ter efeitos muito amplos. Em caso de dúvida, adicione valores definidos a
local_defines .
|
includes
|
Sujeito à substituição "Criar variável".
Cada string é precedida por Os cabeçalhos precisam ser adicionados a srcs ou hdrs. Caso contrário, eles não estarão disponíveis para as regras dependentes quando a compilação estiver no sandbox (padrão). |
linkopts
|
LINKOPTS antes da vinculação do destino binário.
Cada elemento dessa lista que não começa com |
linkstatic
|
cc_binary e
cc_test : vincule o binário no modo
estático. Para cc_library.linkstatic : confira abaixo.
Por padrão, essa opção fica ativada para o
Se ativada e for um binário ou um teste, essa opção instrui a ferramenta de build a vincular as
Há realmente três maneiras diferentes de vincular um executável:
O atributo
Se for |
local_defines
|
-D e adicionada à linha de comando de compilação desse destino,
mas não aos dependentes.
|
malloc
|
Por padrão, os binários C++ são vinculados a |
nocopts
|
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 da regra.
Esse atributo raramente é necessário.
|
stamp
|
Os binários carimbos não são recriados, a menos que as dependências deles mudem. |
win_def_file
|
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
cc_toolchain(name, all_files, ar_files, as_files, compatible_with, compiler, compiler_files, compiler_files_without_includes, coverage_files, cpu, deprecation, distribs, dwp_files, dynamic_runtime_lib, exec_transition_for_inputs, features, libc_top, licenses, linker_files, module_map, objcopy_files, restricted_to, static_runtime_lib, strip_files, supports_header_parsing, supports_param_files, tags, target_compatible_with, testonly, toolchain_config, toolchain_identifier, visibility)
Representa um conjunto de ferramentas C++.
Essa regra é responsável por:
-
Coletar todos os artefatos necessários para a execução das ações do C++. Isso é feito por atributos como
all_files
,compiler_files
,linker_files
ou outros atributos que terminam com_files
. Eles geralmente são grupos de arquivos que abrangem todos os arquivos necessários. -
Gerar linhas de comando corretas para ações C++. Isso é feito usando o
provedor
CcToolchainConfigInfo
(detalhes abaixo).
Use o atributo toolchain_config
para configurar o conjunto de ferramentas do C++.
Consulte também esta
página
para conferir a configuração elaborada do conjunto de ferramentas de C++ e a documentação sobre a seleção do conjunto de ferramentas.
Use tags = ["manual"]
para evitar que conjuntos de ferramentas sejam criados e configurados desnecessariamente ao invocar bazel build //...
.
Argumentos
Atributos | |
---|---|
name |
Um nome exclusivo para o destino. |
all_files
|
all_files é um superconjunto
de todos os outros atributos de fornecimento de artefatos. Por exemplo, a compilação de linkstamp precisa de arquivos
de compilação e link, então usa all_files .
Isso é o que |
ar_files
|
Coleção de todos os artefatos cc_toolkit necessários para ações de arquivamento. |
as_files
|
Coleção de todos os artefatos cc_dataset necessários para ações de montagem. |
compiler
|
toolchain_identifier . Ele será um ambiente autônomo
após a
migração do CROSSTOOL para o Starlark
e será removido pelo
#7075.
Quando definido, ele será usado para executar a seleção crosstool_config.toolkit. Ela terá precedência sobre a opção --cpu Bazel. |
compiler_files
|
|
compiler_files_without_includes
|
|
coverage_files
|
|
cpu
|
Quando definido, ele será usado para executar a seleção crosstool_config.toolkit. Ela terá precedência sobre a opção --cpu Bazel. |
dwp_files
|
|
dynamic_runtime_lib
|
Ela será usada quando o recurso "static_link_cpp_runtimes" estiver ativado e estivermos vinculando dependências dinamicamente. |
exec_transition_for_inputs
|
|
libc_top
|
|
linker_files
|
|
module_map
|
|
objcopy_files
|
|
static_runtime_lib
|
Ela será usada quando o recurso "static_link_cpp_runtimes" estiver ativado e estivermos vinculando dependências estaticamente. |
strip_files
|
|
supports_header_parsing
|
|
supports_param_files
|
|
toolchain_config
|
cc_toolchain_config_info .
|
toolchain_identifier
|
Até que o problema #5380 seja corrigido,
essa é a maneira recomendada de associar |
cc_toolchain_suite
cc_toolchain_suite(name, compatible_with, deprecation, distribs, features, licenses, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)
Representa uma coleções de conjuntos de ferramentas C++.
Essa regra é responsável por:
- Coletar todos os conjuntos de ferramentas C++ relevantes.
-
Seleção de um conjunto de ferramentas dependendo das opções
--cpu
e--compiler
transmitidas para o Bazel.
Consulte também esta página para conferir a configuração elaborada do conjunto de ferramentas de C++ e a documentação sobre a seleção do conjunto de ferramentas.
Argumentos
Atributos | |
---|---|
name |
Um nome exclusivo para o destino. |
toolchains
|
cc_toolchain . "<cpu>" será usado quando apenas --cpu
for transmitido para o Bazel, e "<cpu>|<compiler>" será usado quando
--cpu e --compiler forem transmitidos para o Bazel. Exemplos
cc_toolchain_suite( name = "toolchain", toolchains = { "piii|gcc": ":my_cc_toolchain_for_piii_using_gcc", "piii": ":my_cc_toolchain_for_piii_using_default_compiler", }, ) |