Aturan
- 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
Melihat sumber aturancc_binary(name, deps, srcs, data, additional_linker_inputs, args, compatible_with, conlyopts, copts, cxxopts, 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)
Tindakan ini akan menghasilkan biner yang dapat dieksekusi.
name
target harus sama dengan nama
file sumber yang merupakan titik entri utama aplikasi (tanpa ekstensi).
Misalnya, jika titik entri Anda berada di main.cc
, nama Anda harus
main
.
Target output implisit
name.stripped
(hanya di-build jika diminta secara eksplisit): Versi biner yang dihapus.strip -g
dijalankan pada biner untuk menghapus simbol debug. Opsi strip tambahan dapat diberikan di command line menggunakan--stripopt=-foo
.name.dwp
(hanya di-build jika diminta secara eksplisit): Jika Fission diaktifkan: file paket informasi debug yang cocok untuk men-debug biner yang di-deploy dari jarak jauh. Lainnya: file kosong.
Argumen
Atribut | |
---|---|
name |
Nama; wajib Nama unik untuk target ini. |
deps
|
Daftar label; default-nya adalah Ini dapat berupa target
|
srcs
|
Daftar label; default-nya adalah Semua file File assembler murni (.s, .asm) tidak dipraproses dan biasanya dibuat menggunakan assembler. File assembly yang telah diproses sebelumnya (.S) diproses sebelumnya dan biasanya di-build menggunakan compiler C/C++. File Semua file File Jika atribut
Jenis file
... dan aturan apa pun yang menghasilkan file tersebut (misalnya, |
data
|
Daftar label; default-nya adalah data
di Atribut umum yang ditentukan oleh
sebagian besar aturan build.
Jika Jika Kode C++ Anda dapat mengakses file data ini seperti berikut:
|
additional_linker_inputs
|
Daftar label; default-nya adalah Misalnya, file .res Windows yang dikompilasi dapat disediakan di sini untuk disematkan dalam target biner. |
conlyopts
|
Daftar string; default-nya adalah |
copts
|
Daftar string; default-nya adalah
Setiap string dalam atribut ini ditambahkan dalam urutan yang diberikan ke
Jika paket mendeklarasikan fitur
|
cxxopts
|
Daftar string; default-nya adalah |
defines
|
Daftar string; default-nya adalah -D dan ditambahkan ke command line kompilasi ke target ini,
serta ke setiap aturan yang bergantung padanya. Berhati-hatilah, karena tindakan ini dapat
memiliki efek yang luas. Jika ragu, tambahkan nilai yang ditentukan ke
local_defines .
|
dynamic_deps
|
Daftar label; default-nya adalah cc_shared_library lain yang menjadi dependensi target saat ini.
Implementasi |
hdrs_check
|
String; default-nya adalah |
includes
|
Daftar string; default-nya adalah -isystem path_to_package/include_entry .
Ini hanya boleh digunakan untuk library pihak ketiga yang
tidak sesuai dengan gaya penulisan pernyataan #include Google.
Tidak seperti COPTS, flag ini ditambahkan untuk aturan ini
dan setiap aturan yang bergantung padanya. (Catatan: bukan aturan yang menjadi dependensinya!) Berhati-hatilah, karena hal ini dapat berdampak luas. Jika ragu, tambahkan
tanda "-I" ke COPTS.
Jalur |
link_extra_lib
|
Label; default-nya adalah
Secara default, biner C++ ditautkan ke |
linkopts
|
Daftar string; default-nya adalah LINKOPTS sebelum
menautkan target biner.
Setiap elemen dalam daftar ini yang tidak dimulai dengan |
linkshared
|
Boolean; default-nya adalah linkshared=True dalam aturan Anda. Secara default,
opsi ini nonaktif.
Kehadiran tanda ini berarti penautan terjadi dengan tanda
Jika menentukan |
linkstatic
|
Boolean; default-nya adalah cc_binary dan
cc_test : tautkan biner dalam mode
statis. Untuk cc_library.link_static : lihat di bawah.
Secara default, opsi ini diaktifkan untuk
Jika diaktifkan dan ini adalah biner atau pengujian, opsi ini akan memberi tahu alat build untuk menautkan
Sebenarnya ada tiga cara berbeda untuk menautkan file yang dapat dieksekusi:
Jika atribut
Atribut
Harus ada sedikit kode yang di-build dengan |
local_defines
|
Daftar string; default-nya adalah -D dan ditambahkan ke command line kompilasi untuk target ini,
tetapi tidak ke dependennya.
|
malloc
|
Label; default-nya adalah
Secara default, biner C++ ditautkan ke |
module_interfaces
|
Daftar label; default-nya adalah C++ Standard tidak memiliki batasan tentang ekstensi file antarmuka modul
Penggunaannya dilindungi oleh flag
|
nocopts
|
String; default-nya adalah COPTS yang sudah ada dan cocok dengan ekspresi reguler ini
(termasuk nilai yang ditentukan secara eksplisit dalam atribut copts aturan)
akan dihapus dari COPTS untuk tujuan mengompilasi aturan ini.
Atribut ini tidak boleh diperlukan atau digunakan
di luar third_party . Nilai tidak dipraproses
dengan cara apa pun selain penggantian variabel "Make".
|
reexport_deps
|
Daftar label; default-nya adalah |
stamp
|
Bilangan bulat; default-nya adalah
Biner yang dicap tidak akan di-build ulang kecuali jika dependensinya berubah. |
win_def_file
|
Label; default-nya adalah Atribut ini hanya boleh digunakan jika Windows adalah platform target. Ini dapat digunakan untuk mengekspor simbol selama penautan library bersama. |
cc_import
Melihat sumber aturancc_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)
Aturan cc_import
memungkinkan pengguna mengimpor library C/C++ yang telah dikompilasi sebelumnya.
Berikut adalah kasus penggunaan yang umum:
1. Menautkan library statis
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,
)
cc_import(
name = "mylib",
hdrs = ["mylib.h"],
shared_library = "libmylib.so",
)
Di 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",
)
Di 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
Di 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,
)
Di 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,
)
Di Unix:
cc_import(
name = "mylib",
hdrs = ["mylib.h"],
static_library = "libmylib.a",
shared_library = "libmylib.so",
)
Di 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",
)
Sisanya sama di Unix dan 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
mendukung atribut include. Contoh:
cc_import(
name = "curl_lib",
hdrs = glob(["vendor/curl/include/curl/*.h"]),
includes = ["vendor/curl/include"],
shared_library = "vendor/curl/lib/.libs/libcurl.dylib",
)
Argumen
Atribut | |
---|---|
name |
Nama; wajib Nama unik untuk target ini. |
deps
|
Daftar label; default-nya adalah deps
di Atribut umum yang ditentukan oleh
sebagian besar aturan build.
|
hdrs
|
Daftar label; default-nya adalah |
alwayslink
|
Boolean; default-nya adalah Jika alwayslink tidak berfungsi dengan VS 2017 di Windows, hal ini disebabkan oleh masalah umum, upgrade VS 2017 Anda ke versi terbaru. |
includes
|
Daftar string; default-nya adalah -isystem path_to_package/include_entry .
Ini hanya boleh digunakan untuk library pihak ketiga yang
tidak sesuai dengan gaya penulisan pernyataan #include Google.
Tidak seperti COPTS, flag ini ditambahkan untuk aturan ini
dan setiap aturan yang bergantung padanya. (Catatan: bukan aturan yang menjadi dependensinya!) Berhati-hatilah, karena hal ini dapat berdampak luas. Jika ragu, tambahkan
tanda "-I" ke COPTS.
Jalur |
interface_library
|
Label; default-nya adalah Jenis file yang diizinkan:
|
linkopts
|
Daftar string; default-nya adalah LINKOPTS sebelum
menautkan target biner.
Setiap elemen dalam daftar ini yang tidak dimulai dengan |
objects
|
Daftar label; default-nya adalah |
pic_objects
|
Daftar label; default-nya adalah |
pic_static_library
|
Label; default-nya adalah |
shared_library
|
Label; default-nya adalah Jenis file yang diizinkan:
|
static_library
|
Label; default-nya adalah Jenis file yang diizinkan:
|
system_provided
|
Boolean; default-nya adalah interface_library harus ditentukan dan
shared_library harus kosong.
|
cc_library
Melihat sumber aturancc_library(name, deps, srcs, data, hdrs, additional_compiler_inputs, additional_linker_inputs, alwayslink, compatible_with, conlyopts, copts, cxxopts, 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)
Gunakan cc_library()
untuk library yang dikompilasi C++.
Hasilnya adalah .so
, .lo
,
atau .a
, bergantung pada apa yang diperlukan.
Jika Anda mem-build sesuatu dengan penautan statis yang bergantung pada
cc_library
, output dari aturan library yang diandalkan
adalah file .a
. Jika menentukan
alwayslink=True
, Anda akan mendapatkan file .lo
.
Nama file output yang sebenarnya adalah libfoo.so
untuk
library bersama, dengan foo adalah nama aturan. Jenis library lainnya berakhir dengan .lo
dan .a
. Jika Anda memerlukan nama library bersama tertentu, misalnya, untuk menentukan modul Python, gunakan genrule untuk menyalin library
ke nama yang diinginkan.
Pemeriksaan penyertaan header
Semua file header yang digunakan dalam build harus dideklarasikan dalam
aturan hdrs
atau srcs
dari cc_*
.
Kebijakan ini diterapkan.
Untuk aturan cc_library
, header di hdrs
terdiri dari
antarmuka publik library dan dapat langsung disertakan
dari file di hdrs
dan srcs
library
itu sendiri serta dari file di hdrs
dan srcs
aturan cc_*
yang mencantumkan library di deps
-nya.
Header di srcs
hanya boleh disertakan langsung dari file
di hdrs
dan srcs
library itu sendiri. Saat
memutuskan apakah akan menempatkan header ke hdrs
atau srcs
,
Anda harus bertanya apakah Anda ingin konsumen library ini dapat
menyertakannya secara langsung. Ini kira-kira sama dengan
keputusan antara visibilitas public
dan private
dalam bahasa pemrograman.
Aturan cc_binary
dan cc_test
tidak memiliki antarmuka yang diekspor, sehingga juga tidak memiliki atribut hdrs
. Semua header
yang termasuk dalam biner atau pengujian secara langsung harus dicantumkan dalam
srcs
.
Untuk mengilustrasikan aturan ini, lihat contoh berikut.
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"],
)
Penyertaan langsung yang diizinkan dalam contoh ini tercantum dalam tabel di bawah.
Misalnya, foo.cc
diizinkan untuk langsung
menyertakan foo.h
dan bar.h
, tetapi tidak baz.h
.
Menyertakan file | Penyertaan yang diizinkan |
---|---|
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 |
Aturan pemeriksaan penyertaan hanya berlaku untuk penyertaan langsung. Pada contoh di atas, foo.cc
diizinkan untuk
menyertakan bar.h
, yang dapat menyertakan baz.h
, yang pada
gilirannya diizinkan untuk menyertakan baz-impl.h
. Secara teknis, kompilasi file .cc
dapat secara transitif menyertakan file header
apa pun di hdrs
atau srcs
dalam
cc_library
apa pun dalam penutupan deps
transitif. Dalam
hal ini, compiler dapat membaca baz.h
dan baz-impl.h
saat mengompilasi foo.cc
, tetapi foo.cc
tidak boleh
berisi #include "baz.h"
. Agar hal tersebut
diizinkan, baz
harus ditambahkan ke deps
dari foo
.
Bazel bergantung pada dukungan toolchain untuk menerapkan aturan pemeriksaan penyertaan.
Fitur layering_check
harus didukung oleh toolchain
dan diminta secara eksplisit, misalnya melalui
flag command line --features=layering_check
atau
parameter features
dari
fungsi package
. toolchain
yang disediakan oleh Bazel hanya mendukung fitur ini dengan clang di Unix dan macOS.
Contoh
Kita menggunakan tanda alwayslink
untuk memaksa penaut menautkan
kode ini meskipun kode biner utama tidak mereferensikannya.
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,
)
Contoh berikut berasal dari
third_party/python2_4_3/BUILD
.
Beberapa kode menggunakan library dl
(untuk memuat
library dinamis lainnya), sehingga
aturan ini menentukan opsi link -ldl
untuk menautkan
library dl
.
cc_library(
name = "python2_4_3",
linkopts = [
"-ldl",
"-lutil",
],
deps = ["//third_party/expat"],
)
Contoh berikut berasal dari third_party/kde/BUILD
.
Kita menyimpan file .so
bawaan di depot.
File header berada di subdirektori bernama 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"],
)
Contoh berikut berasal dari third_party/gles/BUILD
.
Kode pihak ketiga sering kali memerlukan beberapa defines
dan
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",
],
)
Argumen
Atribut | |
---|---|
name |
Nama; wajib Nama unik untuk target ini. |
deps
|
Daftar label; default-nya adalah Ini dapat berupa target Lihat komentar umum tentang Ini harus berupa nama aturan library C++.
Saat mem-build biner yang menautkan library aturan ini,
Anda juga akan menautkan library di Meskipun namanya "deps", tidak semua klien library ini
berada di sini. Dependensi data run-time berada di Untuk menautkan library pihak ketiga yang telah dikompilasi sebelumnya, tambahkan namanya ke
Untuk bergantung pada sesuatu tanpa menautkannya ke library ini, tambahkan
namanya ke |
srcs
|
Daftar label; default-nya adalah Semua file File assembler murni (.s, .asm) tidak dipraproses dan biasanya dibuat menggunakan assembler. File assembly yang telah diproses sebelumnya (.S) diproses sebelumnya dan biasanya di-build menggunakan compiler C/C++. File Semua file File Jika atribut
Jenis file
... dan aturan apa pun yang menghasilkan file tersebut (misalnya, |
data
|
Daftar label; default-nya adalah data
di Atribut umum yang ditentukan oleh
sebagian besar aturan build.
Jika Jika Kode C++ Anda dapat mengakses file data ini seperti berikut:
|
hdrs
|
Daftar label; default-nya adalah Ini adalah lokasi yang sangat disukai untuk mendeklarasikan file header yang
menjelaskan antarmuka untuk library. Header ini akan tersedia
untuk disertakan oleh sumber dalam aturan ini atau dalam aturan dependen.
Header yang tidak dimaksudkan untuk disertakan oleh klien library ini harus
dicantumkan dalam atribut Jenis file |
additional_compiler_inputs
|
Daftar label; default-nya adalah |
additional_linker_inputs
|
Daftar label; default-nya adalah Misalnya, file .res Windows yang dikompilasi dapat disediakan di sini untuk disematkan dalam target biner. |
alwayslink
|
Boolean; default-nya adalah srcs , meskipun beberapa tidak berisi simbol yang dirujuk oleh biner.
Hal ini berguna jika kode Anda tidak dipanggil secara eksplisit oleh kode dalam
biner, misalnya, jika kode Anda terdaftar untuk menerima beberapa callback
yang disediakan oleh beberapa layanan.
Jika alwayslink tidak berfungsi dengan VS 2017 di Windows, hal ini disebabkan oleh masalah umum, upgrade VS 2017 Anda ke versi terbaru. |
conlyopts
|
Daftar string; default-nya adalah |
copts
|
Daftar string; default-nya adalah
Setiap string dalam atribut ini ditambahkan dalam urutan yang diberikan ke
Jika paket mendeklarasikan fitur
|
cxxopts
|
Daftar string; default-nya adalah |
defines
|
Daftar string; default-nya adalah -D dan ditambahkan ke command line kompilasi ke target ini,
serta ke setiap aturan yang bergantung padanya. Berhati-hatilah, karena tindakan ini dapat
memiliki efek yang luas. Jika ragu, tambahkan nilai yang ditentukan ke
local_defines .
|
hdrs_check
|
String; default-nya adalah |
implementation_deps
|
Daftar label; default-nya adalah deps , header dan jalur penyertaan library ini (dan semua
dependensi transitifnya) hanya digunakan untuk kompilasi library ini, dan bukan library yang
bergantung padanya. Library yang ditentukan dengan implementation_deps masih ditautkan dalam
target biner yang bergantung pada library ini.
|
include_prefix
|
String; default-nya adalah Jika ditetapkan, header dalam atribut Awalan dalam atribut Atribut ini hanya sah berdasarkan |
includes
|
Daftar string; default-nya adalah -isystem path_to_package/include_entry .
Ini hanya boleh digunakan untuk library pihak ketiga yang
tidak sesuai dengan gaya penulisan pernyataan #include Google.
Tidak seperti COPTS, flag ini ditambahkan untuk aturan ini
dan setiap aturan yang bergantung padanya. (Catatan: bukan aturan yang menjadi dependensinya!) Berhati-hatilah, karena hal ini dapat berdampak luas. Jika ragu, tambahkan
tanda "-I" ke COPTS.
Jalur |
linkopts
|
Daftar string; default-nya adalah cc_binary.linkopts .
Atribut linkopts juga diterapkan ke target apa pun yang
bergantung, secara langsung atau tidak langsung, pada library ini melalui atribut
deps (atau melalui atribut lain yang diperlakukan dengan cara yang sama:
atribut malloc
dari cc_binary ). Linkopts
dependensi lebih diprioritaskan daripada linkopts dependen (yaitu linkopts dependen
muncul nanti di command line). Linkopts yang ditentukan dalam
--linkopt
lebih diutamakan daripada linkopts aturan.
Perhatikan bahwa atribut Selain itu, perlu diperhatikan bahwa opsi "-Wl,-soname" atau "-Xlinker -soname" tidak didukung dan tidak boleh ditentukan dalam atribut ini. File |
linkstamp
|
Label; default-nya adalah base .
|
linkstatic
|
Boolean; default-nya adalah cc_binary dan
cc_test : tautkan biner dalam mode
statis. Untuk cc_library.link_static : lihat di bawah.
Secara default, opsi ini diaktifkan untuk
Jika diaktifkan dan ini adalah biner atau pengujian, opsi ini akan memberi tahu alat build untuk menautkan
Sebenarnya ada tiga cara berbeda untuk menautkan file yang dapat dieksekusi:
Jika atribut
Atribut
Harus ada sedikit kode yang di-build dengan |
local_defines
|
Daftar string; default-nya adalah -D dan ditambahkan ke command line kompilasi untuk target ini,
tetapi tidak ke dependennya.
|
module_interfaces
|
Daftar label; default-nya adalah C++ Standard tidak memiliki batasan tentang ekstensi file antarmuka modul
Penggunaannya dilindungi oleh flag
|
strip_include_prefix
|
String; default-nya adalah Jika ditetapkan, header dalam atribut Jika merupakan jalur relatif, jalur tersebut akan dianggap sebagai jalur relatif paket. Jika bersifat absolut, jalur ini akan dipahami sebagai jalur relatif repositori. Awalan dalam atribut Atribut ini hanya sah berdasarkan |
textual_hdrs
|
Daftar label; default-nya adalah Ini adalah lokasi untuk mendeklarasikan file header yang tidak dapat dikompilasi sendiri; yaitu, file tersebut selalu harus disertakan secara tekstual oleh file sumber lain untuk mem-build kode yang valid. |
win_def_file
|
Label; default-nya adalah Atribut ini hanya boleh digunakan jika Windows adalah platform target. Ini dapat digunakan untuk mengekspor simbol selama penautan library bersama. |
cc_shared_library
Melihat sumber aturancc_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)
Tindakan ini akan menghasilkan library bersama.
Contoh
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"], )
Dalam contoh, foo_shared
menautkan foo
dan baz
secara statis, dengan baz
sebagai dependensi transitif. Fungsi ini tidak
menautkan bar
karena sudah disediakan secara dinamis oleh
dynamic_dep
bar_shared
.
foo_shared
menggunakan file skrip penaut *.lds untuk mengontrol
simbol yang akan diekspor. Logika aturan cc_shared_library
tidak
mengontrol simbol mana yang diekspor, tetapi hanya menggunakan apa yang diasumsikan
diekspor untuk memberikan error selama fase analisis jika dua library bersama mengekspor
target yang sama.
Setiap dependensi langsung cc_shared_library
diasumsikan
diekspor. Oleh karena itu, Bazel mengasumsikan selama analisis bahwa foo
sedang
diekspor oleh foo_shared
. baz
tidak dianggap diekspor
oleh foo_shared
. Setiap target yang cocok dengan exports_filter
juga diasumsikan diekspor.
Setiap cc_library
dalam contoh harus muncul maksimal dalam satu
cc_shared_library
. Jika ingin menautkan baz
juga ke
bar_shared
, kita harus menambahkan
tags = ["LINKABLE_MORE_THAN_ONCE"]
ke baz
.
Karena atribut shared_lib_name
, file yang dihasilkan oleh
bar_shared
akan memiliki nama bar.so
, bukan
nama libbar.so
yang akan dimiliki secara default di Linux.
Error
Two shared libraries in dependencies export the same symbols.
Hal ini akan terjadi setiap kali Anda membuat target dengan dua dependensi cc_shared_library
yang berbeda yang mengekspor target yang sama. Untuk memperbaikinya,
Anda harus menghentikan library agar tidak diekspor di salah satu
dependensi cc_shared_library
.
Two shared libraries in dependencies link the same library statically
Hal ini akan terjadi setiap kali Anda membuat cc_shared_library
baru dengan dua
dependensi cc_shared_library
yang berbeda yang menautkan target yang sama secara statis.
Mirip dengan error pada ekspor.
Salah satu cara untuk memperbaikinya adalah dengan berhenti menautkan library ke salah satu
dependensi cc_shared_library
. Pada saat yang sama, library yang masih menautkannya
harus mengekspor library sehingga library yang tidak menautkannya tetap memiliki visibilitas terhadap
simbol. Cara lainnya adalah dengan mengambil library ketiga yang mengekspor target.
Cara ketiga adalah memberi tag pada cc_library
pelaku dengan LINKABLE_MORE_THAN_ONCE
,
tetapi perbaikan ini jarang terjadi dan Anda harus memastikan bahwa
cc_library
memang aman untuk ditautkan lebih dari sekali.
'//foo:foo' is already linked statically in '//bar:bar' but not exported`
Artinya, library dalam penutupan transitif deps
Anda dapat dijangkau
tanpa melalui salah satu dependensi cc_shared_library
, tetapi sudah
dikaitkan ke cc_shared_library
yang berbeda di dynamic_deps
dan tidak
diekspor.
Solusinya adalah mengekspornya dari dependensi cc_shared_library
atau menarik
cc_shared_library
ketiga yang mengekspornya.
Do not place libraries which only contain a precompiled dynamic library in deps.
Jika Anda memiliki library dinamis yang telah dikompilasi sebelumnya, library ini tidak perlu dan tidak dapat
ditautkan secara statis ke target cc_shared_library
saat ini yang sedang
Anda buat. Oleh karena itu, nilai ini tidak termasuk dalam deps
dari
cc_shared_library
. Jika library dinamis yang telah dikompilasi sebelumnya ini merupakan dependensi dari salah satu
cc_libraries
Anda, cc_library
harus bergantung pada library tersebut
secara langsung.
Trying to export a library already exported by a different shared library
Anda akan melihat error ini jika pada aturan saat ini Anda mengklaim untuk mengekspor target yang sudah diekspor oleh salah satu dependensi dinamis Anda.
Untuk memperbaikinya, hapus target dari deps
dan cukup andalkan dari dependensi
dinamis atau pastikan exports_filter
tidak menangkap target ini.
Argumen
Atribut | |
---|---|
name |
Nama; wajib Nama unik untuk target ini. |
deps
|
Daftar label; default-nya adalah
Setiap dependensi library transitif dari dependensi langsung ini akan ditautkan ke library
bersama ini selama belum ditautkan oleh
Selama analisis, penerapan aturan akan menganggap target apa pun yang tercantum dalam
Implementasi juga akan memicu error setiap kali library yang sama ditautkan secara statis
ke lebih dari satu |
additional_linker_inputs
|
Daftar label; default-nya adalah user_link_flags .
|
dynamic_deps
|
Daftar label; default-nya adalah cc_shared_library lain yang menjadi dependensi target saat ini.
Implementasi |
experimental_disable_topo_sort_do_not_use_remove_before_7_0
|
Boolean; default-nya adalah |
exports_filter
|
Daftar string; default-nya adalah
Setiap target
Perhatikan bahwa atribut ini sebenarnya tidak menambahkan tepi dependensi ke target tersebut, tetapi tepi dependensi harus dibuat oleh Sintaks berikut diizinkan:
|
roots
|
Daftar label; default-nya adalah |
shared_lib_name
|
String; default-nya adalah |
static_deps
|
Daftar string; default-nya adalah |
user_link_flags
|
Daftar string; default-nya adalah
|
win_def_file
|
Label; default-nya adalah Atribut ini hanya boleh digunakan jika Windows adalah platform target. Ini dapat digunakan untuk mengekspor simbol selama penautan library bersama. |
cc_static_library
Melihat sumber aturancc_static_library(name, deps, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)
--experimental_cc_static_library
.
Menghasilkan library statis dari daftar target dan dependensi transitifnya.
Library statis yang dihasilkan berisi file objek target yang tercantum dalam
deps
serta dependensi transitifnya, dengan preferensi yang diberikan ke
objek PIC
.
Grup output
linkdeps
File teks yang berisi label dependensi transitif target yang tercantum dalam
deps
yang tidak berkontribusi pada file objek apa pun ke library statis, tetapi
menyediakan setidaknya satu library statis, dinamis, atau antarmuka. Library statis yang dihasilkan
mungkin memerlukan library ini tersedia pada waktu penautan.
linkopts
File teks yang berisi linkopts
yang disediakan pengguna dari semua dependensi
transitif target yang tercantum dalam deps
.
Simbol duplikat
Secara default, aturan cc_static_library
memeriksa apakah library statis
yang dihasilkan tidak berisi simbol duplikat. Jika demikian, build akan gagal dengan pesan
error yang mencantumkan simbol duplikat dan file objek yang berisinya.
Pemeriksaan ini dapat dinonaktifkan per target atau per paket dengan menetapkan
features = ["-symbol_check"]
atau secara global melalui
--features=-symbol_check
.
Dukungan toolchain untuk symbol_check
Toolchain C++ yang dikonfigurasi otomatis dan dikirimkan dengan Bazel mendukung
fitur symbol_check
di semua platform. toolchain kustom dapat menambahkan dukungan untuk
hal ini dengan salah satu dari dua cara:
- Menerapkan tindakan
ACTION_NAMES.validate_static_library
dan mengaktifkannya dengan fitursymbol_check
. Alat yang ditetapkan dalam tindakan dipanggil dengan dua argumen, library statis untuk memeriksa simbol duplikat dan jalur file yang harus dibuat jika pemeriksaan lulus. - Memiliki fitur
symbol_check
yang menambahkan flag pengarsip yang menyebabkan tindakan pembuatan library statis gagal pada simbol duplikat.
Argumen
Atribut | |
---|---|
name |
Nama; wajib Nama unik untuk target ini. |
deps
|
Daftar label; default-nya adalah Dependensi yang tidak menyediakan file objek apa pun tidak disertakan dalam library
statis, tetapi labelnya dikumpulkan dalam file yang disediakan oleh
grup output |
cc_test
Melihat sumber aturancc_test(name, deps, srcs, data, additional_linker_inputs, args, compatible_with, conlyopts, copts, cxxopts, 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)
Aturan cc_test()
mengompilasi pengujian. Di sini, pengujian
adalah wrapper biner di sekitar beberapa kode pengujian.
Secara default, pengujian C++ ditautkan secara dinamis.
Untuk menautkan pengujian unit secara statis, tentukan
linkstatic=True
.
Sebaiknya beri komentar mengapa pengujian Anda memerlukan
linkstatic
; hal ini mungkin tidak jelas.
Target output implisit
name.stripped
(hanya di-build jika diminta secara eksplisit): Versi biner yang dihapus.strip -g
dijalankan pada biner untuk menghapus simbol debug. Opsi strip tambahan dapat diberikan di command line menggunakan--stripopt=-foo
.name.dwp
(hanya di-build jika diminta secara eksplisit): Jika Fission diaktifkan: file paket informasi debug yang cocok untuk men-debug biner yang di-deploy dari jarak jauh. Lainnya: file kosong.
Lihat argumen cc_binary(), kecuali argumen stamp
ditetapkan ke 0 secara default untuk pengujian dan cc_test
memiliki
atribut tambahan yang umum untuk semua aturan pengujian (*_test).
Argumen
Atribut | |
---|---|
name |
Nama; wajib Nama unik untuk target ini. |
deps
|
Daftar label; default-nya adalah Ini dapat berupa target
|
srcs
|
Daftar label; default-nya adalah Semua file File assembler murni (.s, .asm) tidak dipraproses dan biasanya dibuat menggunakan assembler. File assembly yang telah diproses sebelumnya (.S) diproses sebelumnya dan biasanya di-build menggunakan compiler C/C++. File Semua file File Jika atribut
Jenis file
... dan aturan apa pun yang menghasilkan file tersebut (misalnya, |
data
|
Daftar label; default-nya adalah data
di Atribut umum yang ditentukan oleh
sebagian besar aturan build.
Jika Jika Kode C++ Anda dapat mengakses file data ini seperti berikut:
|
additional_linker_inputs
|
Daftar label; default-nya adalah Misalnya, file .res Windows yang dikompilasi dapat disediakan di sini untuk disematkan dalam target biner. |
conlyopts
|
Daftar string; default-nya adalah |
copts
|
Daftar string; default-nya adalah
Setiap string dalam atribut ini ditambahkan dalam urutan yang diberikan ke
Jika paket mendeklarasikan fitur
|
cxxopts
|
Daftar string; default-nya adalah |
defines
|
Daftar string; default-nya adalah -D dan ditambahkan ke command line kompilasi ke target ini,
serta ke setiap aturan yang bergantung padanya. Berhati-hatilah, karena tindakan ini dapat
memiliki efek yang luas. Jika ragu, tambahkan nilai yang ditentukan ke
local_defines .
|
dynamic_deps
|
Daftar label; default-nya adalah cc_shared_library lain yang menjadi dependensi target saat ini.
Implementasi |
hdrs_check
|
String; default-nya adalah |
includes
|
Daftar string; default-nya adalah -isystem path_to_package/include_entry .
Ini hanya boleh digunakan untuk library pihak ketiga yang
tidak sesuai dengan gaya penulisan pernyataan #include Google.
Tidak seperti COPTS, flag ini ditambahkan untuk aturan ini
dan setiap aturan yang bergantung padanya. (Catatan: bukan aturan yang menjadi dependensinya!) Berhati-hatilah, karena hal ini dapat berdampak luas. Jika ragu, tambahkan
tanda "-I" ke COPTS.
Jalur |
link_extra_lib
|
Label; default-nya adalah
Secara default, biner C++ ditautkan ke |
linkopts
|
Daftar string; default-nya adalah LINKOPTS sebelum
menautkan target biner.
Setiap elemen dalam daftar ini yang tidak dimulai dengan |
linkshared
|
Boolean; default-nya adalah linkshared=True dalam aturan Anda. Secara default,
opsi ini nonaktif.
Kehadiran tanda ini berarti penautan terjadi dengan tanda
Jika menentukan |
linkstatic
|
Boolean; default-nya adalah cc_binary dan
cc_test : tautkan biner dalam mode
statis. Untuk cc_library.link_static : lihat di bawah.
Secara default, opsi ini diaktifkan untuk
Jika diaktifkan dan ini adalah biner atau pengujian, opsi ini akan memberi tahu alat build untuk menautkan
Sebenarnya ada tiga cara berbeda untuk menautkan file yang dapat dieksekusi:
Jika atribut
Atribut
Harus ada sedikit kode yang di-build dengan |
local_defines
|
Daftar string; default-nya adalah -D dan ditambahkan ke command line kompilasi untuk target ini,
tetapi tidak ke dependennya.
|
malloc
|
Label; default-nya adalah
Secara default, biner C++ ditautkan ke |
module_interfaces
|
Daftar label; default-nya adalah C++ Standard tidak memiliki batasan tentang ekstensi file antarmuka modul
Penggunaannya dilindungi oleh flag
|
nocopts
|
String; default-nya adalah COPTS yang sudah ada dan cocok dengan ekspresi reguler ini
(termasuk nilai yang ditentukan secara eksplisit dalam atribut copts aturan)
akan dihapus dari COPTS untuk tujuan mengompilasi aturan ini.
Atribut ini tidak boleh diperlukan atau digunakan
di luar third_party . Nilai tidak dipraproses
dengan cara apa pun selain penggantian variabel "Make".
|
reexport_deps
|
Daftar label; default-nya adalah |
stamp
|
Bilangan bulat; default-nya adalah
Biner yang dicap tidak akan di-build ulang kecuali jika dependensinya berubah. |
win_def_file
|
Label; default-nya adalah Atribut ini hanya boleh digunakan jika Windows adalah platform target. Ini dapat digunakan untuk mengekspor simbol selama penautan library bersama. |
cc_toolchain
Melihat sumber aturancc_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)
Merepresentasikan toolchain C++.
Aturan ini bertanggung jawab untuk:
-
Mengumpulkan semua artefak yang diperlukan agar tindakan C++ dapat berjalan. Hal ini dilakukan oleh
atribut seperti
all_files
,compiler_files
,linker_files
, atau atribut lain yang diakhiri dengan_files
). Ini adalah grup file yang paling umum yang menggabungkan semua file yang diperlukan. -
Membuat command line yang benar untuk tindakan C++. Hal ini dilakukan menggunakan
penyedia
CcToolchainConfigInfo
(detail di bawah).
Gunakan atribut toolchain_config
untuk mengonfigurasi toolchain C++.
Lihat juga
halaman
ini untuk mengetahui dokumentasi konfigurasi toolchain C++ dan pemilihan toolchain yang mendetail.
Gunakan tags = ["manual"]
untuk mencegah toolchain di-build dan dikonfigurasi
secara tidak perlu saat memanggil bazel build //...
Argumen
Atribut | |
---|---|
name |
Nama; wajib Nama unik untuk target ini. |
all_files
|
Label; wajib diisi Kumpulan semua artefak cc_toolchain. Artefak ini akan ditambahkan sebagai input ke semua tindakan terkait rules_cc (kecuali tindakan yang menggunakan kumpulan artefak yang lebih akurat dari atribut di bawah). Bazel mengasumsikan bahwaall_files adalah superset
dari semua atribut penyedia artefak lainnya (misalnya, kompilasi linkstamp memerlukan file compile
dan link, sehingga memerlukan all_files ).
Ini adalah isi |
ar_files
|
Label; default-nya adalah |
as_files
|
Label; default-nya adalah |
compiler_files
|
Label; wajib diisi Kumpulan semua artefak cc_toolchain yang diperlukan untuk tindakan kompilasi. |
compiler_files_without_includes
|
Label; default-nya adalah |
coverage_files
|
Label; default-nya adalah |
dwp_files
|
Label; wajib diisi Kumpulan semua artefak cc_toolchain yang diperlukan untuk tindakan dwp. |
dynamic_runtime_lib
|
Label; default-nya adalah Ini akan digunakan saat fitur 'static_link_cpp_runtimes' diaktifkan, dan kita menautkan dependensi secara dinamis. |
exec_transition_for_inputs
|
Boolean; default-nya adalah |
libc_top
|
Label; default-nya adalah |
linker_files
|
Label; wajib diisi Kumpulan semua artefak cc_toolchain yang diperlukan untuk menautkan tindakan. |
module_map
|
Label; default-nya adalah |
objcopy_files
|
Label; wajib diisi Kumpulan semua artefak cc_toolchain yang diperlukan untuk tindakan objcopy. |
output_licenses
|
Daftar string; default-nya adalah |
static_runtime_lib
|
Label; default-nya adalah Ini akan digunakan saat fitur 'static_link_cpp_runtimes' diaktifkan, dan kita menautkan dependensi secara statis. |
strip_files
|
Label; wajib diisi Kumpulan semua artefak cc_toolchain yang diperlukan untuk tindakan strip. |
supports_header_parsing
|
Boolean; default-nya adalah |
supports_param_files
|
Boolean; default-nya adalah |
toolchain_config
|
Label; wajib diisi Label aturan yang menyediakancc_toolchain_config_info .
|
toolchain_identifier
|
String; default-nya adalah
Sampai masalah #5380 diperbaiki,
ini adalah cara yang direkomendasikan untuk mengaitkan |
cc_toolchain_suite
Melihat sumber aturancc_toolchain_suite(name, compatible_with, deprecation, distribs, features, licenses, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)
Tidak digunakan lagi: aturan ini tidak berfungsi dan akan dihapus.
Argumen
Atribut | |
---|---|
name |
Nama; wajib Nama unik untuk target ini. |
fdo_prefetch_hints
Melihat sumber aturanfdo_prefetch_hints(name, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, profile, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)
Merepresentasikan profil petunjuk pengambilan data FDO yang ada di ruang kerja. Contoh:
fdo_prefetch_hints(
name = "hints",
profile = "//path/to/hints:profile.afdo",
)
Argumen
Atribut | |
---|---|
name |
Nama; wajib Nama unik untuk target ini. |
profile
|
Label; wajib diisi Label profil petunjuk. File petunjuk memiliki ekstensi .afdo Label juga dapat mengarah ke aturan fdo_absolute_path_profile. |
fdo_profile
Melihat sumber aturanfdo_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)
Merepresentasikan profil FDO yang ada di ruang kerja. Contoh:
fdo_profile(
name = "fdo",
profile = "//path/to/fdo:profile.zip",
)
Argumen
Atribut | |
---|---|
name |
Nama; wajib Nama unik untuk target ini. |
memprof_profile
|
Label; default-nya adalah |
profile
|
Label; wajib diisi Label profil FDO atau aturan yang membuatnya. File FDO dapat memiliki salah satu ekstensi berikut: .profraw untuk profil LLVM yang tidak diindeks, .profdata untuk profil LLVM yang diindeks, .zip yang menyimpan profil profraw LLVM, .afdo untuk profil AutoFDO, .xfdo untuk profil XBinary. Label juga dapat mengarah ke aturan fdo_absolute_path_profile. |
proto_profile
|
Label; default-nya adalah |
memprof_profile
Melihat sumber aturanmemprof_profile(name, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, profile, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)
Merepresentasikan profil MEMPROF yang ada di ruang kerja. Contoh:
memprof_profile(
name = "memprof",
profile = "//path/to/memprof:profile.afdo",
)
Argumen
Atribut | |
---|---|
name |
Nama; wajib Nama unik untuk target ini. |
profile
|
Label; wajib diisi Label profil MEMPROF. Profil diharapkan memiliki ekstensi .profdata (untuk profil memprof yang diindeks/disimbolkan), atau ekstensi .zip untuk file zip yang berisi file memprof.profdata. Label juga dapat mengarah ke aturan fdo_absolute_path_profile. |
propeller_optimize
Melihat sumber aturanpropeller_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)
Merepresentasikan profil pengoptimalan Propeller di ruang kerja. Contoh:
propeller_optimize(
name = "layout",
cc_profile = "//path:cc_profile.txt",
ld_profile = "//path:ld_profile.txt"
)
Argumen
Atribut | |
---|---|
name |
Nama; wajib Nama unik untuk target ini. |
cc_profile
|
Label; wajib diisi Label profil yang diteruskan ke berbagai tindakan kompilasi. File ini memiliki ekstensi .txt. |
ld_profile
|
Label; wajib diisi Label profil yang diteruskan ke tindakan penautan. File ini memiliki ekstensi .txt. |