Ringkasan
Untuk memanggil compiler dengan opsi yang tepat, Bazel memerlukan beberapa pengetahuan tentang internal compiler, seperti menyertakan direktori dan flag penting. Dengan kata lain, Bazel memerlukan model compiler yang disederhanakan untuk memahami cara kerjanya.
Bazel perlu mengetahui hal-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 memerlukan hal ini untuk memvalidasi bahwa
semua header yang disertakan dalam file sumber dideklarasikan dengan benar dalam
file
BUILD
. - Sysroot default.
- Flag yang akan digunakan untuk kompilasi, penautan, pengarsipan.
- Flag yang akan digunakan untuk mode kompilasi yang didukung (opt, dbg, fastbuild).
- Buat variabel yang secara khusus diperlukan oleh compiler.
Jika compiler memiliki dukungan untuk beberapa arsitektur, Bazel perlu mengonfigurasinya secara terpisah.
CcToolchainConfigInfo
adalah penyedia yang menyediakan tingkat perincian
yang diperlukan untuk mengonfigurasi perilaku aturan C++ Bazel. Secara default,
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 harus mengarahkan
atribut 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 di
@rules_cc//cc:cc_toolchain_config_lib.bzl
.
Saat target C++ memasuki fase analisis, Bazel memilih target
cc_toolchain
yang sesuai berdasarkan file BUILD
, dan mendapatkan
penyedia 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 penautan, yang dibuat instance-nya oleh aturan seperti
cc_binary
atau cc_library
, memerlukan informasi berikut:
- Compiler atau penaut yang akan digunakan
- Flag command line untuk compiler/penaut
- Flag konfigurasi yang diteruskan melalui opsi
--copt/--linkopt
- Variabel lingkungan
- Artefak yang diperlukan di sandbox tempat tindakan dieksekusi
Semua informasi di atas, kecuali artefak yang diperlukan di sandbox, ditentukan dalam target Starlark yang ditunjuk oleh cc_toolchain
.
Artefak yang akan dikirim ke sandbox dideklarasikan dalam target
cc_toolchain
. 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 mengarahkan Bazel ke target menggunakan opsi--crosstool_top
.Target
cc_toolchain_suite
mereferensikan beberapa toolchain. Nilai tanda--cpu
dan--compiler
menentukan toolchain mana yang dipilih, baik hanya berdasarkan nilai tanda--cpu
, maupun berdasarkan nilai--cpu | --compiler
gabungan. Proses seleksi adalah sebagai berikut:Jika opsi
--compiler
ditentukan, Bazel akan memilih entri yang sesuai dari atributcc_toolchain_suite.toolchains
dengan--cpu | --compiler
. Jika tidak menemukan entri yang sesuai, Bazel akan menampilkan error.Jika opsi
--compiler
tidak ditentukan, Bazel akan memilih entri yang sesuai dari atributcc_toolchain_suite.toolchains
hanya dengan--cpu
.Jika tidak ada flag yang ditentukan, Bazel akan memeriksa sistem host dan memilih nilai
--cpu
berdasarkan temuannya. Lihat kode mekanisme pemeriksaan.
Setelah toolchain dipilih, objek feature
dan action_config
yang sesuai dalam aturan Starlark akan mengatur konfigurasi build (yaitu,
item yang dijelaskan nanti). Pesan ini memungkinkan implementasi
fitur C++ yang lengkap di Bazel tanpa mengubah
biner Bazel. Aturan C++ mendukung beberapa tindakan unik yang didokumentasikan secara mendetail
dalam kode sumber Bazel.
Fitur
Fitur adalah entity yang memerlukan flag, tindakan,
batasan command line pada lingkungan eksekusi, atau perubahan dependensi. Fitur
dapat berupa sesuatu yang sederhana seperti mengizinkan file BUILD
memilih konfigurasi
flag, seperti treat_warnings_as_errors
, atau berinteraksi dengan aturan C++ dan
menyertakan tindakan kompilasi dan input baru ke kompilasi, seperti
header_modules
atau thin_lto
.
Idealnya, CcToolchainConfigInfo
berisi daftar fitur, dengan setiap
fitur terdiri dari satu atau beberapa grup tanda, yang masing-masing menentukan daftar tanda
yang berlaku untuk tindakan Bazel tertentu.
Fitur ditentukan berdasarkan nama, yang memungkinkan pemisahan penuh konfigurasi aturan
Starlark dari rilis Bazel. Dengan kata lain, rilis Bazel tidak
memengaruhi perilaku konfigurasi CcToolchainConfigInfo
selama konfigurasi
tersebut tidak memerlukan penggunaan fitur baru.
Fitur diaktifkan dengan salah satu cara berikut:
- Kolom
enabled
fitur ditetapkan ketrue
. - Bazel atau pemilik aturan mengaktifkannya secara eksplisit.
- Pengguna mengaktifkannya melalui opsi Bazel
--feature
atau atribut aturanfeatures
.
Fitur dapat memiliki interdependensi, bergantung pada tanda command line, setelan file BUILD
, dan variabel lainnya.
Hubungan fitur
Dependensi biasanya dikelola langsung dengan Bazel, yang hanya menerapkan persyaratan dan mengelola konflik yang inheren dengan sifat fitur yang ditentukan dalam build. Spesifikasi toolchain memungkinkan batasan yang lebih terperinci untuk digunakan langsung dalam aturan Starlark yang mengatur dukungan dan perluasan fitur. Karakter pengganti ini meliputi:
Batasan | Deskripsi |
requires = [ feature_set (features = [ 'feature-name-1', 'feature-name-2' ]), ] |
Tingkat fitur. Fitur ini hanya didukung jika fitur wajib yang ditentukan diaktifkan. Misalnya, ketika suatu fitur hanya didukung dalam mode build tertentu (opt , dbg , atau fastbuild ). Jika `require` berisi beberapa `feature_set`, fitur tersebut didukung jika salah satu `feature_set`tersebut terpenuhi (saat semua fitur yang ditentukan diaktifkan).
|
implies = ['feature'] |
Tingkat fitur. Fitur ini menyiratkan fitur yang ditentukan. Mengaktifkan fitur juga secara implisit mengaktifkan semua fitur yang tersirat olehnya (yaitu, berfungsi secara rekursif). Juga memberikan kemampuan untuk memperhitungkan subset fungsi umum dari serangkaian fitur, seperti komponen umum pembersih. Fitur implisit tidak dapat dinonaktifkan. |
provides = ['feature'] |
Tingkat fitur. Menunjukkan bahwa fitur ini adalah salah satu dari beberapa
fitur alternatif yang saling eksklusif. Misalnya, semua pembersih dapat menentukan Hal ini meningkatkan penanganan error dengan mencantumkan alternatif jika pengguna meminta dua atau beberapa fitur yang saling eksklusif sekaligus. |
with_features = [ with_feature_set( features = ['feature-1'], not_features = ['feature-2'], ), ] |
Tingkat penetapan tanda. Fitur dapat menentukan beberapa kumpulan flag dengan beberapa.
Jika with_features ditentukan, kumpulan flag hanya akan diperluas
ke perintah build jika ada setidaknya satu with_feature_set
yang semua fiturnya dalam kumpulan features yang ditentukan
diaktifkan, dan semua fitur yang ditentukan dalam kumpulan
not_features dinonaktifkan.
Jika with_features tidak ditentukan, kumpulan tanda akan diterapkan tanpa syarat untuk setiap tindakan yang ditentukan.
|
Tindakan
Tindakan memberikan fleksibilitas untuk mengubah keadaan saat
tindakan dieksekusi tanpa mengasumsikan cara tindakan akan dijalankan. action_config
menentukan biner alat yang dipanggil tindakan, sedangkan feature
menentukan konfigurasi (flag) yang menentukan perilaku alat tersebut saat tindakan dipanggil.
Fitur mereferensikan tindakan untuk menandakan tindakan Bazel
yang terpengaruh karena tindakan dapat mengubah grafik tindakan Bazel. Penyedia
CcToolchainConfigInfo
berisi tindakan yang memiliki tanda dan alat
yang terkait dengannya, seperti c++-compile
. Flag ditetapkan ke setiap tindakan
dengan mengaitkannya dengan fitur.
Setiap nama tindakan mewakili satu jenis tindakan yang dilakukan oleh Bazel, seperti
mengompilasi atau menautkan. Namun, ada hubungan banyak-ke-satu antara
tindakan dan jenis tindakan Bazel, dengan jenis tindakan Bazel merujuk pada class Java
yang menerapkan tindakan (seperti CppCompileAction
). Secara khusus,
"tindakan assembler" dan "tindakan compiler" dalam tabel di bawah adalah
CppCompileAction
, sedangkan tindakan link adalah CppLinkAction
.
Tindakan assembly
Tindakan | Deskripsi |
preprocess-assemble
|
Merakit dengan prapemrosesan. 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 bersifat mandiri, karena jika tidak, akan menghasilkan error kompilasi. Hanya berlaku 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 menjadi objek native. |
lto-index
|
Tindakan ThinLTO yang menghasilkan indeks global. |
Menggunakan action_config
action_config
adalah struct Starlark yang menjelaskan tindakan
Bazel dengan menentukan alat (biner) yang akan dipanggil selama tindakan dan kumpulan
flag, yang ditentukan oleh fitur. Flag ini menerapkan batasan pada eksekusi tindakan.
Konstruktor action_config()
memiliki parameter berikut:
Atribut | Deskripsi |
action_name
|
Tindakan Bazel yang sesuai dengan tindakan ini. Bazel menggunakan atribut ini untuk menemukan alat per tindakan dan persyaratan eksekusi. |
tools
|
File yang dapat dieksekusi untuk dipanggil. Alat yang diterapkan ke tindakan akan menjadi alat pertama dalam daftar dengan kumpulan fitur yang cocok dengan konfigurasi fitur. Nilai default harus disediakan. |
flag_sets
|
Daftar tanda yang berlaku untuk sekelompok tindakan. Sama seperti untuk fitur. |
env_sets
|
Daftar batasan lingkungan yang berlaku untuk sekelompok tindakan. Sama seperti fitur. |
action_config
dapat mewajibkan dan menyiratkan fitur dan
action_config
lain seperti yang ditentukan oleh
hubungan fitur yang dijelaskan sebelumnya. Perilaku ini
mirip dengan fitur.
Dua atribut terakhir bersifat redundan terhadap atribut yang sesuai pada
fitur dan disertakan karena beberapa tindakan Bazel memerlukan tanda atau
variabel lingkungan tertentu dan tujuannya adalah untuk menghindari pasangan action_config
+feature
yang tidak perlu. Biasanya, berbagi satu fitur di beberapa action_config
lebih
direkomendasikan.
Anda tidak dapat menentukan lebih dari satu action_config
dengan action_name
yang sama
dalam toolchain yang sama. Hal ini mencegah ambiguitas di jalur alat
dan menerapkan niat 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 kumpulan fitur yang setidaknya satu harus dipenuhi agar alat ini dapat diterapkan. |
Untuk action_config
tertentu, hanya satu tool
yang menerapkan
jalur alat dan persyaratan eksekusinya ke tindakan Bazel. Alat dipilih
dengan melakukan iterasi pada atribut tools
di action_config
hingga alat
dengan kumpulan with_feature
yang cocok dengan konfigurasi fitur ditemukan
(lihat Hubungan fitur sebelumnya di halaman ini
untuk mengetahui informasi selengkapnya). Anda harus mengakhiri daftar alat dengan alat
default yang sesuai dengan konfigurasi fitur kosong.
Contoh penggunaan
Fitur dan tindakan dapat digunakan bersama untuk menerapkan tindakan Bazel
dengan semantik lintas platform yang beragam. Misalnya, pembuatan simbol debug di
macOS memerlukan pembuatan simbol dalam tindakan kompilasi, lalu memanggil
alat khusus selama tindakan penautan untuk membuat arsip dsym yang dikompresi, lalu
mendekompresi arsip tersebut untuk menghasilkan app bundle dan file .plist
yang dapat digunakan oleh Xcode.
Dengan Bazel, proses ini dapat diimplementasikan sebagai berikut, dengan
unbundle-debuginfo
berupa tindakan 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 ini dapat diterapkan secara sepenuhnya berbeda untuk Linux, yang menggunakan
fission
, atau untuk Windows, yang menghasilkan file .pdb
. Misalnya,
implementasi untuk pembuatan simbol debug berbasis fission
mungkin terlihat
seperti berikut:
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 flag ke dalam grup yang memiliki
tujuan tertentu. Anda dapat menentukan flag dalam menggunakan variabel yang telah ditentukan sebelumnya
dalam nilai flag, yang diperluas compiler saat menambahkan flag ke
perintah build. Contoh:
flag_group (
flags = ["%{output_execpath}"],
)
Dalam hal ini, konten tanda akan diganti dengan jalur file output dari tindakan.
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 yang berbeda saat ditambahkan ke perintah
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
tanda (atau flag_group
) dalam isi deklarasi grup tanda diperluas sebagai
unit. 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 menjadi:
-iprefix=<inc0> -isystem=<inc0> -iprefix=<inc1> -isystem=<inc1>
Variabel dapat sesuai 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 agar eksplisit, 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 flag mendukung perluasan bersyarat berdasarkan keberadaan variabel
tertentu atau kolomnya menggunakan atribut expand_if_available
, expand_if_not_available
,
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 memberikan referensi variabel build, fitur, dan informasi lain 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 yang akan dihapus. |
output_file
|
compile, strip | Output kompilasi. |
output_assembly_file
|
compile | File assembly yang dikeluarkan. Hanya berlaku saat
tindakan compile memunculkan teks assembly, biasanya saat menggunakan
flag --save_temps . Isinya sama dengan
output_file .
|
output_preprocess_file
|
compile | Output yang telah diproses sebelumnya. Hanya berlaku untuk tindakan
kompilasi yang hanya memproses file sumber, biasanya saat menggunakan
flag --save_temps . Isinya sama dengan
output_file .
|
includes
|
compile | Urutan file yang harus disertakan tanpa syarat dalam sumber yang dikompilasi. |
include_paths
|
compile | Direktori urutan tempat compiler
menelusuri header yang disertakan menggunakan #include<foo.h>
dan #include "foo.h" .
|
quote_include_paths
|
compile | Urutan -iquote mencakup -
direktori tempat compiler menelusuri header yang disertakan menggunakan
#include "foo.h" .
|
system_include_paths
|
compile | Urutan -isystem mencakup -
direktori tempat compiler menelusuri 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 pada posisi. |
gcov_gcno_file
|
compile | File cakupan gcov .
|
per_object_debug_info_file
|
compile | File info debug per objek (.dwp ).
|
stripopts
|
strip | Urutan stripopts .
|
legacy_compile_flags
|
compile | Urutan tanda dari kolom CROSSTOOL lama seperti compiler_flag , optional_compiler_flag , cxx_flag , dan optional_cxx_flag .
|
user_compile_flags
|
compile | Urutan tanda dari atribut aturan copt atau tanda --copt , --cxxopt , dan --conlyopt .
|
unfiltered_compile_flags
|
compile | Urutan flag dari
kolom CROSSTOOL lama unfiltered_cxx_flag atau
fitur unfiltered_compile_flags . Atribut ini tidak difilter oleh
atribut aturan nocopts .
|
sysroot
|
sysroot .
|
|
runtime_library_search_directories
|
link | Entri di jalur penelusuran runtime penaut (biasanya
ditetapkan dengan tanda -rpath ).
|
library_search_directories
|
link | Entri di jalur penelusuran penaut (biasanya ditetapkan dengan
flag -L ).
|
libraries_to_link
|
link | Flag yang menyediakan file untuk ditautkan sebagai input dalam pemanggilan penaut. |
def_file_path
|
link | Lokasi file def yang digunakan di Windows dengan MSVC. |
linker_param_file
|
link | Lokasi file parameter penaut yang dibuat oleh bazel untuk mengatasi batas panjang command line. |
output_execpath
|
link | Execpath output penaut. |
generate_interface_library
|
link | "yes" atau "no" bergantung pada apakah library antarmuka harus
dihasilkan.
|
interface_library_builder_path
|
link | Jalur ke alat pembuat 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 atribut --linkopt
atau linkopts .
|
linkstamp_paths
|
link | Variabel build yang memberikan jalur linkstamp. |
force_pic
|
link | Kehadiran variabel ini menunjukkan bahwa kode PIC/PIE harus dihasilkan (opsi Bazel `--force_pic` diteruskan). |
strip_debug_symbols
|
link | Kehadiran variabel ini menunjukkan bahwa simbol debug harus dihapus. |
is_cc_test
|
link | Benar jika tindakan saat ini adalah tindakan penautan cc_test , salah jika tidak.
|
is_using_fission
|
kompilasi, link | Kehadiran variabel ini menunjukkan bahwa fission (info debug per objek)
diaktifkan. Info debug akan berada dalam file .dwo , bukan
file .o , dan compiler serta penaut harus 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. |
cs_fdo_instrument_path
|
kompilasi, link | Jalur ke direktori yang menyimpan profil instrumentasi FDO yang sensitif terhadap konteks. |
Fitur terkenal
Berikut adalah referensi fitur dan kondisi aktivasinya.
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 ditetapkan dan diaktifkan serta mode kompilasi saat ini ditentukan dalam flag --fission .
|
supports_start_end_lib
|
Jika diaktifkan (dan opsi --start_end_lib ditetapkan), Bazel
tidak akan menautkan ke library statis, tetapi menggunakan
opsi penaut --start-lib/--end-lib untuk menautkan ke objek
secara langsung. Hal ini mempercepat build karena Bazel tidak perlu membangun
library statis.
|
supports_interface_shared_libraries
|
Jika diaktifkan (dan opsi --interface_shared_objects
ditetapkan), Bazel akan menautkan target yang memiliki linkstatic ditetapkan ke
Salah (cc_test secara default) terhadap library bersama
antarmuka. Hal ini akan mempercepat penautan ulang inkremental.
|
supports_dynamic_linker
|
Jika diaktifkan, aturan C++ akan mengetahui bahwa toolchain dapat menghasilkan library bersama. |
static_link_cpp_runtimes
|
Jika diaktifkan, Bazel akan menautkan runtime C++ secara statis dalam mode penautan statis dan secara dinamis dalam mode penautan dinamis. Artefak yang ditentukan dalam atribut cc_toolchain.static_runtime_lib atau cc_toolchain.dynamic_runtime_lib (bergantung pada mode penautan) akan ditambahkan ke tindakan penautan.
|
supports_pic
|
Jika diaktifkan, toolchain akan mengetahui cara menggunakan objek PIC untuk library dinamis. Variabel `pic` ada setiap kali kompilasi PIC diperlukan. Jika tidak diaktifkan secara default, dan `--force_pic` diteruskan, Bazel akan meminta `supports_pic` dan memvalidasi bahwa fitur 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 konfigurasi C++ jika ada. Lihat daftar lengkap fitur di bawah. |
Logika patching fitur lama
Bazel menerapkan perubahan berikut pada fitur toolchain untuk kompatibilitas mundur:
- 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 setelah
Crosstool di Starlark
selesai. Bagi pembaca yang ingin tahu, lihat implementasinya di
CppActionConfigs,
dan untuk toolchain produksi, pertimbangkan untuk menambahkan no_legacy_features
agar
rantai alat lebih mandiri.