Ringkasan
Untuk memanggil kompilator dengan pilihan yang tepat, Bazel perlu memahami internal kompiler, seperti menyertakan direktori {i>include<i} dan penanda penting. Dengan kata lain, Bazel membutuhkan model {i>compiler<i} yang disederhanakan untuk memahami pekerjaan.
Bazel perlu mengetahui hal berikut:
- Apakah compiler mendukung thinLTO, modul, penautan dinamis, atau PIC (kode independen posisi).
- Jalur ke alat yang diperlukan seperti gcc, ld, ar, objcopy, dan sebagainya.
- Sistem bawaan termasuk direktori. Bazel membutuhkannya
untuk memvalidasi bahwa
semua {i>header<i} yang disertakan dalam file sumber dideklarasikan dengan benar di
file
BUILD
. - Sysroot default.
- Flag yang akan digunakan untuk kompilasi, penautan, dan pengarsipan.
- Flag yang akan digunakan untuk mode kompilasi yang didukung (opt, dbg, fastbuild).
- Membuat variabel yang secara khusus diperlukan oleh compiler.
Jika compiler memiliki dukungan untuk beberapa arsitektur, Bazel perlu mengonfigurasi mereka secara terpisah.
CcToolchainConfigInfo
adalah penyedia yang menyediakan tingkat
perincian untuk mengkonfigurasi
perilaku aturan C++ Bazel. Secara {i>default<i},
Bazel otomatis mengonfigurasi CcToolchainConfigInfo
untuk build Anda, tetapi Anda
memiliki opsi untuk mengonfigurasinya secara manual. Untuk itu, Anda memerlukan aturan Starlark
yang menyediakan CcToolchainConfigInfo
dan Anda perlu mengarahkan
toolchain_config
dari cc_toolchain
ke aturan Anda.
Anda dapat membuat CcToolchainConfigInfo
dengan memanggil
cc_common.create_cc_toolchain_config_info()
.
Anda dapat menemukan konstruktor Starlark untuk
semua struct yang diperlukan dalam proses ini
@rules_cc//cc:cc_toolchain_config_lib.bzl
Ketika target C++ memasuki fase analisis, Bazel akan memilih
target cc_toolchain
berdasarkan file BUILD
, dan mendapatkan
CcToolchainConfigInfo
dari target yang ditentukan dalam
Atribut cc_toolchain.toolchain_config
. Target cc_toolchain
meneruskan informasi ini ke target C++ melalui CcToolchainProvider
.
Misalnya, tindakan kompilasi atau link, yang dibuat instance-nya oleh aturan seperti
cc_binary
atau cc_library
, memerlukan informasi berikut:
- Compiler atau linker yang akan digunakan
- Tanda command line untuk compiler/linker
- Tanda konfigurasi yang diteruskan melalui opsi
--copt/--linkopt
- Variabel lingkungan
- Artefak yang diperlukan di sandbox tempat tindakan dijalankan
Semua informasi di atas kecuali artefak yang
diperlukan dalam {i>sandbox <i}adalah
yang ditentukan dalam target Starlark yang ditunjuk cc_toolchain
.
Artefak yang akan dikirim ke sandbox dideklarasikan di cc_toolchain
target. Misalnya, dengan atribut cc_toolchain.linker_files
, Anda dapat
menentukan library biner penaut dan toolchain yang akan dikirimkan ke sandbox.
Pemilihan toolchain
Logika pemilihan toolchain beroperasi sebagai berikut:
Pengguna menentukan target
cc_toolchain_suite
dalam fileBUILD
dan titik Bazel ke target menggunakan Opsi--crosstool_top
.Target
cc_toolchain_suite
merujuk ke beberapa toolchain. Tujuan nilai flag--cpu
dan--compiler
menentukan toolchain dipilih, baik hanya berdasarkan nilai flag--cpu
, atau berdasarkan nilai--cpu | --compiler
gabungan. Proses seleksi adalah sebagai berikut ini:Jika opsi
--compiler
ditentukan, Bazel akan memilih entri yang sesuai daricc_toolchain_suite.toolchains
dengan--cpu | --compiler
. Jika Bazel tidak menemukan entri yang sesuai, akan muncul error.Jika opsi
--compiler
tidak ditentukan, Bazel akan memilih entri yang sesuai daricc_toolchain_suite.toolchains
hanya dengan--cpu
.Jika tidak ada tanda yang ditentukan, Bazel akan memeriksa sistem {i>host<i} dan memilih
--cpu
berdasarkan temuannya. Lihat kode mekanisme pemeriksaan.
Setelah toolchain dipilih, feature
dan action_config
yang sesuai
dalam aturan Starlark mengatur konfigurasi build (yaitu,
item yang akan dijelaskan kemudian). Pesan ini memungkinkan implementasi
fitur C++ yang berkembang penuh
pada Bazel tanpa memodifikasi
Biner bazel. Aturan C++ mendukung beberapa tindakan unik yang didokumentasikan secara mendetail
dalam kode sumber Bazel.
Fitur
Fitur adalah entitas yang
membutuhkan penanda command line, tindakan,
pada lingkungan eksekusi, atau perubahan dependensi. Sebuah fitur
dapat berupa sesuatu yang sederhana seperti mengizinkan
file BUILD
untuk memilih konfigurasi
flag, seperti treat_warnings_as_errors
, atau berinteraksi dengan aturan C++ dan
menyertakan tindakan dan input kompilasi baru ke kompilasi, seperti
header_modules
atau thin_lto
.
Idealnya, CcToolchainConfigInfo
berisi daftar fitur, di mana masing-masing
fitur terdiri dari satu atau beberapa grup tanda, masing-masing menentukan daftar tanda
yang berlaku untuk tindakan Bazel tertentu.
Fitur ditentukan berdasarkan nama, yang memungkinkan pemisahan penuh Starlark
konfigurasi aturan dari rilis Bazel. Dengan kata lain, rilis Bazel tidak
memengaruhi perilaku konfigurasi CcToolchainConfigInfo
, asalkan konfigurasi tersebut
tidak memerlukan penggunaan fitur baru.
Fitur diaktifkan dengan salah satu cara berikut:
- Kolom
enabled
fitur ditetapkan ketrue
. - Bazel atau pemilik aturan secara eksplisit mengaktifkannya.
- Pengguna mengaktifkannya melalui opsi Bazel
--feature
atau aturanfeatures
.
Fitur dapat memiliki interdependensi, bergantung pada tanda command line, file BUILD
pengaturan, dan variabel lainnya.
Hubungan fitur
Dependensi biasanya dikelola langsung dengan Bazel, yang hanya memberlakukan persyaratan dan mengelola konflik yang intrinsik dengan sifat fitur yang ditentukan dalam build. Spesifikasi toolchain memungkinkan batasan untuk penggunaan langsung dalam aturan Starlark yang mengatur fitur dukungan dan ekspansi. Karakter pengganti ini meliputi:
Batasan | Deskripsi |
requires = [ feature_set (features = [ 'feature-name-1', 'feature-name-2' ]), ] |
Tingkat fitur. Fitur ini hanya didukung jika persyaratan yang ditentukan
diaktifkan. Misalnya, jika suatu fitur hanya didukung di
mode build tertentu (opt , dbg , atau
fastbuild ). Jika `memerlukan` berisi beberapa `feature_set`
fitur didukung jika salah satu `feature_set`terpenuhi
(jika semua fitur yang ditentukan diaktifkan).
|
implies = ['feature'] |
Tingkat fitur. Fitur ini menyiratkan fitur yang ditetapkan. Mengaktifkan fitur juga secara implisit mengaktifkan semua fitur yang tersirat olehnya (yaitu, berfungsi secara rekursif). Juga memberikan kemampuan untuk memfaktorkan {i>subset<i} umum fungsi dari sekumpulan fitur, seperti komponen umum pembersih air. Tersirat fitur tidak dapat dinonaktifkan. |
provides = ['feature'] |
Tingkat fitur. Menunjukkan bahwa fitur ini adalah salah satu dari beberapa
fitur alternatif eksklusif. Misalnya, semua {i>
sanitizer<i} bisa
menentukan Hal ini memperbaiki penanganan kesalahan dengan mencantumkan alternatif jika pengguna meminta untuk dua atau beberapa fitur yang saling eksklusif sekaligus. |
with_features = [ with_feature_set( features = ['feature-1'], not_features = ['feature-2'], ), ] |
Tingkat rangkaian tanda. Fitur dapat menentukan beberapa kumpulan tanda dengan beberapa tanda.
Jika with_features ditentukan, set tanda hanya akan diperluas
ke perintah build jika setidaknya ada satu with_feature_set
yang menyertakan semua fitur dalam features yang ditentukan
diaktifkan, dan semua fitur yang ditetapkan dalam not_features
tetapkan dinonaktifkan.
Jika with_features tidak ditentukan, flag yang disetel akan
diterapkan tanpa syarat untuk setiap tindakan yang ditentukan.
|
Tindakan
Tindakan memberikan fleksibilitas untuk mengubah keadaan dalam
yang dijalankan tanpa mengasumsikan
bagaimana tindakan akan dijalankan. Channel
action_config
menentukan biner alat yang dipanggil oleh suatu tindakan, sedangkan
feature
menentukan konfigurasi (flag) yang menentukan cara alat tersebut
berperilaku saat tindakan dipanggil.
Fitur mereferensikan tindakan untuk menandakan tindakan Bazel mana
mempengaruhi karena tindakan dapat
memodifikasi grafik aksi Bazel. Tujuan
Penyedia CcToolchainConfigInfo
berisi tindakan yang memiliki flag dan alat
yang terkait dengannya, seperti c++-compile
. Tanda ditetapkan untuk setiap tindakan
dengan mengaitkannya ke sebuah fitur.
Setiap nama tindakan mewakili satu jenis tindakan yang dilakukan oleh Bazel, seperti
mengompilasi atau menautkan. Namun, ada hubungan {i>many-to-one<i} antara
dan jenis tindakan Bazel, dengan jenis tindakan Bazel mengacu pada class Java
yang mengimplementasikan tindakan (seperti CppCompileAction
). Secara khusus, model
"tindakan assembler" dan "tindakan compiler" pada tabel di bawah ini adalah
CppCompileAction
, sedangkan tindakan penautannya adalah CppLinkAction
.
Tindakan assembly
Tindakan | Deskripsi |
preprocess-assemble
|
Susun dengan pra-pemrosesan. Biasanya untuk file .S .
|
assemble
|
Susun tanpa pra-pemrosesan. Biasanya untuk file .s .
|
Tindakan compiler
Tindakan | Deskripsi |
cc-flags-make-variable
|
Menyebarkan CC_FLAGS ke genrules.
|
c-compile
|
Kompilasi sebagai C. |
c++-compile
|
Kompilasi sebagai C++. |
c++-header-parsing
|
Jalankan parser compiler pada file header untuk memastikan bahwa header mandiri, karena akan menghasilkan error kompilasi. Berlaku hanya untuk toolchain yang mendukung modul. |
Tindakan link
Tindakan | Deskripsi |
c++-link-dynamic-library
|
Menautkan library bersama yang berisi semua dependensinya. |
c++-link-nodeps-dynamic-library
|
Tautkan library bersama yang hanya berisi cc_library sumber.
|
c++-link-executable
|
Menautkan library final yang siap dijalankan. |
Tindakan AR
Tindakan AR menyusun file objek ke dalam library arsip (file .a
) melalui ar
dan mengenkode beberapa semantik ke dalam nama.
Tindakan | Deskripsi |
c++-link-static-library
|
Membuat library statis (arsip). |
Tindakan LTO
Tindakan | Deskripsi |
lto-backend
|
Tindakan ThinLTO yang mengompilasi bitcode ke dalam objek native. |
lto-index
|
Tindakan ThinLTO yang menghasilkan indeks global. |
Menggunakan action_config
action_config
adalah struct Starlark yang mendeskripsikan Bazel
tindakan dengan menentukan alat (biner) yang akan dipanggil selama aksi dan set
penanda, yang ditentukan oleh fitur. Tanda ini menerapkan batasan untuk
dalam proses eksekusi.
Konstruktor action_config()
memiliki parameter berikut:
Atribut | Deskripsi |
action_name
|
Aksi Bazel yang sesuai dengan tindakan ini. Bazel menggunakan atribut ini untuk menemukan alat per tindakan dan eksekusi lainnya. |
tools
|
File yang dapat dieksekusi yang akan dipanggil. Alat yang diterapkan pada tindakan akan menjadi alat pertama dalam daftar dengan set fitur yang cocok dengan fitur konfigurasi Anda. Nilai default harus disediakan. |
flag_sets
|
Daftar tanda yang berlaku untuk sekelompok tindakan. Sama seperti untuk aplikasi baru. |
env_sets
|
Daftar batasan lingkungan yang berlaku untuk sekelompok tindakan. Sama seperti fitur. |
action_config
dapat memerlukan dan menyiratkan fitur lain dan
action_config
seperti yang ditentukan oleh
hubungan fitur yang dijelaskan sebelumnya. Perilaku ini
serupa dengan suatu fitur.
Dua atribut terakhir bersifat redundan terhadap atribut terkait pada
dan disertakan karena beberapa tindakan Bazel
memerlukan penanda atau penanda tertentu
variabel lingkungan dan tujuannya adalah untuk menghindari action_config
+feature
yang tidak perlu
pasangan. Biasanya, berbagi satu fitur di beberapa action_config
lebih disukai.
Anda tidak dapat menentukan lebih dari satu action_config
dengan action_name
yang sama
dalam toolchain yang sama. Hal ini mencegah ambiguitas dalam jalur alat
dan menerapkan intent di balik action_config
- bahwa properti tindakan
dijelaskan dengan jelas di satu
tempat dalam toolchain.
Menggunakan konstruktor alat
action_config
dapat menentukan sekumpulan alat melalui parameter tools
-nya.
Konstruktor tool()
menggunakan parameter berikut:
Kolom | Deskripsi |
path
|
Jalur ke alat yang dimaksud (relatif terhadap lokasi saat ini). |
with_features
|
Daftar set fitur yang setidaknya salah satunya harus dipenuhi yang dapat diterapkan oleh alat ini. |
Untuk action_config
tertentu, hanya satu tool
yang berlaku
jalur alat dan persyaratan
eksekusinya terhadap aksi Bazel. Alat dipilih
dengan melakukan iterasi melalui atribut tools
pada action_config
hingga sebuah alat
dengan kumpulan with_feature
yang cocok dengan konfigurasi fitur ditemukan
(lihat Hubungan fitur di bagian awal halaman ini
untuk informasi selengkapnya). Anda harus mengakhiri daftar alat dengan
sesuai dengan konfigurasi fitur kosong.
Contoh penggunaan
Fitur dan tindakan dapat digunakan bersama untuk menerapkan tindakan Bazel
dengan beragam semantik lintas platform. Misalnya, pembuatan simbol debug pada
macOS memerlukan pembuatan simbol dalam tindakan kompilasi, lalu memanggil sebuah
alat khusus selama tindakan tautan untuk membuat arsip dsym terkompresi, dan
kemudian melakukan dekompresi arsip tersebut untuk menghasilkan paket aplikasi dan .plist
yang bisa dipakai oleh Xcode.
Dengan Bazel, proses ini dapat diimplementasikan sebagai berikut, dengan
unbundle-debuginfo
adalah aksi Bazel:
load("@rules_cc//cc:defs.bzl", "ACTION_NAMES")
action_configs = [
action_config (
action_name = ACTION_NAMES.cpp_link_executable,
tools = [
tool(
with_features = [
with_feature(features=["generate-debug-symbols"]),
],
path = "toolchain/mac/ld-with-dsym-packaging",
),
tool (path = "toolchain/mac/ld"),
],
),
]
features = [
feature(
name = "generate-debug-symbols",
flag_sets = [
flag_set (
actions = [
ACTION_NAMES.c_compile,
ACTION_NAMES.cpp_compile
],
flag_groups = [
flag_group(
flags = ["-g"],
),
],
)
],
implies = ["unbundle-debuginfo"],
),
]
Fitur yang sama dapat diimplementasikan
secara berbeda untuk Linux, yang menggunakan
fission
, atau untuk Windows, yang menghasilkan file .pdb
. Misalnya,
implementasi pembuatan simbol debug berbasis fission
mungkin terlihat seperti
berikut ini:
load("@rules_cc//cc:defs.bzl", "ACTION_NAMES")
action_configs = [
action_config (
name = ACTION_NAMES.cpp_compile,
tools = [
tool(
path = "toolchain/bin/gcc",
),
],
),
]
features = [
feature (
name = "generate-debug-symbols",
requires = [with_feature_set(features = ["dbg"])],
flag_sets = [
flag_set(
actions = [ACTION_NAMES.cpp_compile],
flag_groups = [
flag_group(
flags = ["-gsplit-dwarf"],
),
],
),
flag_set(
actions = [ACTION_NAMES.cpp_link_executable],
flag_groups = [
flag_group(
flags = ["-Wl", "--gdb-index"],
),
],
),
],
),
]
Grup bendera
CcToolchainConfigInfo
memungkinkan Anda memaketkan tanda ke dalam grup yang melayani
tujuan tertentu. Anda dapat menentukan tanda dalam menggunakan variabel yang telah ditentukan sebelumnya
di dalam nilai flag, yang akan diperluas compiler saat menambahkan tanda ke
menggunakan perintah build. Contoh:
flag_group (
flags = ["%{output_execpath}"],
)
Dalam hal ini, isi flag akan diganti dengan jalur file output tindakan tersebut.
Grup tanda diperluas ke perintah build sesuai urutan kemunculannya dalam daftar, dari atas ke bawah, dari kiri ke kanan.
Untuk flag yang perlu diulang dengan nilai berbeda saat ditambahkan ke build
, grup flag dapat melakukan iterasi variabel jenis list
. Misalnya,
variabel include_path
dari jenis list
:
flag_group (
iterate_over = "include_paths",
flags = ["-I%{include_paths}"],
)
diperluas ke -I<path>
untuk setiap elemen jalur dalam daftar include_paths
. Semua
flag (atau flag_group
) dalam isi deklarasi kelompok flag diperluas sebagai
unit iklan. Contoh:
flag_group (
iterate_over = "include_paths",
flags = ["-I", "%{include_paths}"],
)
diperluas ke -I <path>
untuk setiap elemen jalur dalam daftar include_paths
.
Variabel dapat diulang beberapa kali. Contoh:
flag_group (
iterate_over = "include_paths",
flags = ["-iprefix=%{include_paths}", "-isystem=%{include_paths}"],
)
diperluas ke:
-iprefix=<inc0> -isystem=<inc0> -iprefix=<inc1> -isystem=<inc1>
Variabel dapat berhubungan dengan struktur yang dapat diakses menggunakan notasi titik. Contoh:
flag_group (
flags = ["-l%{libraries_to_link.name}"],
)
Struktur dapat disusun bertingkat dan juga dapat berisi urutan. Untuk mencegah konflik nama dan untuk lebih jelasnya, Anda harus menentukan jalur lengkap melalui kolom. Contoh:
flag_group (
iterate_over = "libraries_to_link",
flag_groups = [
flag_group (
iterate_over = "libraries_to_link.shared_libraries",
flags = ["-l%{libraries_to_link.shared_libraries.name}"],
),
],
)
Ekspansi bersyarat
Grup tanda mendukung perluasan bersyarat berdasarkan keberadaan
variabel atau kolomnya menggunakan expand_if_available
, expand_if_not_available
,
Atribut expand_if_true
, expand_if_false
, atau expand_if_equal
. Contoh:
flag_group (
iterate_over = "libraries_to_link",
flag_groups = [
flag_group (
iterate_over = "libraries_to_link.shared_libraries",
flag_groups = [
flag_group (
expand_if_available = "libraries_to_link.shared_libraries.is_whole_archive",
flags = ["--whole_archive"],
),
flag_group (
flags = ["-l%{libraries_to_link.shared_libraries.name}"],
),
flag_group (
expand_if_available = "libraries_to_link.shared_libraries.is_whole_archive",
flags = ["--no_whole_archive"],
),
],
),
],
)
Referensi CcToolchainConfigInfo
Bagian ini menyediakan referensi variabel build, fitur, dan informasi yang diperlukan agar berhasil mengonfigurasi aturan C++.
Variabel build CcToolchainConfigInfo
Berikut adalah referensi variabel build CcToolchainConfigInfo
.
Variabel | Tindakan | Deskripsi |
source_file
|
compile | File sumber yang akan dikompilasi. |
input_file
|
strip | Artefak untuk dihapus. |
output_file
|
compile | Output kompilasi. |
output_assembly_file
|
compile | File assembly yang dikeluarkan. Hanya berlaku bila
Tindakan compile memunculkan teks assembly, biasanya saat menggunakan
tanda --save_temps . Isinya sama dengan untuk
output_file .
|
output_preprocess_file
|
compile | Output yang sudah diproses. Hanya berlaku untuk kompilasi
tindakan yang hanya melakukan prapemrosesan file sumber, biasanya saat menggunakan
--save_temps . Isinya sama dengan untuk
output_file .
|
includes
|
compile | Urutan file yang harus kompilator disertakan tanpa syarat dalam sumber yang dikompilasi. |
include_paths
|
compile | Direktori urutan tempat compiler
penelusuran untuk header yang disertakan menggunakan #include<foo.h>
dan #include "foo.h" .
|
quote_include_paths
|
compile | Urutan -iquote mencakup -
direktori tempat compiler mencari header yang disertakan menggunakan
#include "foo.h" .
|
system_include_paths
|
compile | Urutan -isystem mencakup -
direktori tempat compiler mencari header yang disertakan menggunakan
#include <foo.h> .
|
dependency_file
|
compile | File dependensi .d yang dihasilkan oleh compiler.
|
preprocessor_defines
|
compile | Urutan defines , seperti --DDEBUG .
|
pic
|
compile | Mengompilasi output sebagai kode yang tidak bergantung posisi. |
gcov_gcno_file
|
compile | File cakupan gcov .
|
per_object_debug_info_file
|
compile | File info debug per objek (.dwp ).
|
stripotps
|
strip | Urutan stripopts .
|
legacy_compile_flags
|
compile | Urutan tanda dari versi lama
Kolom CROSSTOOL seperti compiler_flag ,
optional_compiler_flag , cxx_flag , dan
optional_cxx_flag .
|
user_compile_flags
|
compile | Urutan penanda dari
atribut aturan copt atau --copt ,
--cxxopt , dan --conlyopt .
|
unfiltered_compile_flags
|
compile | Urutan tanda dari
unfiltered_cxx_flag kolom CROSSTOOL lama atau
unfiltered_compile_flags . Laporan ini tidak difilter menurut
atribut aturan nocopts .
|
sysroot
|
sysroot .
|
|
runtime_library_search_directories
|
link | Entri di jalur penelusuran runtime penaut (biasanya
yang ditetapkan dengan flag -rpath ).
|
library_search_directories
|
link | Entri di jalur penelusuran penaut (biasanya ditetapkan dengan
flag -L ).
|
libraries_to_link
|
link | Tanda yang memberikan file untuk ditautkan sebagai input dalam pemanggilan penaut. |
def_file_path
|
link | Lokasi {i>file<i} def yang digunakan di Windows dengan MSVC. |
linker_param_file
|
link | Lokasi file parameter penaut yang dibuat oleh bazel untuk melampaui batas panjang baris perintah. |
output_execpath
|
link | Execpath dari output penaut. |
generate_interface_library
|
link | "yes" atau "no" bergantung pada apakah library antarmuka harus
dibuat.
|
interface_library_builder_path
|
link | Jalur ke alat builder library antarmuka. |
interface_library_input_path
|
link | Input untuk alat builder ifso library antarmuka.
|
interface_library_output_path
|
link | Jalur tempat membuat library antarmuka menggunakan alat builder ifso .
|
legacy_link_flags
|
link | Flag linker yang berasal dari kolom CROSSTOOL lama.
|
user_link_flags
|
link | Flag linker yang berasal dari --linkopt
atau linkopts .
|
linkstamp_paths
|
link | Variabel build yang memberikan jalur linkstamp. |
force_pic
|
link | Adanya variabel ini menunjukkan bahwa kode PIC/PIE harus dibuat (opsi Bazel `--force_pic` diteruskan). |
strip_debug_symbols
|
link | Keberadaan variabel ini mengindikasikan bahwa debug simbol harus dihilangkan. |
is_cc_test
|
link | Benar jika tindakan saat ini adalah cc_test
tindakan penautan, false jika tidak.
|
is_using_fission
|
kompilasi, link | Kehadiran variabel ini menunjukkan bahwa fisi (info debug per objek)
diaktifkan. Info debug akan berupa file .dwo
dari file .o dan compiler dan penaut perlu mengetahui hal ini.
|
fdo_instrument_path
|
kompilasi, link | Jalur ke direktori yang menyimpan profil instrumentasi FDO. |
fdo_profile_path
|
compile | Jalur ke profil FDO. |
fdo_prefetch_hints_path
|
compile | Jalur ke profil pengambilan data cache. |
csfdo_instrument_path
|
kompilasi, link | Jalur ke direktori yang menyimpan FDO yang sensitif konteks profil instrumentasi. |
Fitur yang terkenal
Berikut adalah referensi fitur dan aktivasinya kondisi tertentu.
Fitur | Dokumentasi |
opt | dbg | fastbuild
|
Diaktifkan secara default berdasarkan mode kompilasi. |
static_linking_mode | dynamic_linking_mode
|
Diaktifkan secara default berdasarkan mode penautan. |
per_object_debug_info
|
Diaktifkan jika fitur supports_fission ditentukan dan
diaktifkan dan mode kompilasi saat ini ditentukan dalam
tanda --fission .
|
supports_start_end_lib
|
Jika diaktifkan (dan opsi --start_end_lib disetel), Bazel
tidak akan menautkan ke library statis,
Opsi penaut --start-lib/--end-lib untuk ditautkan ke objek
secara langsung. Ini mempercepat waktu build karena
Bazel tidak perlu membangun
library statis.
|
supports_interface_shared_libraries
|
Jika diaktifkan (dan opsi --interface_shared_objects adalah
ditetapkan), Bazel akan menautkan target yang menetapkan linkstatic ke
Salah (cc_test secara default) terhadap antarmuka yang dibagikan
library. Hal ini membuat penautan ulang inkremental menjadi lebih cepat.
|
supports_dynamic_linker
|
Jika diaktifkan, aturan C++ akan mengetahui bahwa toolchain dapat menghasilkan library. |
static_link_cpp_runtimes
|
Jika diaktifkan, Bazel akan menautkan runtime C++ secara statis dalam penautan statis
dan secara dinamis dalam mode penautan dinamis. Artefak
yang ditentukan dalam cc_toolchain.static_runtime_lib atau
atribut cc_toolchain.dynamic_runtime_lib (bergantung pada
mode penautan) akan ditambahkan ke tindakan penautan.
|
supports_pic
|
Jika diaktifkan, toolchain akan tahu cara menggunakan objek PIC untuk library dinamis. Variabel `pic` ada setiap kali kompilasi PIC diperlukan. Jika tidak diaktifkan secara {i>default<i}, dan `--force_pic` diteruskan, Bazel akan meminta `supports_pic` dan memvalidasi bahwa fitur tersebut telah diaktifkan. Jika fitur tidak ada atau tidak dapat diaktifkan, `--force_pic` tidak dapat digunakan. |
static_linking_mode | dynamic_linking_mode
|
Diaktifkan secara default berdasarkan mode penautan. |
no_legacy_features
|
Mencegah Bazel menambahkan fitur lama ke dalam konfigurasi C++. Lihat daftar lengkap fitur tersebut di bawah. |
Logika patching fitur lama
Bazel menerapkan perubahan berikut ke fitur toolchain untuk tindakan kompatibilitas:
- Memindahkan fitur
legacy_compile_flags
ke bagian atas toolchain - Memindahkan fitur
default_compile_flags
ke bagian atas toolchain - Menambahkan fitur
dependency_file
(jika tidak ada) ke bagian atas toolchain - Menambahkan fitur
pic
(jika tidak ada) ke bagian atas toolchain - Menambahkan fitur
per_object_debug_info
(jika tidak ada) ke bagian atas toolchain - Menambahkan fitur
preprocessor_defines
(jika tidak ada) ke bagian atas toolchain - Menambahkan fitur
includes
(jika tidak ada) ke bagian atas toolchain - Menambahkan fitur
include_paths
(jika tidak ada) ke bagian atas toolchain - Menambahkan fitur
fdo_instrument
(jika tidak ada) ke bagian atas toolchain - Menambahkan fitur
fdo_optimize
(jika tidak ada) ke bagian atas toolchain - Menambahkan fitur
cs_fdo_instrument
(jika tidak ada) ke bagian atas toolchain - Menambahkan fitur
cs_fdo_optimize
(jika tidak ada) ke bagian atas toolchain - Menambahkan fitur
fdo_prefetch_hints
(jika tidak ada) ke bagian atas toolchain - Menambahkan fitur
autofdo
(jika tidak ada) ke bagian atas toolchain - Menambahkan fitur
build_interface_libraries
(jika tidak ada) ke bagian atas toolchain - Menambahkan fitur
dynamic_library_linker_tool
(jika tidak ada) ke bagian atas toolchain - Menambahkan fitur
shared_flag
(jika tidak ada) ke bagian atas toolchain - Menambahkan fitur
linkstamps
(jika tidak ada) ke bagian atas toolchain - Menambahkan fitur
output_execpath_flags
(jika tidak ada) ke bagian atas toolchain - Menambahkan fitur
runtime_library_search_directories
(jika tidak ada) ke bagian atas toolchain - Menambahkan fitur
library_search_directories
(jika tidak ada) ke bagian atas toolchain - Menambahkan fitur
archiver_flags
(jika tidak ada) ke bagian atas toolchain - Menambahkan fitur
libraries_to_link
(jika tidak ada) ke bagian atas toolchain - Menambahkan fitur
force_pic_flags
(jika tidak ada) ke bagian atas toolchain - Menambahkan fitur
user_link_flags
(jika tidak ada) ke bagian atas toolchain - Menambahkan fitur
legacy_link_flags
(jika tidak ada) ke bagian atas toolchain - Menambahkan fitur
static_libgcc
(jika tidak ada) ke bagian atas toolchain - Menambahkan fitur
fission_support
(jika tidak ada) ke bagian atas toolchain - Menambahkan fitur
strip_debug_symbols
(jika tidak ada) ke bagian atas toolchain - Menambahkan fitur
coverage
(jika tidak ada) ke bagian atas toolchain - Menambahkan fitur
llvm_coverage_map_format
(jika tidak ada) ke bagian atas toolchain - Menambahkan fitur
gcc_coverage_map_format
(jika tidak ada) ke bagian atas toolchain - Menambahkan fitur
fully_static_link
(jika tidak ada) ke bagian bawah toolchain - Menambahkan fitur
user_compile_flags
(jika tidak ada) ke bagian bawah toolchain - Menambahkan fitur
sysroot
(jika tidak ada) ke bagian bawah toolchain - Menambahkan fitur
unfiltered_compile_flags
(jika tidak ada) ke bagian bawah toolchain - Menambahkan fitur
linker_param_file
(jika tidak ada) ke bagian bawah toolchain - Menambahkan fitur
compiler_input_flags
(jika tidak ada) ke bagian bawah toolchain - Menambahkan fitur
compiler_output_flags
(jika tidak ada) ke bagian bawah toolchain
Ini adalah daftar fitur yang panjang. Rencananya adalah
menghapusnya sekali
Crosstool di Starlark telah
selesai. Bagi pembaca yang ingin tahu, lihat implementasinya di
CppActionConfigs,
dan untuk toolchain produksi, pertimbangkan menambahkan no_legacy_features
untuk dibuat
toolchain lebih mandiri.