Konfigurasi Toolchain C++

Laporkan masalah Lihat sumber

Ringkasan

Untuk memanggil compiler dengan opsi yang tepat, Bazel perlu pengetahuan tentang internal compiler, seperti menyertakan direktori dan flag penting. Dengan kata lain, Bazel memerlukan model compiler yang disederhanakan untuk memahami caranya.

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 ini berisikan direktori. Bazel memerlukan ini untuk memvalidasi bahwa semua header yang disertakan dalam file sumber dideklarasikan dengan benar dalam file BUILD.
  • Sysroot default.
  • Tanda 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 mengonfigurasinya secara terpisah.

CcToolchainConfigInfo adalah penyedia yang memberikan 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 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 akan 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 link, 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
  • Tanda 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 dalam sandbox, ditentukan dalam target Starlark yang ditunjuk 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 dikirim ke sandbox.

Pemilihan toolchain

Logika pemilihan toolchain beroperasi sebagai berikut:

  1. Pengguna menentukan target cc_toolchain_suite dalam file BUILD dan mengarahkan Bazel ke target menggunakan opsi --crosstool_top.

  2. Target cc_toolchain_suite merujuk ke beberapa toolchain. Nilai tanda --cpu dan --compiler menentukan manakah dari toolchain tersebut yang dipilih, baik berdasarkan nilai tanda --cpu saja, atau berdasarkan nilai --cpu | --compiler gabungan. Proses seleksinya adalah sebagai berikut:

    • Jika opsi --compiler ditentukan, Bazel akan memilih entri yang sesuai dari atribut cc_toolchain_suite.toolchains dengan --cpu | --compiler. Jika Bazel tidak menemukan entri yang sesuai, ia akan menampilkan error.

    • Jika opsi --compiler tidak ditentukan, Bazel akan memilih entri yang sesuai dari atribut cc_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 akan dijelaskan nanti). Pesan ini memungkinkan implementasi fitur C++ yang lengkap pada 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 command line, tindakan, batasan pada lingkungan eksekusi, atau perubahan dependensi. Fitur dapat berupa hal sederhana seperti mengizinkan file BUILD memilih konfigurasi flag, seperti treat_warnings_as_errors, atau berinteraksi dengan aturan C++ serta 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 melalui salah satu cara berikut:

  • Kolom enabled fitur disetel ke true.
  • Bazel atau pemilik aturan secara eksplisit mengaktifkannya.
  • Pengguna mengaktifkannya melalui opsi Bazel --feature atau atribut aturan features.

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 intrinsik pada sifat fitur yang ditetapkan dalam build. Spesifikasi toolchain memungkinkan penggunaan batasan yang lebih terperinci secara langsung dalam aturan Starlark yang mengatur dukungan dan perluasan fitur. Tugas tersebut adalah:

Batasan Deskripsi
requires = [
   feature_set (features = [
       'feature-name-1',
       'feature-name-2'
   ]),
]
Tingkat fitur. Fitur ini hanya didukung jika fitur tertentu yang diperlukan diaktifkan. Misalnya, saat fitur hanya didukung dalam mode build tertentu (opt, dbg, atau fastbuild). Jika `require` berisi beberapa `feature_set`, fitur akan didukung jika salah satu `feature_set`terpenuhi (saat semua fitur yang ditentukan diaktifkan).
implies = ['feature']

Tingkat fitur. Fitur ini menyiratkan fitur yang ditentukan. Mengaktifkan fitur juga secara implisit akan mengaktifkan semua fitur yang tersirat olehnya (artinya, fungsi ini berfungsi secara rekursif).

Selain itu, memberikan kemampuan untuk memfaktorkan subset umum fungsi dari serangkaian fitur, seperti komponen pembersih umum. Fitur tersirat tidak dapat dinonaktifkan.

provides = ['feature']

Tingkat fitur. Menunjukkan bahwa fitur ini merupakan salah satu dari beberapa fitur alternatif yang saling eksklusif. Misalnya, semua pembersih dapat menentukan provides = ["sanitizer"].

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'],
  ),
]
Level set flag. Fitur dapat menentukan beberapa kumpulan tanda dengan beberapa. Saat with_features ditentukan, kumpulan flag hanya akan diperluas ke perintah build jika setidaknya ada satu with_feature_set yang semua fitur 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 suatu tindakan dijalankan tanpa berasumsi bagaimana tindakan tersebut akan dijalankan. action_config menentukan biner alat yang dipanggil oleh tindakan, sedangkan feature menentukan konfigurasi (tanda) yang menentukan perilaku alat tersebut saat tindakan dipanggil.

Tindakan referensi Fitur untuk menunjukkan tindakan Bazel mana 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 untuk setiap tindakan dengan mengaitkannya dengan fitur.

Setiap nama tindakan mewakili satu jenis tindakan yang dilakukan oleh Bazel, seperti mengompilasi atau menautkan. Namun, ada hubungan many-to-one antara tindakan dan jenis tindakan Bazel, dengan jenis tindakan Bazel merujuk ke class Java yang mengimplementasikan tindakan (seperti CppCompileAction). Secara khusus, "tindakan assembler" dan "tindakan compiler" dalam tabel di bawah adalah CppCompileAction, sedangkan tindakan link-nya adalah CppLinkAction.

Tindakan perakitan

Tindakan Deskripsi
preprocess-assemble Rakit dengan pra-pemrosesan. Biasanya untuk file .S.
assemble Rakit tanpa pemrosesan sebelumnya. Biasanya untuk file .s.

Tindakan compiler

Tindakan Deskripsi
cc-flags-make-variable Memperluas 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 header tersebut berfungsi sendiri, karena jika tidak, akan menghasilkan error kompilasi. Hanya berlaku untuk toolchain yang mendukung modul.
Tindakan Deskripsi
c++-link-dynamic-library Menautkan pustaka bersama yang berisi semua dependensinya.
c++-link-nodeps-dynamic-library Menautkan pustaka bersama yang hanya berisi sumber cc_library.
c++-link-executable Menautkan library akhir 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 Buat 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 menjelaskan tindakan Bazel dengan menentukan alat (biner) yang akan dipanggil selama tindakan dan serangkaian flag, yang ditentukan oleh fitur. Tanda ini menerapkan batasan pada eksekusi tindakan.

Konstruktor action_config() memiliki parameter berikut:

Atribut Deskripsi
action_name Tindakan Bazel yang terkait dengan tindakan ini. Bazel menggunakan atribut ini untuk menemukan persyaratan eksekusi dan alat per tindakan.
tools File yang dapat dieksekusi untuk dipanggil. Alat yang diterapkan ke tindakan akan menjadi alat pertama dalam daftar dengan set fitur yang cocok dengan konfigurasi fitur. Nilai default harus diberikan.
flag_sets Daftar tanda yang berlaku untuk grup tindakan. Sama seperti untuk fitur.
env_sets Daftar batasan lingkungan yang berlaku untuk sekelompok tindakan. Sama seperti fitur.

action_config dapat memerlukan dan menyiratkan fitur dan action_config lainnya sebagaimana ditentukan oleh hubungan fitur yang dijelaskan sebelumnya. Perilaku ini mirip dengan fitur.

Dua atribut terakhir bersifat redundan terhadap atribut terkait pada fitur dan disertakan karena beberapa tindakan Bazel memerlukan flag atau variabel lingkungan tertentu dan tujuannya adalah untuk menghindari pasangan action_config+feature yang tidak perlu. Biasanya, sebaiknya bagikan satu fitur di beberapa action_config.

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 karena properti tindakan dijelaskan dengan jelas di satu tempat dalam toolchain.

Menggunakan konstruktor alat

action_config dapat menentukan kumpulan alat melalui parameter tools. Konstruktor tool() menggunakan parameter berikut:

Kolom Deskripsi
path Jalur ke alat yang dimaksud (relatif dengan lokasi saat ini).
with_features Daftar set fitur yang setidaknya harus dipenuhi agar alat ini dapat diterapkan.

Untuk action_config tertentu, hanya satu tool yang menerapkan persyaratan eksekusi dan jalur alatnya ke tindakan Bazel. Alat dipilih dengan melakukan iterasi melalui atribut tools pada action_config hingga alat dengan with_feature yang cocok dengan konfigurasi fitur ditemukan (lihat Hubungan fitur sebelumnya di halaman ini untuk informasi selengkapnya). Anda harus mengakhiri daftar alat dengan alat default yang sesuai dengan konfigurasi fitur yang kosong.

Contoh penggunaan

Fitur dan tindakan dapat digunakan bersama untuk menerapkan tindakan Bazel dengan beragam semantik lintas platform. Misalnya, pembuatan simbol debug di macOS mengharuskan pembuatan simbol dalam tindakan kompilasi, lalu panggil alat khusus selama tindakan link untuk membuat arsip dsym terkompresi, lalu mendekompresi arsip tersebut untuk menghasilkan paket aplikasi dan file .plist yang dapat digunakan oleh Xcode.

Dengan Bazel, proses ini dapat diimplementasikan sebagai berikut, dengan unbundle-debuginfo menjadi 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 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"],
                    ),
                ],
            ),
      ],
    ),
]

Tandai grup

CcToolchainConfigInfo memungkinkan Anda memaketkan tanda 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 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 tanda yang perlu diulang dengan nilai yang berbeda saat ditambahkan ke perintah build, grup tanda 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 di daftar include_paths. Semua tanda (atau flag_group) dalam isi deklarasi grup tanda diperluas sebagai satu unit. Contoh:

flag_group (
    iterate_over = "include_paths",
    flags = ["-I", "%{include_paths}"],
)

diperluas ke -I <path> untuk setiap elemen jalur di 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 sesuai dengan struktur yang dapat diakses menggunakan notasi titik. Contoh:

flag_group (
    flags = ["-l%{libraries_to_link.name}"],
)

Struktur dapat disarangkan dan juga dapat berisi urutan. Untuk mencegah konflik nama dan memperjelasnya, Anda harus menentukan jalur lengkap yang dilalui 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 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 menyediakan referensi tentang variabel build, fitur, dan informasi lain yang diperlukan agar berhasil mengonfigurasi aturan C++.

Variabel build CcToolchainConfigInfo

Berikut adalah referensi dari variabel build CcToolchainConfigInfo.

Variabel Tindakan Deskripsi
source_file compile File sumber yang akan dikompilasi.
input_file strip Artefak untuk dihapus.
output_file kompilasi, hapus Output kompilasi.
output_assembly_file compile File assembly yang dimunculkan. Hanya berlaku saat tindakan compile memunculkan teks assembly, biasanya saat menggunakan tanda --save_temps. Isinya sama seperti untuk output_file.
output_preprocess_file compile Output yang telah diproses sebelumnya. Hanya berlaku untuk mengompilasi tindakan yang hanya melakukan prapemrosesan file sumber, biasanya saat menggunakan tanda --save_temps. Isinya sama seperti untuk 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 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 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 tanda dari kolom CROSSTOOL lama unfiltered_cxx_flag atau fitur unfiltered_compile_flags. Keduanya tidak difilter oleh atribut aturan nocopts.
sysroot sysroot.
runtime_library_search_directories tautkan Entri dalam jalur penelusuran runtime linker (biasanya ditetapkan dengan flag -rpath).
library_search_directories tautkan Entri di jalur penelusuran penaut (biasanya ditetapkan dengan flag -L).
libraries_to_link tautkan Tanda yang menyediakan file untuk ditautkan sebagai input dalam pemanggilan penaut.
def_file_path tautkan Lokasi file def yang digunakan di Windows dengan MSVC.
linker_param_file tautkan Lokasi file parameter penaut yang dibuat oleh bazel untuk mengatasi batas panjang command line.
output_execpath tautkan Execpath dari output linker.
generate_interface_library tautkan "yes" atau "no" bergantung pada apakah library antarmuka harus dibuat.
interface_library_builder_path tautkan Jalur ke alat builder library antarmuka.
interface_library_input_path tautkan Input untuk alat builder ifso library antarmuka.
interface_library_output_path tautkan Jalur tempat membuat library antarmuka menggunakan alat builder ifso.
legacy_link_flags tautkan Flag linker yang berasal dari kolom CROSSTOOL lama.
user_link_flags tautkan Flag linker yang berasal dari atribut --linkopt atau linkopts.
linkstamp_paths tautkan Variabel build yang memberikan jalur linkstamp.
force_pic tautkan Kehadiran variabel ini menunjukkan bahwa kode PIC/PIE harus dibuat (opsi Bazel `--force_pic` diteruskan).
strip_debug_symbols tautkan Kehadiran variabel ini menunjukkan bahwa simbol debug harus dihilangkan.
is_cc_test tautkan Benar jika tindakan saat ini adalah tindakan penautan cc_test, false jika tidak.
is_using_fission kompilasi, tautan Kehadiran variabel ini menunjukkan bahwa fisi (info debug per objek) diaktifkan. Info debug akan tersedia dalam file .dwo, bukan file .o, dan compiler dan penaut harus mengetahui hal ini.
fdo_instrument_path kompilasi, tautan 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, tautan Jalur ke direktori yang menyimpan profil instrumentasi FDO yang sensitif 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 ditentukan 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, melainkan menggunakan opsi penaut --start-lib/--end-lib untuk menautkan secara langsung ke objek. Hal ini akan mempercepat build karena Bazel tidak perlu mem-build library statis.
supports_interface_shared_libraries Jika diaktifkan (dan opsi --interface_shared_objects ditetapkan), Bazel akan menautkan target yang linkstatic-nya ditetapkan ke Salah (cc_test secara default) ke library bersama antarmuka. Hal ini membuat penautan ulang inkremental lebih cepat.
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 penggunaan 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 tersebut diaktifkan. Jika fitur tersebut 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++ saat 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 untuk 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 toolchain lebih mandiri.