Aturan
- cc_binary
- cc_import
- cc_library
- cc_proto_library
- cc_shared_library
- cc_test
- cc_toolchain
- cc_toolchain_suite
- fdo_prefetch_hints
- fdo_profile
- memprof_profile
- propeller_optimize
cc_binary
Lihat sumber aturancc_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)
Ini 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 dibuat jika diminta secara eksplisit): Versi biner yang dihapus.strip -g
dijalankan pada biner untuk menghapus simbol debug. Opsi strip tambahan dapat diberikan pada command line menggunakan--stripopt=-foo
.name.dwp
(hanya dibuat jika diminta secara eksplisit): Jika Fission diaktifkan: file paket informasi debug yang cocok untuk men-debug biner yang di-deploy dari jarak jauh. Else: file kosong.
Argumen
Atribut | |
---|---|
name |
Nama; wajib diisi Nama unik untuk target ini. |
deps
|
Daftar label; defaultnya adalah Tujuan ini dapat berupa target |
srcs
|
Daftar label; defaultnya adalah Semua file File assembler murni (.s, .asm) tidak diproses sebelumnya dan biasanya dibuat menggunakan assembler. File assembly prapemrosesan (.S) telah diproses sebelumnya dan biasanya dibuat menggunakan compiler C/C++. File Semua file File Jika atribut
... dan aturan apa pun yang menghasilkan file tersebut (misalnya |
data
|
Daftar label; defaultnya 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; defaultnya adalah Misalnya, file .res Windows yang dikompilasi dapat disediakan di sini untuk disematkan dalam target biner. |
copts
|
Daftar string; defaultnya adalah
Setiap string dalam atribut ini ditambahkan dalam urutan yang ditentukan ke
Jika paket mendeklarasikan fitur
|
defines
|
Daftar string; defaultnya adalah -D dan ditambahkan ke command line kompilasi ke target ini,
serta setiap aturan yang bergantung padanya. Hati-hati, karena hal ini
dapat berdampak luas. Jika ragu, tambahkan nilai definisi ke
local_defines .
|
dynamic_deps
|
Daftar label; defaultnya adalah cc_shared_library lain yang menjadi dependensi target saat ini.
Implementasi |
hdrs_check
|
String; defaultnya adalah |
includes
|
Daftar string; defaultnya adalah -isystem path_to_package/include_entry .
Metode ini hanya boleh digunakan untuk library pihak ketiga yang tidak sesuai dengan gaya penulisan pernyataan #include dari Google.
Tidak seperti COPTS, flag ini ditambahkan untuk aturan ini dan setiap aturan yang bergantung padanya. (Catatan: bukan aturan yang menjadi dependensinya.) Hati-hati, karena hal ini mungkin memiliki jangkauan yang luas. Jika ragu, tambahkan
tanda "-I" ke COPTS.
Jalur |
link_extra_lib
|
Label; defaultnya adalah
Secara default, biner C++ ditautkan dengan |
linkopts
|
Daftar string; defaultnya adalah LINKOPTS sebelum
menautkan target biner.
Setiap elemen daftar ini yang tidak diawali dengan |
linkshared
|
Boolean; defaultnya adalah linkshared=True dalam aturan Anda. Secara default,
opsi ini nonaktif.
Keberadaan tanda ini berarti penautan terjadi dengan tanda
Jika menentukan |
linkstatic
|
Boolean; defaultnya adalah cc_binary dan
cc_test : tautkan biner dalam mode
statis. Untuk cc_library.link_static : lihat di bawah.
Secara default, opsi ini aktif untuk
Jika diaktifkan dan ini adalah biner atau pengujian, opsi ini memberi tahu alat build untuk menautkan di
Sebenarnya ada tiga cara untuk menautkan {i>executable<i}:
Jika atribut
Atribut
Seharusnya sangat sedikit kode yang dibuat dengan |
local_defines
|
Daftar string; defaultnya adalah -D dan ditambahkan ke command line kompilasi untuk target ini,
tetapi tidak ke dependensinya.
|
malloc
|
Label; defaultnya adalah
Secara default, biner C++ ditautkan ke |
module_interfaces
|
Daftar label; defaultnya adalah C++ Standard tidak memiliki batasan tentang ekstensi file antarmuka modul
Penggunaan dilindungi oleh flag
|
nocopts
|
String; defaultnya adalah COPTS yang sudah ada dan cocok dengan ekspresi reguler ini (termasuk nilai yang secara eksplisit ditentukan dalam atribut copts aturan) akan dihapus dari COPTS untuk tujuan kompilasi aturan ini.
Atribut ini tidak boleh diperlukan atau digunakan
di luar third_party . Nilai tidak diproses sebelumnya
dengan cara apa pun selain substitusi variabel "Make".
|
reexport_deps
|
Daftar label; defaultnya adalah |
stamp
|
Bilangan bulat; defaultnya adalah
Biner yang distempel tidak dibangun ulang kecuali jika dependensinya berubah. |
win_def_file
|
Label; defaultnya adalah Atribut ini hanya boleh digunakan jika Windows adalah platform target. Library ini dapat digunakan untuk mengekspor simbol selama menautkan library bersama. |
cc_import
Lihat 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 ini adalah kasus penggunaan 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,
)
2. Menautkan library bersama (Unix)
cc_import(
name = "mylib",
hdrs = ["mylib.h"],
shared_library = "libmylib.so",
)
3. Menautkan library bersama dengan library antarmuka
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",
)
4. Menautkan library bersama dengan 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,
)
5. Menautkan ke library statis atau bersama
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 sertakan. Misalnya:
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 diisi Nama unik untuk target ini. |
deps
|
Daftar label; defaultnya adalah deps
di Atribut umum yang ditentukan oleh
sebagian besar aturan build.
|
hdrs
|
Daftar label; defaultnya adalah |
alwayslink
|
Boolean; defaultnya adalah Jika alwayslink tidak berfungsi dengan VS 2017 di Windows, itu karena masalah umum, upgrade VS 2017 Anda ke versi terbaru. |
includes
|
Daftar string; defaultnya adalah -isystem path_to_package/include_entry .
Metode ini hanya boleh digunakan untuk library pihak ketiga yang tidak sesuai dengan gaya penulisan pernyataan #include dari Google.
Tidak seperti COPTS, flag ini ditambahkan untuk aturan ini dan setiap aturan yang bergantung padanya. (Catatan: bukan aturan yang menjadi dependensinya.) Hati-hati, karena hal ini mungkin memiliki jangkauan yang luas. Jika ragu, tambahkan
tanda "-I" ke COPTS.
Jalur |
interface_library
|
Label; defaultnya adalah Jenis file yang diizinkan:
|
linkopts
|
Daftar string; defaultnya adalah LINKOPTS sebelum
menautkan target biner.
Setiap elemen daftar ini yang tidak diawali dengan |
objects
|
Daftar label; defaultnya adalah |
pic_objects
|
Daftar label; defaultnya adalah |
pic_static_library
|
Label; defaultnya adalah |
shared_library
|
Label; defaultnya adalah Jenis file yang diizinkan:
|
static_library
|
Label; defaultnya adalah Jenis file yang diizinkan:
|
system_provided
|
Boolean; defaultnya adalah interface_library harus ditentukan dan
shared_library harus kosong.
|
cc_library
Lihat sumber aturancc_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)
Gunakan cc_library()
untuk library yang dikompilasi C++.
Hasilnya adalah .so
, .lo
, atau .a
, bergantung pada apa yang diperlukan.
Jika Anda membuat sesuatu dengan penautan statis yang bergantung pada
cc_library
, output dari aturan library yang bergantung
adalah file .a
. Jika menentukan
alwayslink=True
, Anda akan mendapatkan file .lo
.
Nama file output sebenarnya adalah libfoo.so
untuk
library bersama, dengan foo adalah nama aturannya. Jenis
library lainnya masing-masing diakhiri 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
cc_*
.
Hal ini diberlakukan.
Untuk aturan cc_library
, header di hdrs
terdiri dari antarmuka publik library dan dapat disertakan secara langsung dari file dalam hdrs
dan srcs
library itu sendiri, serta dari file dalam hdrs
dan srcs
dari aturan cc_*
yang mencantumkan library dalam deps
.
Header di srcs
hanya boleh disertakan langsung dari file dalam hdrs
dan srcs
library itu sendiri. Saat memutuskan apakah akan menempatkan header ke hdrs
atau srcs
, Anda harus menanyakan apakah Anda ingin konsumen library ini dapat langsung menyertakannya. Ini kurang lebih sama dengan keputusan antara visibilitas public
dan private
dalam bahasa pemrograman.
Aturan cc_binary
dan cc_test
tidak memiliki antarmuka yang diekspor, sehingga keduanya juga tidak memiliki atribut hdrs
. Semua header
yang termasuk dalam biner atau pengujian secara langsung harus tercantum dalam
srcs
.
Untuk menggambarkan 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 menyertakan foo.h
dan bar.h
secara langsung, tetapi tidak baz.h
.
Menyertakan file | Penyertaan yang diizinkan |
---|---|
foo.h | bar.h |
foo.cc | {i>foo.h bar.h<i} |
bar.h | bar-impl.h baz.h |
baris-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. Dalam contoh di atas, foo.cc
diizinkan untuk menyertakan bar.h
, yang dapat menyertakan baz.h
, yang nantinya diizinkan untuk menyertakan baz-impl.h
. Secara teknis, kompilasi file .cc
dapat menyertakan file header apa pun di hdrs
atau srcs
secara transitif dalam setiap cc_library
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 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
Kami menggunakan tanda alwayslink
untuk memaksa linker agar tertaut dalam
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
.
Kami 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 diisi Nama unik untuk target ini. |
deps
|
Daftar label; defaultnya adalah Ini dapat berupa target Lihat komentar umum tentang Ini harus berupa nama aturan library C++.
Saat membuat biner yang menautkan library aturan ini,
Anda juga akan menautkan library di Terlepas dari nama "deps", tidak semua klien library ini berada di sini. Dependensi data runtime termasuk dalam Untuk menautkan dalam 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; defaultnya adalah Semua file File assembler murni (.s, .asm) tidak diproses sebelumnya dan biasanya dibuat menggunakan assembler. File assembly prapemrosesan (.S) telah diproses sebelumnya dan biasanya dibuat menggunakan compiler C/C++. File Semua file File Jika atribut
... dan aturan apa pun yang menghasilkan file tersebut (misalnya |
data
|
Daftar label; defaultnya 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; defaultnya adalah Ini adalah lokasi yang sangat disarankan untuk mendeklarasikan file header yang
mendeskripsikan antarmuka untuk library. Header ini akan disediakan untuk disertakan oleh sumber dalam aturan ini atau aturan dependen.
Header yang tidak dimaksudkan untuk disertakan oleh klien library ini harus
dicantumkan dalam atribut Jenis file |
additional_compiler_inputs
|
Daftar label; defaultnya adalah |
additional_linker_inputs
|
Daftar label; defaultnya adalah Misalnya, file .res Windows yang dikompilasi dapat disediakan di sini untuk disematkan dalam target biner. |
alwayslink
|
Boolean; defaultnya adalah srcs , meskipun beberapa biner 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 mendaftar untuk menerima beberapa callback yang disediakan oleh beberapa layanan.
Jika alwayslink tidak berfungsi dengan VS 2017 di Windows, itu karena masalah umum, upgrade VS 2017 Anda ke versi terbaru. |
copts
|
Daftar string; defaultnya adalah
Setiap string dalam atribut ini ditambahkan dalam urutan yang ditentukan ke
Jika paket mendeklarasikan fitur
|
defines
|
Daftar string; defaultnya adalah -D dan ditambahkan ke command line kompilasi ke target ini,
serta setiap aturan yang bergantung padanya. Hati-hati, karena hal ini
dapat berdampak luas. Jika ragu, tambahkan nilai definisi ke
local_defines .
|
hdrs_check
|
String; defaultnya adalah |
implementation_deps
|
Daftar label; defaultnya adalah deps , header dan jalur penyertaan library ini (dan semua
dependensi transitifnya) hanya digunakan untuk kompilasi library ini, bukan library yang
bergantung padanya. Library yang ditentukan dengan implementation_deps masih ditautkan dalam
target biner yang bergantung pada library ini.
Untuk saat ini, penggunaan dibatasi pada cc_libraries dan dilindungi oleh flag
|
include_prefix
|
String; defaultnya adalah Jika ditetapkan, header dalam atribut Awalan dalam atribut Atribut ini hanya sah menurut |
includes
|
Daftar string; defaultnya adalah -isystem path_to_package/include_entry .
Metode ini hanya boleh digunakan untuk library pihak ketiga yang tidak sesuai dengan gaya penulisan pernyataan #include dari Google.
Tidak seperti COPTS, flag ini ditambahkan untuk aturan ini dan setiap aturan yang bergantung padanya. (Catatan: bukan aturan yang menjadi dependensinya.) Hati-hati, karena hal ini mungkin memiliki jangkauan yang luas. Jika ragu, tambahkan
tanda "-I" ke COPTS.
Jalur |
linkopts
|
Daftar string; defaultnya 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 serupa:
atribut malloc
dari cc_binary ). Linkopt dependensi lebih diutamakan daripada linkopt dependen (yaitu, linkopt dependensi
muncul nanti di command line). Linkopt yang ditentukan dalam --linkopt lebih diutamakan daripada opsi penautan aturan.
Perlu diperhatikan bahwa atribut Selain itu, penting untuk diperhatikan bahwa opsi "-Wl,-soname" atau "-Xlinker -soname" tidak didukung dan tidak boleh ditentukan dalam atribut ini. File |
linkstamp
|
Label; defaultnya adalah base .
|
linkstatic
|
Boolean; defaultnya adalah cc_binary dan
cc_test : tautkan biner dalam mode
statis. Untuk cc_library.link_static : lihat di bawah.
Secara default, opsi ini aktif untuk
Jika diaktifkan dan ini adalah biner atau pengujian, opsi ini memberi tahu alat build untuk menautkan di
Sebenarnya ada tiga cara untuk menautkan {i>executable<i}:
Jika atribut
Atribut
Seharusnya sangat sedikit kode yang dibuat dengan |
local_defines
|
Daftar string; defaultnya adalah -D dan ditambahkan ke command line kompilasi untuk target ini,
tetapi tidak ke dependensinya.
|
module_interfaces
|
Daftar label; defaultnya adalah C++ Standard tidak memiliki batasan tentang ekstensi file antarmuka modul
Penggunaan dilindungi oleh flag
|
strip_include_prefix
|
String; defaultnya adalah Jika ditetapkan, header dalam atribut Jika jalur relatif, maka akan diambil sebagai jalur yang relatif terhadap paket. Jika nilainya absolut, maka akan dipahami sebagai jalur relatif repositori. Awalan dalam atribut Atribut ini hanya sah menurut |
textual_hdrs
|
Daftar label; defaultnya adalah Ini adalah lokasi untuk mendeklarasikan file header yang tidak dapat dikompilasi sendiri sehingga harus selalu disertakan secara tekstual oleh file sumber lain agar dapat membuat kode yang valid. |
win_def_file
|
Label; defaultnya adalah Atribut ini hanya boleh digunakan jika Windows adalah platform target. Library ini dapat digunakan untuk mengekspor simbol selama menautkan library bersama. |
cc_proto_library
Lihat sumber aturancc_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
menghasilkan kode C++ dari file .proto
.
deps
harus mengarah ke aturan proto_library
.
Contoh:
cc_library(
name = "lib",
deps = [":foo_cc_proto"],
)
cc_proto_library(
name = "foo_cc_proto",
deps = [":foo_proto"],
)
proto_library(
name = "foo_proto",
)
Argumen
Atribut | |
---|---|
name |
Nama; wajib diisi Nama unik untuk target ini. |
deps
|
Daftar label; defaultnya adalah proto_library
yang akan dibuatkan kode C++.
|
cc_shared_library
Lihat 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)
Layanan ini menghasilkan {i>shared library<i}.
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 ini, foo_shared
secara statis menautkan foo
dan baz
, yang kedua adalah dependensi transitif. Metode ini tidak menautkan bar
karena sudah disediakan secara dinamis oleh dynamic_dep
bar_shared
.
foo_shared
menggunakan file skrip penaut *.lds untuk mengontrol simbol mana yang harus diekspor. Logika aturan cc_shared_library
tidak
mengontrol simbol mana yang akan diekspor. Logika aturan tersebut hanya menggunakan simbol yang diasumsikan untuk
diekspor untuk memberikan error selama fase analisis jika dua library bersama mengekspor
target yang sama.
Setiap dependensi langsung cc_shared_library
dianggap telah diekspor. Oleh karena itu, selama analisis berlangsung, Bazel mengasumsikan bahwa foo
diekspor oleh foo_shared
. baz
tidak dianggap diekspor
oleh foo_shared
. Setiap target yang cocok dengan exports_filter
juga diasumsikan sebagai ekspor.
Setiap cc_library
dalam contoh akan muncul paling banyak dalam satu
cc_shared_library
. Jika ingin menautkan baz
juga ke
bar_shared
, kita perlu 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 digunakan 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
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
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, pengguna yang masih menautkannya harus mengekspor library agar yang tidak menautkannya tetap menjaga visibilitas ke simbol-simbolnya. Cara lain adalah dengan menarik library ketiga yang mengekspor target.
Cara ketiga adalah memberi tag penyebab cc_library
dengan LINKABLE_MORE_THAN_ONCE
,
tetapi perbaikan ini jarang terjadi dan Anda harus benar-benar memastikan bahwa
cc_library
benar-benar 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
ditautkan ke cc_shared_library
yang berbeda di dynamic_deps
dan tidak
diekspor.
Solusinya adalah dengan mengekspornya dari dependensi cc_shared_library
atau mengambil 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, varian tersebut tidak termasuk dalam deps
dari cc_shared_library
. Jika library dinamis yang telah dikompilasi sebelumnya ini merupakan dependensi dari salah satu
cc_libraries
, cc_library
harus bergantung padanya
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 memperbaiki masalah ini, hapus target dari deps
dan cukup andalkan dari dependensi
dinamis atau pastikan exports_filter
tidak menangkap target ini.
Argumen
Atribut | |
---|---|
name |
Nama; wajib diisi Nama unik untuk target ini. |
deps
|
Daftar label; defaultnya 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 setiap target yang tercantum dalam
Implementasi ini juga akan memicu error setiap kali library yang sama ditautkan secara statis ke lebih dari satu |
additional_linker_inputs
|
Daftar label; defaultnya adalah user_link_flags .
|
dynamic_deps
|
Daftar label; defaultnya adalah cc_shared_library lain yang menjadi dependensi target saat ini.
Implementasi |
experimental_disable_topo_sort_do_not_use_remove_before_7_0
|
Boolean; defaultnya adalah |
exports_filter
|
Daftar string; defaultnya adalah
Setiap target
Perlu diperhatikan bahwa atribut ini tidak benar-benar menambahkan edge dependensi ke target tersebut, tepi dependensi harus dibuat oleh Sintaksis berikut diizinkan:
|
roots
|
Daftar label; defaultnya adalah |
shared_lib_name
|
String; defaultnya adalah |
static_deps
|
Daftar string; defaultnya adalah |
user_link_flags
|
Daftar string; defaultnya adalah
|
win_def_file
|
Label; defaultnya adalah Atribut ini hanya boleh digunakan jika Windows adalah platform target. Library ini dapat digunakan untuk mengekspor simbol selama menautkan library bersama. |
cc_test
Lihat sumber aturancc_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)
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
.
Mungkin ada baiknya untuk memberikan komentar mengapa pengujian Anda memerlukan linkstatic
; hal ini mungkin tidak jelas.
Target output implisit
name.stripped
(hanya dibuat jika diminta secara eksplisit): Versi biner yang dihapus.strip -g
dijalankan pada biner untuk menghapus simbol debug. Opsi strip tambahan dapat diberikan pada command line menggunakan--stripopt=-foo
.name.dwp
(hanya dibuat jika diminta secara eksplisit): Jika Fission diaktifkan: file paket informasi debug yang cocok untuk men-debug biner yang di-deploy dari jarak jauh. Else: file kosong.
Lihat argumen cc_binary(), kecuali bahwa
argumen stamp
ditetapkan ke 0 secara default untuk pengujian dan
bahwa cc_test
memiliki
atribut tambahan yang umum digunakan untuk semua aturan pengujian (*_test).
Argumen
Atribut | |
---|---|
name |
Nama; wajib diisi Nama unik untuk target ini. |
deps
|
Daftar label; defaultnya adalah Tujuan ini dapat berupa target |
srcs
|
Daftar label; defaultnya adalah Semua file File assembler murni (.s, .asm) tidak diproses sebelumnya dan biasanya dibuat menggunakan assembler. File assembly prapemrosesan (.S) telah diproses sebelumnya dan biasanya dibuat menggunakan compiler C/C++. File Semua file File Jika atribut
... dan aturan apa pun yang menghasilkan file tersebut (misalnya |
data
|
Daftar label; defaultnya 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; defaultnya adalah Misalnya, file .res Windows yang dikompilasi dapat disediakan di sini untuk disematkan dalam target biner. |
copts
|
Daftar string; defaultnya adalah
Setiap string dalam atribut ini ditambahkan dalam urutan yang ditentukan ke
Jika paket mendeklarasikan fitur
|
defines
|
Daftar string; defaultnya adalah -D dan ditambahkan ke command line kompilasi ke target ini,
serta setiap aturan yang bergantung padanya. Hati-hati, karena hal ini
dapat berdampak luas. Jika ragu, tambahkan nilai definisi ke
local_defines .
|
dynamic_deps
|
Daftar label; defaultnya adalah cc_shared_library lain yang menjadi dependensi target saat ini.
Implementasi |
hdrs_check
|
String; defaultnya adalah |
includes
|
Daftar string; defaultnya adalah -isystem path_to_package/include_entry .
Metode ini hanya boleh digunakan untuk library pihak ketiga yang tidak sesuai dengan gaya penulisan pernyataan #include dari Google.
Tidak seperti COPTS, flag ini ditambahkan untuk aturan ini dan setiap aturan yang bergantung padanya. (Catatan: bukan aturan yang menjadi dependensinya.) Hati-hati, karena hal ini mungkin memiliki jangkauan yang luas. Jika ragu, tambahkan
tanda "-I" ke COPTS.
Jalur |
link_extra_lib
|
Label; defaultnya adalah
Secara default, biner C++ ditautkan dengan |
linkopts
|
Daftar string; defaultnya adalah LINKOPTS sebelum
menautkan target biner.
Setiap elemen daftar ini yang tidak diawali dengan |
linkshared
|
Boolean; defaultnya adalah linkshared=True dalam aturan Anda. Secara default,
opsi ini nonaktif.
Keberadaan tanda ini berarti penautan terjadi dengan tanda
Jika menentukan |
linkstatic
|
Boolean; defaultnya adalah cc_binary dan
cc_test : tautkan biner dalam mode
statis. Untuk cc_library.link_static : lihat di bawah.
Secara default, opsi ini aktif untuk
Jika diaktifkan dan ini adalah biner atau pengujian, opsi ini memberi tahu alat build untuk menautkan di
Sebenarnya ada tiga cara untuk menautkan {i>executable<i}:
Jika atribut
Atribut
Seharusnya sangat sedikit kode yang dibuat dengan |
local_defines
|
Daftar string; defaultnya adalah -D dan ditambahkan ke command line kompilasi untuk target ini,
tetapi tidak ke dependensinya.
|
malloc
|
Label; defaultnya adalah
Secara default, biner C++ ditautkan ke |
module_interfaces
|
Daftar label; defaultnya adalah C++ Standard tidak memiliki batasan tentang ekstensi file antarmuka modul
Penggunaan dilindungi oleh flag
|
nocopts
|
String; defaultnya adalah COPTS yang sudah ada dan cocok dengan ekspresi reguler ini (termasuk nilai yang secara eksplisit ditentukan dalam atribut copts aturan) akan dihapus dari COPTS untuk tujuan kompilasi aturan ini.
Atribut ini tidak boleh diperlukan atau digunakan
di luar third_party . Nilai tidak diproses sebelumnya
dengan cara apa pun selain substitusi variabel "Make".
|
reexport_deps
|
Daftar label; defaultnya adalah |
stamp
|
Bilangan bulat; defaultnya adalah
Biner yang distempel tidak dibangun ulang kecuali jika dependensinya berubah. |
win_def_file
|
Label; defaultnya adalah Atribut ini hanya boleh digunakan jika Windows adalah platform target. Library ini dapat digunakan untuk mengekspor simbol selama menautkan library bersama. |
cc_toolchain
Lihat 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 untuk menjalankan tindakan C++. Hal ini dilakukan dengan atribut seperti
all_files
,compiler_files
,linker_files
, atau atribut lain yang diakhiri dengan_files
). Ini adalah grup file yang paling sering 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 konfigurasi toolchain C++ yang rumit dan dokumentasi pemilihan toolchain.
Gunakan tags = ["manual"]
untuk mencegah toolchain dibangun dan dikonfigurasi
jika tidak perlu saat memanggil bazel build //...
Argumen
Atribut | |
---|---|
name |
Nama; wajib diisi Nama unik untuk target ini. |
all_files
|
Label; wajib diisi Koleksi semua artefak cc_toolchain. Artefak ini akan ditambahkan sebagai input ke semua tindakan terkait aturan_cc (kecuali tindakan yang menggunakan kumpulan artefak yang lebih presisi dari atribut di bawah). Bazel menganggapall_files adalah superset
dari semua atribut penyedia artefak lainnya (misalnya, kompilasi linkstamp memerlukan file kompilasi
dan link, sehingga memerlukan all_files ).
|
ar_files
|
Label; defaultnya adalah |
as_files
|
Label; defaultnya adalah |
compiler_files
|
Label; wajib diisi Koleksi semua artefak cc_ toolchain yang diperlukan untuk tindakan kompilasi. |
compiler_files_without_includes
|
Label; defaultnya adalah |
coverage_files
|
Label; defaultnya adalah |
dwp_files
|
Label; wajib diisi Koleksi semua artefak cc_toolchain yang diperlukan untuk tindakan dwp. |
dynamic_runtime_lib
|
Label; defaultnya adalah Ini akan digunakan saat fitur 'static_link_cpp_runtimes' diaktifkan, dan kita akan menautkan dependensi secara dinamis. |
exec_transition_for_inputs
|
Boolean; defaultnya adalah |
libc_top
|
Label; defaultnya adalah |
linker_files
|
Label; wajib diisi Koleksi semua artefak cc_ toolchain yang diperlukan untuk menautkan tindakan. |
module_map
|
Label; defaultnya adalah |
objcopy_files
|
Label; wajib diisi Koleksi semua artefak cc_toolchain yang diperlukan untuk tindakan objcopy. |
output_licenses
|
Daftar string; defaultnya adalah |
static_runtime_lib
|
Label; defaultnya adalah Ini akan digunakan saat fitur 'static_link_cpp_runtimes' diaktifkan, dan kita menautkan dependensi secara statis. |
strip_files
|
Label; wajib diisi Koleksi semua artefak cc_toolchain yang diperlukan untuk tindakan strip. |
supports_header_parsing
|
Boolean; defaultnya adalah |
supports_param_files
|
Boolean; defaultnya adalah |
toolchain_config
|
Label; wajib diisi Label aturan yang menyediakancc_toolchain_config_info .
|
toolchain_identifier
|
String; defaultnya adalah
Hingga masalah #5380 diperbaiki, ini adalah cara yang direkomendasikan untuk mengaitkan |
cc_toolchain_suite
Lihat sumber aturancc_toolchain_suite(name, compatible_with, deprecation, distribs, features, licenses, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)
Tidak digunakan lagi: aturan tidak dioperasikan dan akan dihapus.
Argumen
Atribut | |
---|---|
name |
Nama; wajib diisi Nama unik untuk target ini. |
fdo_prefetch_hints
Lihat 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)
Mewakili 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 diisi 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
Lihat 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)
Mewakili profil FDO yang ada di ruang kerja. Contoh:
fdo_profile(
name = "fdo",
profile = "//path/to/fdo:profile.zip",
)
Argumen
Atribut | |
---|---|
name |
Nama; wajib diisi Nama unik untuk target ini. |
memprof_profile
|
Label; defaultnya 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 terindeks, .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; defaultnya adalah |
memprof_profile
Lihat 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 diisi Nama unik untuk target ini. |
profile
|
Label; wajib diisi Label profil MEMPROF. Profil tersebut 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
Lihat 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)
Mewakili 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 diisi 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. |