Konfigurasi Toolchain C++

Laporkan masalah Lihat sumber Per Malam · 7,3 · 7,2 · 7,1 · 7,0 · 6,5

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:

  1. Pengguna menentukan target cc_toolchain_suite dalam file BUILD dan titik Bazel ke target menggunakan Opsi --crosstool_top.

  2. 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 dari cc_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 dari cc_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 ke true.
  • Bazel atau pemilik aturan secara eksplisit mengaktifkannya.
  • Pengguna mengaktifkannya melalui opsi Bazel --feature atau aturan features .

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 provides = ["sanitizer"].

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 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.