Aturan
- cc_binary
- cc_import
- cc_library
- cc_proto_library
- cc_shared_library
- cc_static_library
- cc_test
- cc_toolchain
- cc_toolchain_suite
- fdo_prefetch_hints
- fdo_profile
- memprof_profile
- propeller_optimize
cc_binary
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
menjadi main
.
Target output implisit
name.stripped
(hanya dibuat jika diminta secara eksplisit): Hapus versi dari biner.strip -g
dijalankan pada biner untuk menghapus debug simbol. Opsi strip tambahan dapat diberikan pada baris perintah menggunakan--stripopt=-foo
.name.dwp
(hanya dibuat jika diminta secara eksplisit): Jika Fission diaktifkan: debug paket informasi yang cocok untuk men-debug biner yang di-deploy dari jarak jauh. Lainnya: file kosong.
Argumen
Atribut | |
---|---|
name |
Nama; wajib diisi Nama unik untuk target ini. |
deps
|
Daftar label; default adalah Dapat berupa |
srcs
|
Daftar label; default 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; default adalah data
pada Atribut umum didefinisikan oleh
sebagian besar aturan build.
Jika Jika Kode C++ Anda dapat mengakses file data ini seperti berikut:
|
additional_linker_inputs
|
Daftar label; default adalah Misalnya, file .res Windows yang dikompilasi dapat disediakan di sini untuk disematkan pada target biner. |
copts
|
Daftar {i>string<i}; default-nya adalah
Setiap string dalam atribut ini ditambahkan dalam urutan tertentu ke
Jika paket mendeklarasikan fitur
|
defines
|
Daftar {i>string<i}; default-nya adalah -D dan ditambahkan ke command line kompilasi ke target ini,
serta setiap aturan yang bergantung padanya. Hati-hati, karena
hal ini mungkin
berdampak luas. Jika ragu, tambahkan nilai {i>define <i}ke
local_defines saja.
|
dynamic_deps
|
Daftar label; default adalah cc_shared_library lain yang menjadi dependensi target saat ini.
Implementasi |
hdrs_check
|
String; default-nya adalah |
includes
|
Daftar {i>string<i}; default-nya adalah -isystem path_to_package/include_entry .
Fungsi ini hanya boleh digunakan untuk
library pihak ketiga yang
tidak sesuai dengan gaya penulisan pernyataan #include Google.
Tidak seperti COPTS, tanda ini ditambahkan untuk aturan ini
dan setiap aturan yang bergantung padanya. (Catatan: bukan aturan yang menjadi dependensinya.) Membuat
sangat berhati-hati, karena hal ini
dapat menimbulkan jangkauan luas. Jika ragu, tambahkan
"-Saya" flag ke COPTS.
Jalur |
link_extra_lib
|
Label; default adalah
Secara default, biner C++ ditautkan ke |
linkopts
|
Daftar {i>string<i}; default-nya adalah LINKOPTS sebelum
menautkan target biner.
Setiap elemen daftar ini yang tidak diawali dengan |
linkshared
|
Boolean; default-nya adalah linkshared=True dalam aturan Anda. Secara default
opsi ini nonaktif.
Adanya tanda ini berarti penautan terjadi dengan tanda
Jika Anda menentukan |
linkstatic
|
Boolean; default-nya adalah cc_binary dan
cc_test : menautkan biner secara statis
mode. 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
Sebenarnya ada tiga cara untuk menautkan {i>executable<i}:
Jika atribut
Atribut
Seharusnya sangat sedikit kode yang dibuat dengan |
local_defines
|
Daftar {i>string<i}; default-nya adalah -D dan ditambahkan ke command line kompilasi untuk target ini,
tetapi tidak kepada tanggungannya.
|
malloc
|
Label; default adalah
Secara default, biner C++ ditautkan ke |
module_interfaces
|
Daftar label; default adalah C++ Standard tidak memiliki batasan tentang ekstensi file antarmuka modul
Penggunaan 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 kompilasi aturan ini.
Atribut ini tidak boleh diperlukan atau digunakan
di luar third_party . Nilai tidak diproses sebelumnya
dengan cara apa pun selain "Membuat" substitusi variabel.
|
reexport_deps
|
Daftar label; default adalah |
stamp
|
{i>Integer<i} (Bilangan bulat): default-nya adalah
Biner yang distempel tidak dibangun ulang kecuali jika dependensinya berubah. |
win_def_file
|
Label; default adalah Atribut ini hanya boleh digunakan jika Windows adalah platform target. Template ini dapat digunakan untuk ekspor simbol selama menautkan galeri foto 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:
Akun Layanan 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
Pada 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
Pada 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
Pada 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; default adalah deps
pada Atribut umum didefinisikan oleh
sebagian besar aturan build.
|
hdrs
|
Daftar label; default 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 {i>string<i}; default-nya adalah -isystem path_to_package/include_entry .
Fungsi ini hanya boleh digunakan untuk
library pihak ketiga yang
tidak sesuai dengan gaya penulisan pernyataan #include Google.
Tidak seperti COPTS, tanda ini ditambahkan untuk aturan ini
dan setiap aturan yang bergantung padanya. (Catatan: bukan aturan yang menjadi dependensinya.) Membuat
sangat berhati-hati, karena hal ini
dapat menimbulkan jangkauan luas. Jika ragu, tambahkan
"-Saya" flag ke COPTS.
Jalur |
interface_library
|
Label; default adalah Jenis file yang diizinkan:
|
linkopts
|
Daftar {i>string<i}; default-nya adalah LINKOPTS sebelum
menautkan target biner.
Setiap elemen daftar ini yang tidak diawali dengan |
objects
|
Daftar label; default adalah |
pic_objects
|
Daftar label; default adalah |
pic_static_library
|
Label; default adalah |
shared_library
|
Label; default adalah Jenis file yang diizinkan:
|
static_library
|
Label; default adalah Jenis file yang diizinkan:
|
system_provided
|
Boolean; default-nya 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
, tergantung apa yang diperlukan.
Jika Anda membuat sesuatu dengan
tautan statis yang bergantung pada
cc_library
, output dari aturan library yang bergantung
adalah file .a
. Jika Anda menentukan
alwayslink=True
, Anda akan mendapatkan file .lo
.
Nama file output sebenarnya adalah libfoo.so
untuk
pustaka bersama, dengan foo adalah nama aturannya. Tujuan
jenis library lain yang diakhiri dengan .lo
dan .a
,
secara berurutan. Jika Anda memerlukan nama pustaka
bersama tertentu, untuk
untuk menentukan modul Python, gunakan genrule untuk menyalin library
sesuai nama yang diinginkan.
Pemeriksaan penyertaan header
Semua file header yang digunakan dalam build harus dideklarasikan di
hdrs
atau srcs
dari aturan cc_*
.
Hal ini diberlakukan.
Untuk aturan cc_library
, header di hdrs
terdiri dari
antarmuka publik perpustakaan dan
dapat langsung disertakan baik
dari file dalam hdrs
dan srcs
library
itu sendiri serta dari file dalam hdrs
dan srcs
dari cc_*
aturan yang mencantumkan library di deps
.
Header di srcs
hanya boleh disertakan langsung dari file
dalam hdrs
dan srcs
library itu sendiri. Kapan
memutuskan apakah akan menempatkan header ke hdrs
atau srcs
,
Anda harus bertanya apakah Anda ingin
konsumen perpustakaan ini dapat
langsung menyertakannya. Ini kurang lebih merupakan
keputusan yang sama dengan
antara visibilitas public
dan private
dalam bahasa pemrograman.
Aturan cc_binary
dan cc_test
tidak memiliki ekspor
antarmuka, sehingga juga tidak memiliki atribut hdrs
. Semua header
milik biner atau tes 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 langsung
menyertakan foo.h
dan bar.h
, 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 langsung
penyertaan/penyertaan. Dalam contoh di atas, foo.cc
diizinkan untuk
menyertakan bar.h
, yang mungkin mencakup baz.h
, yang dalam
belokan diizinkan menyertakan baz-impl.h
. Secara teknis,
kompilasi file .cc
dapat menyertakan header apa pun secara transitif
file di hdrs
atau srcs
di
cc_library
apa pun dalam penutupan deps
transitif. Di beberapa
dalam hal ini, compiler dapat membaca baz.h
dan baz-impl.h
saat mengompilasi foo.cc
, namun foo.cc
tidak boleh
berisi #include "baz.h"
. Agar dapat
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
features
dari parameter
Fungsi package
. Toolchain
yang disediakan oleh Bazel hanya mendukung fitur ini dengan {i>clang<i} di Unix dan macOS.
Contoh
Kami menggunakan tanda alwayslink
untuk memaksa penaut untuk 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
satu lagi, library dinamis), jadi
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; default adalah Ini dapat berupa target Lihat komentar umum tentang Ini harus berupa nama aturan library C++.
Saat Anda membuat biner yang menautkan library aturan ini,
Anda juga akan menautkan library di Meskipun ada "dependensi" tidak semua klien library ini
berada di sini. Dependensi data runtime termasuk dalam Untuk menautkan ke library pihak ketiga yang telah dikompilasi sebelumnya, tambahkan namanya ke
Untuk bergantung pada sesuatu tanpa menautkannya ke library ini, tambahkan
menjadi |
srcs
|
Daftar label; default 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; default adalah data
pada Atribut umum didefinisikan oleh
sebagian besar aturan build.
Jika Jika Kode C++ Anda dapat mengakses file data ini seperti berikut:
|
hdrs
|
Daftar label; default adalah Ini adalah lokasi yang sangat disukai untuk mendeklarasikan file {i>header<i} yang
menjelaskan antarmuka {i>library<i}. {i>Header<i} ini akan dibuat
tersedia untuk disertakan oleh sumber dalam aturan ini atau aturan dependen.
Header yang tidak dimaksudkan untuk disertakan oleh klien library ini harus
tercantum dalam atribut
|
additional_compiler_inputs
|
Daftar label; default adalah |
additional_linker_inputs
|
Daftar label; default adalah Misalnya, file .res Windows yang dikompilasi dapat disediakan di sini untuk disematkan pada target biner. |
alwayslink
|
Boolean; default-nya adalah srcs , meskipun beberapa di antaranya tidak berisi simbol yang dirujuk oleh biner.
Fungsi ini berguna jika kode Anda tidak secara eksplisit dipanggil oleh kode di
biner, misalnya, jika kode Anda mendaftar 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. |
copts
|
Daftar {i>string<i}; default-nya adalah
Setiap string dalam atribut ini ditambahkan dalam urutan tertentu ke
Jika paket mendeklarasikan fitur
|
defines
|
Daftar {i>string<i}; default-nya adalah -D dan ditambahkan ke command line kompilasi ke target ini,
serta setiap aturan yang bergantung padanya. Hati-hati, karena
hal ini mungkin
berdampak luas. Jika ragu, tambahkan nilai {i>define <i}ke
local_defines saja.
|
hdrs_check
|
String; default-nya adalah |
implementation_deps
|
Daftar label; default adalah deps , header dan sertakan jalur library ini (dan semua
dependensi transitif) hanya digunakan untuk kompilasi library ini, bukan library yang
yang bergantung pada {i>database.<i} Library yang ditentukan dengan implementation_deps masih ditautkan
target biner yang bergantung pada library ini.
Untuk saat ini, penggunaan dibatasi pada cc_libraries dan dilindungi oleh tanda
|
include_prefix
|
String; default-nya adalah Jika ditetapkan, header di atribut Awalan dalam atribut Atribut ini hanya sah menurut |
includes
|
Daftar {i>string<i}; default-nya adalah -isystem path_to_package/include_entry .
Fungsi ini hanya boleh digunakan untuk
library pihak ketiga yang
tidak sesuai dengan gaya penulisan pernyataan #include Google.
Tidak seperti COPTS, tanda ini ditambahkan untuk aturan ini
dan setiap aturan yang bergantung padanya. (Catatan: bukan aturan yang menjadi dependensinya.) Membuat
sangat berhati-hati, karena hal ini
dapat menimbulkan jangkauan luas. Jika ragu, tambahkan
"-Saya" flag ke COPTS.
Jalur |
linkopts
|
Daftar {i>string<i}; default-nya adalah cc_binary.linkopts .
Atribut linkopts juga diterapkan ke setiap target yang
bergantung, secara langsung atau tidak langsung, pada library ini melalui deps
(atau melalui atribut lain yang diperlakukan serupa:
malloc
dari cc_binary ). Ketergantungan
linkopts lebih diutamakan daripada linkopt dependen (yaitu, linkopt dependensi
akan muncul kemudian
di baris perintah). Linkopt yang ditentukan di
--linkopt
lebih diutamakan daripada opsi penautan aturan.
Perlu diperhatikan bahwa atribut Juga, penting untuk dicatat bahwa "-Wl,-soname" atau "-Xlinker -soname" opsi tidak didukung dan tidak boleh ditentukan dalam atribut ini. File |
linkstamp
|
Label; default adalah base .
|
linkstatic
|
Boolean; default-nya adalah cc_binary dan
cc_test : menautkan biner secara statis
mode. 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
Sebenarnya ada tiga cara untuk menautkan {i>executable<i}:
Jika atribut
Atribut
Seharusnya sangat sedikit kode yang dibuat dengan |
local_defines
|
Daftar {i>string<i}; default-nya adalah -D dan ditambahkan ke command line kompilasi untuk target ini,
tetapi tidak kepada tanggungannya.
|
module_interfaces
|
Daftar label; default adalah C++ Standard tidak memiliki batasan tentang ekstensi file antarmuka modul
Penggunaan dilindungi oleh flag
|
strip_include_prefix
|
String; default-nya adalah Jika ditetapkan, header di atribut Jika jalur relatif, maka akan diambil sebagai jalur yang relatif terhadap paket. Jika nilai itu adalah mutlak, itu dipahami sebagai jalur relatif repositori. Awalan dalam atribut Atribut ini hanya sah menurut |
textual_hdrs
|
Daftar label; default adalah Ini adalah lokasi untuk mendeklarasikan file {i>header<i} yang tidak dapat dikompilasi sendiri; yaitu, mereka selalu perlu disertakan secara tekstual oleh file sumber lain untuk membuat pada kode sumber. |
win_def_file
|
Label; default adalah Atribut ini hanya boleh digunakan jika Windows adalah platform target. Template ini dapat digunakan untuk ekspor simbol selama menautkan galeri foto 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; default adalah proto_library
aturan untuk menghasilkan 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
menautkan foo
secara statis
dan baz
, yang kedua adalah dependensi transitif. Tidak
tautkan bar
karena sudah disediakan secara dinamis oleh
dynamic_dep
bar_shared
.
foo_shared
menggunakan file skrip penaut *.lds untuk mengontrol
semua simbol harus diekspor. Logika aturan cc_shared_library
melakukan
tidak mengontrol simbol mana yang diekspor, itu hanya menggunakan apa yang diasumsikan
diekspor untuk memberikan kesalahan selama fase analisis jika dua {i>shared library<i} mengekspor
target yang sama.
Setiap dependensi langsung dari cc_shared_library
diasumsikan
diekspor. Oleh karena itu, selama analisis berlangsung, Bazel berasumsi bahwa foo
diekspor oleh foo_shared
. baz
tidak dianggap diekspor
paling lambat foo_shared
. Setiap target yang cocok dengan exports_filter
juga diasumsikan sebagai ekspor.
Setiap cc_library
dalam contoh harus muncul paling banyak dalam satu
cc_shared_library
. Jika kita ingin menautkan baz
juga ke
bar_shared
kita perlu menambahkan
tags = ["LINKABLE_MORE_THAN_ONCE"]
sampai baz
.
Karena atribut shared_lib_name
, file yang dihasilkan oleh
bar_shared
akan memiliki nama bar.so
, bukan
dengan 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 jenis
Dependensi cc_shared_library
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 menghubungkan {i>library<i} ke salah satu
Dependensi cc_shared_library
. Pada saat yang sama, parameter
yang masih menautkannya
perlu mengekspor library agar library yang tidak menautkannya tetap dapat dilihat
simbol-simbol tersebut. Cara lain adalah dengan menarik library ketiga yang mengekspor target.
Cara ketiga adalah memberi tag cc_library
penyebab masalah 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
ditautkan ke cc_shared_library
yang berbeda di dynamic_deps
dan tidak
diekspor.
Solusinya adalah dengan mengekspornya dari dependensi cc_shared_library
atau menariknya
cc_shared_library
ketiga yang mengekspornya.
Do not place libraries which only contain a precompiled dynamic library in deps.
Jika Anda memiliki pustaka dinamis yang telah dikompilasi sebelumnya, hal ini tidak perlu dan tidak boleh
ditautkan secara statis ke target cc_shared_library
saat ini yang Anda
yang sedang dibuat. Oleh karena itu, file ini tidak termasuk dalam deps
cc_shared_library
. Jika library dinamis yang dikompilasi sebelumnya ini merupakan dependensi
dari cc_libraries
, maka 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 memperbaikinya, hapus target dari deps
dan cukup andalkan dari objek
dependensi atau memastikan bahwa exports_filter
tidak menangkap target ini.
Argumen
Atribut | |
---|---|
name |
Nama; wajib diisi Nama unik untuk target ini. |
deps
|
Daftar label; default adalah
Setiap dependensi library transitif dari dependensi langsung ini akan ditautkan ke
library selama belum ditautkan oleh
Selama analisis, penerapan aturan akan mempertimbangkan target apa pun yang tercantum dalam
Implementasi ini juga akan memicu error setiap kali library yang sama ditautkan secara statis
menjadi lebih dari satu |
additional_linker_inputs
|
Daftar label; default adalah user_link_flags .
|
dynamic_deps
|
Daftar label; default 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 {i>string<i}; default-nya adalah
Setiap target
Perhatikan, atribut ini tidak benar-benar menambahkan edge dependensi ke target tersebut,
edge dependensi seharusnya dibuat oleh Sintaksis berikut diizinkan:
|
roots
|
Daftar label; default adalah |
shared_lib_name
|
String; default-nya adalah |
static_deps
|
Daftar {i>string<i}; default-nya adalah |
user_link_flags
|
Daftar {i>string<i}; default-nya adalah
|
win_def_file
|
Label; default adalah Atribut ini hanya boleh digunakan jika Windows adalah platform target. Template ini dapat digunakan untuk ekspor simbol selama menautkan galeri foto bersama. |
cc_static_library
Lihat 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)Menghasilkan library statis dari daftar target dan dependensi transitifnya.
Pustaka statis yang dihasilkan berisi file objek dari target yang tercantum di
deps
serta dependensi transitifnya, dengan preferensi diberikan pada
PIC
objek.
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 mengharuskan library ini tersedia pada waktu penautan.
linkopts
File teks yang berisi linkopts
yang diberikan pengguna untuk semua transitif
dependensi target yang tercantum di deps
.
Simbol duplikat
Secara default, aturan cc_static_library
memeriksa apakah properti statis yang dihasilkan
library ini tidak berisi simbol duplikat. Jika ya, build akan gagal dengan error
yang mencantumkan simbol duplikat dan file objek yang memuat simbol tersebut.
Pemeriksaan ini dapat dinonaktifkan per target atau per paket dengan menyetel
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
symbol_check
di semua platform. Toolchain kustom dapat menambahkan dukungan untuk
dengan salah satu dari dua cara berikut:
- Mengimplementasikan tindakan
ACTION_NAMES.validate_static_library
dan mengaktifkannya dengan fitursymbol_check
. Set alat dalam aksi adalah dipanggil dengan dua argumen, pustaka statis untuk memeriksa simbol duplikat dan jalur file yang harus dibuat jika pemeriksaan lulus. - Memiliki fitur
symbol_check
akan menambahkan tanda pengarsip yang menyebabkan tindakan yang membuat {i>library <i}statis agar gagal pada simbol duplikat.
Argumen
Atribut | |
---|---|
name |
Nama; wajib diisi Nama unik untuk target ini. |
deps
|
Daftar label; default adalah Dependensi yang tidak menyediakan file objek apa pun tidak termasuk dalam konfigurasi
{i>library<i}, tetapi label mereka dikumpulkan
dalam file yang disediakan oleh
|
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, tes
adalah {i>wrapper<i} biner
untuk beberapa kode pengujian.
Secara default, pengujian C++ ditautkan secara dinamis.
Untuk menautkan pengujian unit secara statis, tentukan
linkstatic=True
.
Mungkin akan lebih baik untuk berkomentar tentang
mengapa pengujian Anda membutuhkan
linkstatic
; hal ini mungkin tidak terlihat jelas.
Target output implisit
name.stripped
(hanya dibuat jika diminta secara eksplisit): Hapus versi dari biner.strip -g
dijalankan pada biner untuk menghapus debug simbol. Opsi strip tambahan dapat diberikan pada baris perintah menggunakan--stripopt=-foo
.name.dwp
(hanya dibuat jika diminta secara eksplisit): Jika Fission diaktifkan: debug paket informasi yang cocok untuk men-debug biner yang di-deploy dari jarak jauh. Lainnya: file kosong.
Lihat argumen cc_binary(), dengan pengecualian
argumen stamp
diatur ke 0 secara {i>default<i} untuk pengujian dan
bahwa cc_test
memiliki tambahan
atribut yang umum untuk semua aturan pengujian (*_test).
Argumen
Atribut | |
---|---|
name |
Nama; wajib diisi Nama unik untuk target ini. |
deps
|
Daftar label; default adalah Dapat berupa |
srcs
|
Daftar label; default 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; default adalah data
pada Atribut umum didefinisikan oleh
sebagian besar aturan build.
Jika Jika Kode C++ Anda dapat mengakses file data ini seperti berikut:
|
additional_linker_inputs
|
Daftar label; default adalah Misalnya, file .res Windows yang dikompilasi dapat disediakan di sini untuk disematkan pada target biner. |
copts
|
Daftar {i>string<i}; default-nya adalah
Setiap string dalam atribut ini ditambahkan dalam urutan tertentu ke
Jika paket mendeklarasikan fitur
|
defines
|
Daftar {i>string<i}; default-nya adalah -D dan ditambahkan ke command line kompilasi ke target ini,
serta setiap aturan yang bergantung padanya. Hati-hati, karena
hal ini mungkin
berdampak luas. Jika ragu, tambahkan nilai {i>define <i}ke
local_defines saja.
|
dynamic_deps
|
Daftar label; default adalah cc_shared_library lain yang menjadi dependensi target saat ini.
Implementasi |
hdrs_check
|
String; default-nya adalah |
includes
|
Daftar {i>string<i}; default-nya adalah -isystem path_to_package/include_entry .
Fungsi ini hanya boleh digunakan untuk
library pihak ketiga yang
tidak sesuai dengan gaya penulisan pernyataan #include Google.
Tidak seperti COPTS, tanda ini ditambahkan untuk aturan ini
dan setiap aturan yang bergantung padanya. (Catatan: bukan aturan yang menjadi dependensinya.) Membuat
sangat berhati-hati, karena hal ini
dapat menimbulkan jangkauan luas. Jika ragu, tambahkan
"-Saya" flag ke COPTS.
Jalur |
link_extra_lib
|
Label; default adalah
Secara default, biner C++ ditautkan ke |
linkopts
|
Daftar {i>string<i}; default-nya adalah LINKOPTS sebelum
menautkan target biner.
Setiap elemen daftar ini yang tidak diawali dengan |
linkshared
|
Boolean; default-nya adalah linkshared=True dalam aturan Anda. Secara default
opsi ini nonaktif.
Adanya tanda ini berarti penautan terjadi dengan tanda
Jika Anda menentukan |
linkstatic
|
Boolean; default-nya adalah cc_binary dan
cc_test : menautkan biner secara statis
mode. 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
Sebenarnya ada tiga cara untuk menautkan {i>executable<i}:
Jika atribut
Atribut
Seharusnya sangat sedikit kode yang dibuat dengan |
local_defines
|
Daftar {i>string<i}; default-nya adalah -D dan ditambahkan ke command line kompilasi untuk target ini,
tetapi tidak kepada tanggungannya.
|
malloc
|
Label; default adalah
Secara default, biner C++ ditautkan ke |
module_interfaces
|
Daftar label; default adalah C++ Standard tidak memiliki batasan tentang ekstensi file antarmuka modul
Penggunaan 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 kompilasi aturan ini.
Atribut ini tidak boleh diperlukan atau digunakan
di luar third_party . Nilai tidak diproses sebelumnya
dengan cara apa pun selain "Membuat" substitusi variabel.
|
reexport_deps
|
Daftar label; default adalah |
stamp
|
{i>Integer<i} (Bilangan bulat): default-nya adalah
Biner yang distempel tidak dibangun ulang kecuali jika dependensinya berubah. |
win_def_file
|
Label; default adalah Atribut ini hanya boleh digunakan jika Windows adalah platform target. Template ini dapat digunakan untuk ekspor simbol selama menautkan galeri foto 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
seperti
all_files
,compiler_files
,linker_files
, atau atribut lainnya yang diakhiri dengan_files
). Berikut adalah paling sering {i>filegroup<i} menggabungkan semua file yang diperlukan. -
Membuat command line yang benar untuk tindakan C++. Hal ini dilakukan dengan
Penyedia
CcToolchainConfigInfo
(detail di bawah).
Gunakan atribut toolchain_config
untuk mengonfigurasi toolchain C++.
Lihat juga ini
halaman
untuk konfigurasi toolchain C++ dan dokumentasi pemilihan toolchain yang rumit.
Menggunakan tags = ["manual"]
untuk mencegah toolchain dibuat dan dikonfigurasi
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 rules_cc (kecuali tindakan yang menggunakan kumpulan artefak dari atribut di bawah). Bazel menganggapall_files adalah superset
dari semua atribut penyedia artefak lainnya (mis., kompilasi linkstamp membutuhkan kompilasi
dan menautkan file, sehingga memerlukan all_files ).
Itulah isi |
ar_files
|
Label; default adalah |
as_files
|
Label; default adalah |
compiler_files
|
Label; wajib diisi Koleksi semua artefak cc_toolchain yang diperlukan untuk tindakan kompilasi. |
compiler_files_without_includes
|
Label; default adalah |
coverage_files
|
Label; default adalah |
dwp_files
|
Label; wajib diisi Koleksi semua artefak cc_toolchain yang diperlukan untuk tindakan dwp. |
dynamic_runtime_lib
|
Label; default adalah Ini akan digunakan saat 'static_link_cpp_runtimes' diaktifkan, dan kami menautkan dependensi secara dinamis. |
exec_transition_for_inputs
|
Boolean; default-nya adalah |
libc_top
|
Label; default adalah |
linker_files
|
Label; wajib diisi Koleksi semua artefak cc_ toolchain yang diperlukan untuk menautkan tindakan. |
module_map
|
Label; default adalah |
objcopy_files
|
Label; wajib diisi Koleksi semua artefak cc_toolchain yang diperlukan untuk tindakan objcopy. |
output_licenses
|
Daftar {i>string<i}; default-nya adalah |
static_runtime_lib
|
Label; default adalah Ini akan digunakan saat 'static_link_cpp_runtimes' diaktifkan, dan kami menautkan dependensi secara statis. |
strip_files
|
Label; wajib diisi Koleksi 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
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; default 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 LLVM yang diindeks {i>.zip<i} yang menyimpan profil profraw LLVM, .afdo untuk profil AutoFDO, {i>.xfdo<i} untuk Profil XBinary. Label juga dapat mengarah ke aturan fdo_absolute_path_profile. |
proto_profile
|
Label; default 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 ini diharapkan memiliki baik ekstensi .profdata (untuk memprof terindeks/disimbolkan profil), atau ekstensi .zip untuk {i>zipfile<i} yang berisi 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 {i> .txt<i}. |
ld_profile
|
Label; wajib diisi Label profil yang diteruskan ke tindakan penautan. File ini memiliki ekstensi {i> .txt<i}. |