Aturan C / C++

Laporkan masalah Lihat sumber Nightly · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

Aturan

cc_binary

Lihat sumber aturan
cc_binary(name, deps, srcs, data, additional_linker_inputs, args, compatible_with, conlyopts, copts, cxxopts, defines, deprecation, dynamic_deps, env, exec_compatible_with, exec_group_compatible_with, exec_properties, features, hdrs_check, includes, licenses, link_extra_lib, linkopts, linkshared, linkstatic, local_defines, malloc, module_interfaces, nocopts, output_licenses, package_metadata, reexport_deps, restricted_to, stamp, tags, target_compatible_with, testonly, toolchains, visibility, win_def_file)

Tindakan ini akan menghasilkan biner yang dapat dieksekusi.


name target harus sama dengan nama file sumber yang merupakan titik entri utama aplikasi (tanpa ekstensi). Misalnya, jika titik entri Anda berada di main.cc, nama Anda harus main.

Target output implisit

  • name.stripped (hanya dibuat jika diminta secara eksplisit): Versi biner yang dihilangkan. strip -g dijalankan pada biner untuk menghapus simbol debug. Opsi penghapusan tambahan dapat diberikan di command line menggunakan --stripopt=-foo.
  • name.dwp (hanya dibuat jika diminta secara eksplisit): Jika Fission diaktifkan: file paket informasi debug yang cocok untuk men-debug biner yang di-deploy dari jarak jauh. Lainnya: file kosong.

Argumen

Atribut
name

Nama; wajib

Nama unik untuk target ini.

deps

Daftar label; defaultnya adalah []

Daftar library lain yang akan ditautkan ke target biner.

Target ini dapat berupa cc_library atau objc_library.

Anda juga diizinkan untuk menempatkan skrip linker (.lds) ke dalam deps, dan mereferensikannya di linkopts, tetapi sebaiknya pertimbangkan additional_linker_inputs untuk kasus penggunaan tersebut.
srcs

Daftar label; defaultnya adalah []

Daftar file C dan C++ yang diproses untuk membuat target library. Ini adalah file sumber dan header C/C++, baik yang tidak dibuat (kode sumber normal) maupun yang dibuat.

Semua file .cc, .c, dan .cpp akan dikompilasi. Ini mungkin file yang dibuat: jika file bernama ada di outs aturan lain, cc_library ini akan otomatis bergantung pada aturan lain tersebut.

File assembler murni (.s, .asm) tidak diproses sebelumnya dan biasanya dibuat menggunakan assembler. File assembly yang telah diproses sebelumnya (.S) diproses sebelumnya dan biasanya dibangun menggunakan compiler C/C++.

File .h tidak akan dikompilasi, tetapi akan tersedia untuk disertakan oleh sumber dalam aturan ini. File .cc dan .h dapat secara langsung menyertakan header yang tercantum dalam srcs ini atau dalam hdrs aturan ini atau aturan apa pun yang tercantum dalam argumen deps.

Semua file #included harus disebutkan dalam atribut hdrs dari aturan ini atau aturan cc_library yang dirujuk, atau file tersebut harus dicantumkan dalam srcs jika bersifat pribadi untuk library ini. Lihat "Pemeriksaan penyertaan header" untuk deskripsi yang lebih mendetail.

File .so, .lo, dan .a adalah file yang telah dikompilasi sebelumnya. Library Anda mungkin memiliki hal ini sebagai srcs jika menggunakan kode pihak ketiga yang kode sumbernya tidak kami miliki.

Jika atribut srcs menyertakan label aturan lain, cc_library akan menggunakan file output aturan tersebut sebagai file sumber untuk dikompilasi. Hal ini berguna untuk pembuatan kode sumber satu kali (untuk penggunaan yang lebih sering, sebaiknya terapkan class aturan Starlark dan gunakan API cc_common)

Jenis file srcs yang diizinkan:

  • File sumber C dan C++: .c, .cc, .cpp, .cxx, .c++, .C
  • File header C dan C++: .h, .hh, .hpp, .hxx, .inc, .inl, .H
  • Assembler dengan praprosesor C: .S
  • Arsip: .a, .pic.a
  • Pustaka "Selalu tautkan": .lo, .pic.lo
  • Pustaka bersama, dengan atau tanpa versi: .so, .so.version
  • File objek: .o, .pic.o

... dan aturan apa pun yang menghasilkan file tersebut (misalnya, cc_embed_data). Ekstensi yang berbeda menunjukkan bahasa pemrograman yang berbeda sesuai dengan konvensi gcc.

data

Daftar label; defaultnya adalah []

Daftar file yang diperlukan oleh library ini saat runtime. Lihat komentar umum tentang data di Atribut umum yang ditentukan oleh sebagian besar aturan build.

Jika data adalah nama file yang dibuat, maka aturan cc_library ini otomatis bergantung pada aturan pembuatan.

Jika data adalah nama aturan, maka aturan cc_library ini otomatis bergantung pada aturan tersebut, dan outs aturan tersebut otomatis ditambahkan ke file data cc_library ini.

Kode C++ Anda dapat mengakses file data ini seperti berikut:


  const std::string path = devtools_build::GetDataDependencyFilepath(
      "my/test/data/file");
additional_linker_inputs

Daftar label; defaultnya adalah []

Dependensi yang hanya tersedia untuk perintah linker C++.

Tidak seperti deps, yang secara konseptual dibuat untuk dependensi kompilasi dan penautan, additional_linker_inputs secara khusus dibuat hanya untuk yang terakhir, dan menandakan dependensi yang hanya diperlukan untuk penautan (misalnya, file yang dirujuk dalam linkopts).

Misalnya, file .res Windows yang dikompilasi dapat diberikan di sini untuk disematkan dalam target biner.

conlyopts

Daftar string; defaultnya adalah []

Tambahkan opsi ini ke perintah kompilasi C. Tunduk pada penggantian "Buat variabel" dan tokenisasi Bourne shell.
copts

Daftar string; defaultnya adalah []

Tambahkan opsi ini ke perintah kompilasi C/C++. Tunduk pada penggantian "Buat variabel" dan tokenisasi Bourne shell.

Setiap string dalam atribut ini ditambahkan dalam urutan tertentu ke COPTS sebelum mengompilasi target biner. Flag hanya berlaku untuk mengompilasi target ini, bukan dependensinya, jadi berhati-hatilah dengan file header yang disertakan di tempat lain. Semua jalur harus relatif terhadap ruang kerja, bukan terhadap paket saat ini. Atribut ini tidak diperlukan di luar third_party.

Jika paket mendeklarasikan fitur no_copts_tokenization, tokenisasi Bourne shell hanya berlaku untuk string yang terdiri dari satu variabel "Make".

cxxopts

Daftar string; defaultnya adalah []

Tambahkan opsi ini ke perintah kompilasi C++. Tunduk pada penggantian "Buat variabel" dan tokenisasi Bourne shell.
defines

Daftar string; defaultnya adalah []

Daftar definisi yang akan ditambahkan ke baris kompilasi target ini dan semua target dependen. Tunduk pada penggantian "Make" variable dan tokenisasi Bourne shell. Setiap string, yang harus terdiri dari satu token shell Bourne, diawali dengan -D dan ditambahkan ke command line kompilasi ke target ini, serta ke setiap aturan yang bergantung padanya. Berhati-hatilah, karena hal ini dapat memiliki efek yang luas -- definisi ditambahkan ke setiap target yang bergantung pada target ini. Jika ragu, tambahkan nilai yang ditentukan ke local_defines.
dynamic_deps

Daftar label; defaultnya adalah []

Ini adalah dependensi cc_shared_library lain yang bergantung pada target saat ini.

Implementasi cc_shared_library akan menggunakan daftar dynamic_deps (secara transitif, yaitu juga dynamic_deps dari dynamic_deps target saat ini) untuk memutuskan cc_libraries mana dalam deps transitif yang tidak boleh ditautkan karena sudah disediakan oleh cc_shared_library yang berbeda.

hdrs_check

String; default-nya adalah ""

Tidak digunakan lagi, tanpa pengoperasian.
includes

Daftar string; defaultnya adalah []

Daftar direktori include yang akan ditambahkan ke baris kompilasi. Tunduk pada penggantian "Buat variabel". Setiap string diawali dengan jalur paket dan diteruskan ke toolchain C++ untuk perluasan melalui fitur CROSSTOOL "include_paths". Toolchain yang berjalan di sistem POSIX dengan definisi fitur umum akan menghasilkan -isystem path_to_package/include_entry. Ini hanya boleh digunakan untuk library pihak ketiga yang tidak sesuai dengan gaya penulisan pernyataan #include Google. Tidak seperti COPTS, tanda ini ditambahkan untuk aturan ini dan setiap aturan yang bergantung padanya. (Catatan: bukan aturan yang bergantung padanya.) Berhati-hatilah, karena hal ini dapat berdampak luas. Jika ragu, tambahkan tanda "-I" ke COPTS.

Jalur include yang ditambahkan akan menyertakan file yang dibuat serta file di hierarki sumber.

Label; defaultnya adalah "@bazel_tools//tools/cpp:link_extra_lib"

Mengontrol penautan library tambahan.

Secara default, biner C++ ditautkan dengan //tools/cpp:link_extra_lib, yang secara default bergantung pada tanda label //tools/cpp:link_extra_libs. Tanpa menyetel tanda, library ini kosong secara default. Menetapkan flag label memungkinkan penautan dependensi opsional, seperti penggantian untuk simbol lemah, interseptor untuk fungsi library bersama, atau library runtime khusus (untuk penggantian malloc, lebih baik malloc atau --custom_malloc). Menetapkan atribut ini ke None akan menonaktifkan perilaku ini.

linkopts

Daftar string; defaultnya adalah []

Tambahkan tanda ini ke perintah linker C++. Tunduk pada penggantian variabel"Merek", tokenisasi Bourne shell, dan perluasan label. Setiap string dalam atribut ini ditambahkan ke LINKOPTS sebelum menautkan target biner.

Setiap elemen dalam daftar ini yang tidak diawali dengan $ atau - dianggap sebagai label target di deps. Daftar file yang dihasilkan oleh target tersebut ditambahkan ke opsi linker. Error akan dilaporkan jika label tidak valid, atau tidak dideklarasikan di deps.

linkshared

Boolean; defaultnya adalah False

Buat pustaka bersama. Untuk mengaktifkan atribut ini, sertakan linkshared=True dalam aturan Anda. Secara default, opsi ini dinonaktifkan.

Kehadiran tanda ini berarti penautan terjadi dengan tanda -shared ke gcc, dan library bersama yang dihasilkan cocok untuk dimuat ke dalam, misalnya, program Java. Namun, untuk tujuan build, library ini tidak akan pernah ditautkan ke biner dependen, karena diasumsikan bahwa library bersama yang dibangun dengan aturan cc_binary hanya dimuat secara manual oleh program lain, sehingga tidak boleh dianggap sebagai pengganti aturan cc_library. Demi skalabilitas, sebaiknya hindari pendekatan ini dan biarkan java_library bergantung pada aturan cc_library saja.

Jika Anda menentukan linkopts=['-static'] dan linkshared=True, Anda akan mendapatkan satu unit yang sepenuhnya mandiri. Jika Anda menentukan linkstatic=True dan linkshared=True, Anda akan mendapatkan satu unit yang sebagian besar mandiri.

linkstatic

Boolean; defaultnya adalah True

Untuk cc_binary dan cc_test: tautkan biner dalam mode statis. Untuk cc_library.link_static: lihat di bawah.

Secara default, opsi ini aktif untuk cc_binary dan nonaktif untuk yang lainnya.

Jika diaktifkan dan ini adalah biner atau pengujian, opsi ini akan memberi tahu alat build untuk menautkan .a, bukan .so, untuk library pengguna jika memungkinkan. Library sistem seperti libc (tetapi bukan library runtime C/C++, lihat di bawah) masih ditautkan secara dinamis, seperti library yang tidak memiliki library statis. Jadi, file yang dapat dieksekusi yang dihasilkan akan tetap ditautkan secara dinamis, sehingga hanya sebagian besar statis.

Sebenarnya ada tiga cara berbeda untuk menautkan file yang dapat dieksekusi:

  • STATIS dengan fitur fully_static_link, yang semuanya ditautkan secara statis; misalnya, "gcc -static foo.o libbar.a libbaz.a -lm".
    Mode ini diaktifkan dengan menentukan fully_static_link dalam atribut features.
  • STATIC, yang semua library pengguna ditautkan secara statis (jika versi statis tersedia), tetapi library sistem (kecuali library runtime C/C++) ditautkan secara dinamis, misalnya "gcc foo.o libfoo.a libbaz.a -lm".
    Mode ini diaktifkan dengan menentukan linkstatic=True.
  • DINAMIS, yang semua librarynya ditautkan secara dinamis (jika versi dinamis tersedia), misalnya "gcc foo.o libfoo.so libbaz.so -lm".
    Mode ini diaktifkan dengan menentukan linkstatic=False.

Jika atribut linkstatic atau fully_static_link dalam features digunakan di luar //third_party sertakan komentar di dekat aturan untuk menjelaskan alasannya.

Atribut linkstatic memiliki arti yang berbeda jika digunakan pada aturan cc_library(). Untuk library C++, linkstatic=True menunjukkan bahwa hanya penautan statis yang diizinkan, sehingga tidak ada .so yang akan dihasilkan. linkstatic=False tidak mencegah pembuatan library statis. Atribut ini dimaksudkan untuk mengontrol pembuatan library dinamis.

Seharusnya hanya ada sedikit kode yang dibangun dengan linkstatic=False dalam produksi. Jika linkstatic=False, alat build akan membuat link simbolik ke library bersama yang bergantung di area *.runfiles.

local_defines

Daftar string; defaultnya adalah []

Daftar definisi yang akan ditambahkan ke baris kompilasi. Tunduk pada penggantian "Make" variable dan tokenisasi Bourne shell. Setiap string, yang harus terdiri dari satu token shell Bourne, diawali dengan -D dan ditambahkan ke command line kompilasi untuk target ini, tetapi tidak untuk dependensinya. Tidak seperti defines, definisi hanya ditambahkan ke baris perintah kompilasi untuk target ini.
malloc

Label; defaultnya adalah "@bazel_tools//tools/cpp:malloc"

Mengganti dependensi default pada malloc.

Secara default, biner C++ ditautkan dengan //tools/cpp:malloc, yang merupakan library kosong sehingga biner akhirnya menggunakan malloc libc. Label ini harus merujuk ke cc_library. Jika kompilasi ditujukan untuk aturan non-C++, opsi ini tidak akan berpengaruh. Nilai atribut ini diabaikan jika linkshared=True ditentukan.

module_interfaces

Daftar label; defaultnya adalah []

Daftar file dianggap sebagai Antarmuka Modul C++20.

Standar C++ tidak memiliki batasan tentang ekstensi file antarmuka modul

  • Penggunaan cppm Clang
  • GCC dapat menggunakan ekstensi file sumber apa pun
  • MSVC menggunakan ixx

Penggunaan dilindungi oleh flag --experimental_cpp_modules.

nocopts

String; default-nya adalah ""

Hapus opsi yang cocok dari perintah kompilasi C++. Tunduk pada penggantian variabel "Make". Nilai atribut ini ditafsirkan sebagai ekspresi reguler. COPTS yang sudah ada dan cocok dengan ekspresi reguler ini (termasuk nilai yang ditentukan secara eksplisit dalam atribut copts aturan) akan dihapus dari COPTS untuk tujuan mengompilasi aturan ini. Atribut ini tidak diperlukan atau digunakan di luar third_party. Nilai tidak diproses sebelumnya dengan cara apa pun selain penggantian variabel "Make".
reexport_deps

Daftar label; defaultnya adalah []

stamp

Bilangan bulat; defaultnya adalah -1

Apakah akan mengenkode informasi build ke dalam biner. Nilai yang mungkin:
  • stamp = 1: Selalu stempel informasi build ke dalam biner, bahkan dalam build --nostamp. Setelan ini harus dihindari, karena berpotensi menghentikan penyimpanan cache jarak jauh untuk biner dan tindakan hilir yang bergantung padanya.
  • stamp = 0: Selalu ganti informasi build dengan nilai konstanta. Hal ini memberikan penyiapan cache hasil build yang baik.
  • stamp = -1: Penyematan informasi build dikontrol oleh flag --[no]stamp.

Biner yang diberi stempel tidak dibangun ulang kecuali jika dependensinya berubah.

win_def_file

Label; defaultnya adalah None

File DEF Windows yang akan diteruskan ke linker.

Atribut ini hanya boleh digunakan jika Windows adalah platform target. Opsi ini dapat digunakan untuk mengekspor simbol selama penautan library bersama.

cc_import

Lihat sumber aturan
cc_import(name, deps, data, hdrs, alwayslink, compatible_with, deprecation, exec_compatible_with, exec_group_compatible_with, exec_properties, features, includes, interface_library, linkopts, objects, package_metadata, pic_objects, pic_static_library, restricted_to, shared_library, static_library, strip_include_prefix, system_provided, tags, target_compatible_with, testonly, toolchains, visibility)

Aturan cc_import memungkinkan pengguna mengimpor library C/C++ yang telah dikompilasi sebelumnya.

Berikut adalah kasus penggunaan umum:
1. Menautkan library statis


cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  static_library = "libmylib.a",
  # If alwayslink is turned on,
  # libmylib.a will be forcely linked into any binary that depends on it.
  # alwayslink = True,
)
2. Menautkan library bersama (Unix)

cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  shared_library = "libmylib.so",
)
3. Menautkan library bersama dengan library antarmuka

Di Unix:


cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  # libmylib.ifso is an interface library for libmylib.so which will be passed to linker
  interface_library = "libmylib.ifso",
  # libmylib.so will be available for runtime
  shared_library = "libmylib.so",
)

Di Windows:


cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  # mylib.lib is an import library for mylib.dll which will be passed to linker
  interface_library = "mylib.lib",
  # mylib.dll will be available for runtime
  shared_library = "mylib.dll",
)
4. Menautkan library bersama dengan system_provided=True

Di Unix:


cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  interface_library = "libmylib.ifso", # Or we can also use libmylib.so as its own interface library
  # libmylib.so is provided by system environment, for example it can be found in LD_LIBRARY_PATH.
  # This indicates that Bazel is not responsible for making libmylib.so available.
  system_provided = True,
)

Di Windows:


cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  # mylib.lib is an import library for mylib.dll which will be passed to linker
  interface_library = "mylib.lib",
  # mylib.dll is provided by system environment, for example it can be found in PATH.
  # This indicates that Bazel is not responsible for making mylib.dll available.
  system_provided = True,
)
5. Menautkan ke library statis atau bersama

Di Unix:


cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  static_library = "libmylib.a",
  shared_library = "libmylib.so",
)

Di Windows:


cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  static_library = "libmylib.lib", # A normal static library
  interface_library = "mylib.lib", # An import library for mylib.dll
  shared_library = "mylib.dll",
)

Sisanya sama di Unix dan Windows:


# first will link to libmylib.a (or libmylib.lib)
cc_binary(
  name = "first",
  srcs = ["first.cc"],
  deps = [":mylib"],
  linkstatic = True, # default value
)

# second will link to libmylib.so (or libmylib.lib)
cc_binary(
  name = "second",
  srcs = ["second.cc"],
  deps = [":mylib"],
  linkstatic = False,
)

cc_import mendukung atribut include. Contoh:


cc_import(
  name = "curl_lib",
  hdrs = glob(["vendor/curl/include/curl/*.h"]),
  includes = ["vendor/curl/include"],
  shared_library = "vendor/curl/lib/.libs/libcurl.dylib",
)

Argumen

Atribut
name

Nama; wajib

Nama unik untuk target ini.

deps

Daftar label; defaultnya adalah []

Daftar library lain yang menjadi tempat bergantung target. Lihat komentar umum tentang deps di Atribut umum yang ditentukan oleh sebagian besar aturan build.
hdrs

Daftar label; defaultnya adalah []

Daftar file header yang dipublikasikan oleh library yang telah dikompilasi sebelumnya ini untuk disertakan langsung oleh sumber dalam aturan dependen.

Boolean; defaultnya adalah False

Jika 1, biner apa pun yang bergantung (secara langsung atau tidak langsung) pada library yang telah dikompilasi sebelumnya C++ ini akan menautkan semua file objek yang diarsipkan dalam library statis, meskipun beberapa di antaranya tidak berisi simbol yang dirujuk oleh biner. Hal ini berguna jika kode Anda tidak dipanggil secara eksplisit oleh kode dalam biner, misalnya, jika kode Anda mendaftar untuk menerima beberapa callback yang disediakan oleh beberapa layanan.

Jika alwayslink tidak berfungsi dengan VS 2017 di Windows, hal itu disebabkan oleh masalah yang diketahui, upgrade VS 2017 Anda ke versi terbaru.

includes

Daftar string; defaultnya adalah []

Daftar direktori include yang akan ditambahkan ke baris kompilasi. Tunduk pada penggantian "Buat variabel". Setiap string diawali dengan jalur paket dan diteruskan ke toolchain C++ untuk perluasan melalui fitur CROSSTOOL "include_paths". Toolchain yang berjalan di sistem POSIX dengan definisi fitur umum akan menghasilkan -isystem path_to_package/include_entry. Ini hanya boleh digunakan untuk library pihak ketiga yang tidak sesuai dengan gaya penulisan pernyataan #include Google. Tidak seperti COPTS, tanda ini ditambahkan untuk aturan ini dan setiap aturan yang bergantung padanya. (Catatan: bukan aturan yang bergantung padanya.) Berhati-hatilah, karena hal ini dapat berdampak luas. Jika ragu, tambahkan tanda "-I" ke COPTS.

Jalur include default tidak menyertakan file yang dibuat. Jika Anda perlu #include file header yang dihasilkan, cantumkan di srcs.

interface_library

Label; defaultnya adalah None

Library antarmuka tunggal untuk menautkan library bersama.

Jenis file yang diizinkan: .ifso, .tbd, .lib, .so atau .dylib

linkopts

Daftar string; defaultnya adalah []

Tambahkan tanda ini ke perintah linker C++. Tunduk pada penggantian variabel"Merek", tokenisasi Bourne shell, dan perluasan label. Setiap string dalam atribut ini ditambahkan ke LINKOPTS sebelum menautkan target biner.

Setiap elemen dalam daftar ini yang tidak diawali dengan $ atau - dianggap sebagai label target di deps. Daftar file yang dihasilkan oleh target tersebut ditambahkan ke opsi linker. Error akan dilaporkan jika label tidak valid, atau tidak dideklarasikan di deps.

objects

Daftar label; defaultnya adalah []

pic_objects

Daftar label; defaultnya adalah []

pic_static_library

Label; defaultnya adalah None

shared_library

Label; defaultnya adalah None

Satu library bersama yang telah dikompilasi sebelumnya. Bazel memastikan bahwa library tersedia untuk biner yang bergantung padanya selama runtime.

Jenis file yang diizinkan: .so, .dll atau .dylib

static_library

Label; defaultnya adalah None

Satu library statis yang telah dikompilasi sebelumnya.

Jenis file yang diizinkan: .a, .pic.a atau .lib

strip_include_prefix

String; default-nya adalah ""

Awalan yang akan dihapus dari jalur header aturan ini.

Jika ditetapkan, header dalam atribut hdrs aturan ini dapat diakses di jalur dengan awalan ini yang dihilangkan.

Jika berupa jalur relatif, jalur tersebut akan dianggap sebagai jalur relatif paket. Jika berupa jalur absolut, jalur tersebut dipahami sebagai jalur relatif repositori.

Awalan dalam atribut include_prefix ditambahkan setelah awalan ini dihapus.

Atribut ini hanya sah berdasarkan third_party.

system_provided

Boolean; defaultnya adalah False

Jika 1, ini menunjukkan bahwa library bersama yang diperlukan saat runtime disediakan oleh sistem. Dalam hal ini, interface_library harus ditentukan dan shared_library harus kosong.

cc_library

Lihat sumber aturan
cc_library(name, deps, srcs, data, hdrs, additional_compiler_inputs, additional_linker_inputs, alwayslink, compatible_with, conlyopts, copts, cxxopts, defines, deprecation, exec_compatible_with, exec_group_compatible_with, exec_properties, features, hdrs_check, implementation_deps, include_prefix, includes, licenses, linkopts, linkstamp, linkstatic, local_defines, module_interfaces, package_metadata, restricted_to, strip_include_prefix, tags, target_compatible_with, testonly, textual_hdrs, toolchains, visibility, win_def_file)

Gunakan cc_library() untuk library yang dikompilasi C++. Hasilnya adalah .so, .lo, atau .a, bergantung pada apa yang diperlukan.

Jika Anda membuat sesuatu dengan penautan statis yang bergantung pada cc_library, output aturan library yang bergantung adalah file .a. Jika Anda menentukan alwayslink=True, Anda akan mendapatkan file .lo.

Nama file output sebenarnya adalah libfoo.so untuk library bersama, dengan foo adalah nama aturan. Jenis library lainnya diakhiri dengan .lo dan .a. Jika Anda memerlukan nama library bersama tertentu, misalnya, untuk menentukan modul Python, gunakan genrule untuk menyalin library ke nama yang diinginkan.

Pemeriksaan penyertaan header

Semua file header yang digunakan dalam build harus dideklarasikan dalam hdrs atau srcs aturan cc_*. Hal ini diterapkan.

Untuk aturan cc_library, header di hdrs terdiri dari antarmuka publik library dan dapat disertakan secara langsung dari file di hdrs dan srcs library itu sendiri serta dari file di hdrs dan srcs aturan cc_* yang mencantumkan library dalam deps-nya. Header di srcs hanya boleh disertakan langsung dari file di hdrs dan srcs library itu sendiri. Saat memutuskan apakah akan memasukkan header ke hdrs atau srcs, Anda harus bertanya apakah Anda ingin konsumen library ini dapat menyertakannya secara langsung. Keputusan ini hampir sama dengan antara visibilitas public dan private dalam bahasa pemrograman.

Aturan cc_binary dan cc_test tidak memiliki antarmuka yang diekspor, sehingga tidak memiliki atribut hdrs. Semua header yang termasuk dalam biner atau pengujian secara langsung harus dicantumkan di srcs.

Untuk mengilustrasikan aturan ini, lihat contoh berikut.


cc_binary(
    name = "foo",
    srcs = [
        "foo.cc",
        "foo.h",
    ],
    deps = [":bar"],
)

cc_library(
    name = "bar",
    srcs = [
        "bar.cc",
        "bar-impl.h",
    ],
    hdrs = ["bar.h"],
    deps = [":baz"],
)

cc_library(
    name = "baz",
    srcs = [
        "baz.cc",
        "baz-impl.h",
    ],
    hdrs = ["baz.h"],
)

Penyertaan langsung yang diizinkan dalam contoh ini tercantum dalam tabel di bawah. Misalnya, foo.cc diizinkan untuk menyertakan foo.h dan bar.h secara langsung, tetapi tidak baz.h.

Termasuk filePencantuman yang diizinkan
foo.hbar.h
foo.ccfoo.h bar.h
bar.hbar-impl.h baz.h
bar-impl.hbar.h baz.h
bar.ccbar.h bar-impl.h baz.h
baz.hbaz-impl.h
baz-impl.hbaz.h
baz.ccbaz.h baz-impl.h

Aturan pemeriksaan penyertaan hanya berlaku untuk penyertaan langsung. Dalam contoh di atas, foo.cc diizinkan untuk menyertakan bar.h, yang dapat menyertakan baz.h, yang pada gilirannya diizinkan untuk menyertakan baz-impl.h. Secara teknis, kompilasi file .cc dapat secara transitif menyertakan file header apa pun di hdrs atau srcs dalam cc_library apa pun dalam penutupan transitif deps. Dalam kasus ini, compiler dapat membaca baz.h dan baz-impl.h saat mengompilasi foo.cc, tetapi foo.cc tidak boleh berisi #include "baz.h". Agar hal itu diizinkan, baz harus ditambahkan ke deps foo.

Bazel bergantung pada dukungan toolchain untuk menerapkan aturan pemeriksaan penyertaan. Fitur layering_check harus didukung oleh toolchain dan diminta secara eksplisit, misalnya melalui flag command line --features=layering_check atau parameter features dari fungsi package. Toolchain yang disediakan oleh Bazel hanya mendukung fitur ini dengan clang di Unix dan macOS.

Contoh


cc_library(
    name = "ast_inspector_lib",
    srcs = ["ast_inspector_lib.cc"],
    hdrs = ["ast_inspector_lib.h"],
    visibility = ["//visibility:public"],
    deps = ["//third_party/llvm/llvm/tools/clang:frontend"],
    # alwayslink as we want to be able to call things in this library at
    # debug time, even if they aren't used anywhere in the code.
    alwayslink = True,
)

Contoh berikut berasal dari third_party/python2_4_3/BUILD. Beberapa kode menggunakan library dl (untuk memuat library dinamis lain), jadi aturan ini menentukan opsi link -ldl untuk menautkan library dl.


cc_library(
    name = "python2_4_3",
    linkopts = [
        "-ldl",
        "-lutil",
    ],
    deps = ["//third_party/expat"],
)

Contoh berikut berasal dari third_party/kde/BUILD. Kami menyimpan file .so yang telah dibuat sebelumnya di depot. File header berada dalam subdirektori bernama include.


cc_library(
    name = "kde",
    srcs = [
        "lib/libDCOP.so",
        "lib/libkdesu.so",
        "lib/libkhtml.so",
        "lib/libkparts.so",
        ...more .so files...,
    ],
    includes = ["include"],
    deps = ["//third_party/X11"],
)

Contoh berikut berasal dari third_party/gles/BUILD. Kode pihak ketiga sering kali memerlukan beberapa defines dan linkopts.


cc_library(
    name = "gles",
    srcs = [
        "GLES/egl.h",
        "GLES/gl.h",
        "ddx.c",
        "egl.c",
    ],
    defines = [
        "USE_FLOAT",
        "__GL_FLOAT",
        "__GL_COMMON",
    ],
    linkopts = ["-ldl"],  # uses dlopen(), dl library
    deps = [
        "es",
        "//third_party/X11",
    ],
)

Argumen

Atribut
name

Nama; wajib

Nama unik untuk target ini.

deps

Daftar label; defaultnya adalah []

Daftar library lain yang menjadi tempat bergantung target library.

Target ini dapat berupa cc_library atau objc_library.

Lihat komentar umum tentang deps di Atribut umum yang ditentukan oleh sebagian besar aturan build.

Ini harus berupa nama aturan pustaka C++. Saat Anda membuat biner yang menautkan library aturan ini, Anda juga akan menautkan library di deps.

Meskipun bernama "deps", tidak semua klien library ini berada di sini. Dependensi data waktu proses berada di data. File sumber yang dihasilkan oleh aturan lain berada di srcs.

Untuk menautkan library pihak ketiga yang telah dikompilasi sebelumnya, tambahkan namanya ke srcs.

Untuk membuat dependensi pada sesuatu tanpa menautkannya ke library ini, tambahkan namanya ke data.

srcs

Daftar label; defaultnya adalah []

Daftar file C dan C++ yang diproses untuk membuat target library. Ini adalah file sumber dan header C/C++, baik yang tidak dibuat (kode sumber normal) maupun yang dibuat.

Semua file .cc, .c, dan .cpp akan dikompilasi. Ini mungkin file yang dibuat: jika file bernama ada di outs aturan lain, cc_library ini akan otomatis bergantung pada aturan lain tersebut.

File assembler murni (.s, .asm) tidak diproses sebelumnya dan biasanya dibuat menggunakan assembler. File assembly yang telah diproses sebelumnya (.S) diproses sebelumnya dan biasanya dibangun menggunakan compiler C/C++.

File .h tidak akan dikompilasi, tetapi akan tersedia untuk disertakan oleh sumber dalam aturan ini. File .cc dan .h dapat secara langsung menyertakan header yang tercantum dalam srcs ini atau dalam hdrs aturan ini atau aturan apa pun yang tercantum dalam argumen deps.

Semua file #included harus disebutkan dalam atribut hdrs dari aturan ini atau aturan cc_library yang dirujuk, atau file tersebut harus dicantumkan dalam srcs jika bersifat pribadi untuk library ini. Lihat "Pemeriksaan penyertaan header" untuk deskripsi yang lebih mendetail.

File .so, .lo, dan .a adalah file yang telah dikompilasi sebelumnya. Library Anda mungkin memiliki hal ini sebagai srcs jika menggunakan kode pihak ketiga yang kode sumbernya tidak kami miliki.

Jika atribut srcs menyertakan label aturan lain, cc_library akan menggunakan file output aturan tersebut sebagai file sumber untuk dikompilasi. Hal ini berguna untuk pembuatan kode sumber satu kali (untuk penggunaan yang lebih sering, sebaiknya terapkan class aturan Starlark dan gunakan API cc_common)

Jenis file srcs yang diizinkan:

  • File sumber C dan C++: .c, .cc, .cpp, .cxx, .c++, .C
  • File header C dan C++: .h, .hh, .hpp, .hxx, .inc, .inl, .H
  • Assembler dengan praprosesor C: .S
  • Arsip: .a, .pic.a
  • Pustaka "Selalu tautkan": .lo, .pic.lo
  • Pustaka bersama, dengan atau tanpa versi: .so, .so.version
  • File objek: .o, .pic.o

... dan aturan apa pun yang menghasilkan file tersebut (misalnya, cc_embed_data). Ekstensi yang berbeda menunjukkan bahasa pemrograman yang berbeda sesuai dengan konvensi gcc.

data

Daftar label; defaultnya adalah []

Daftar file yang diperlukan oleh library ini saat runtime. Lihat komentar umum tentang data di Atribut umum yang ditentukan oleh sebagian besar aturan build.

Jika data adalah nama file yang dibuat, maka aturan cc_library ini otomatis bergantung pada aturan pembuatan.

Jika data adalah nama aturan, maka aturan cc_library ini otomatis bergantung pada aturan tersebut, dan outs aturan tersebut otomatis ditambahkan ke file data cc_library ini.

Kode C++ Anda dapat mengakses file data ini seperti berikut:


  const std::string path = devtools_build::GetDataDependencyFilepath(
      "my/test/data/file");
hdrs

Daftar label; defaultnya adalah []

Daftar file header yang dipublikasikan oleh library ini untuk disertakan langsung oleh sumber dalam aturan dependen.

Ini adalah lokasi yang sangat disarankan untuk mendeklarasikan file header yang menjelaskan antarmuka untuk library. Header ini akan tersedia untuk disertakan oleh sumber dalam aturan ini atau dalam aturan dependen. Header yang tidak dimaksudkan untuk disertakan oleh klien library ini harus dicantumkan dalam atribut srcs, meskipun header tersebut disertakan oleh header yang dipublikasikan. Lihat "Pemeriksaan penyertaan header" untuk deskripsi yang lebih mendetail.

Jenis file headers yang diizinkan: .h, .hh, .hpp, .hxx.

additional_compiler_inputs

Daftar label; defaultnya adalah []

File tambahan apa pun yang mungkin ingin Anda teruskan ke command line compiler, seperti daftar pengecualian sanitizer. File yang ditentukan di sini kemudian dapat digunakan dalam copts dengan fungsi $(location).
additional_linker_inputs

Daftar label; defaultnya adalah []

Dependensi yang hanya tersedia untuk perintah linker C++.

Tidak seperti deps, yang secara konseptual dibuat untuk dependensi kompilasi dan penautan, additional_linker_inputs secara khusus dibuat hanya untuk yang terakhir, dan menandakan dependensi yang hanya diperlukan untuk penautan (misalnya, file yang dirujuk dalam linkopts).

Misalnya, file .res Windows yang dikompilasi dapat diberikan di sini untuk disematkan dalam target biner.

Boolean; defaultnya adalah False

Jika 1, biner apa pun yang bergantung (secara langsung atau tidak langsung) pada library C++ ini akan menautkan semua file objek untuk file yang tercantum dalam srcs, meskipun beberapa tidak berisi simbol yang dirujuk oleh biner. Hal ini berguna jika kode Anda tidak dipanggil secara eksplisit oleh kode dalam biner, misalnya, jika kode Anda mendaftar untuk menerima beberapa callback yang disediakan oleh beberapa layanan.

Jika alwayslink tidak berfungsi dengan VS 2017 di Windows, hal itu disebabkan oleh masalah yang diketahui, upgrade VS 2017 Anda ke versi terbaru.

conlyopts

Daftar string; defaultnya adalah []

Tambahkan opsi ini ke perintah kompilasi C. Tunduk pada penggantian "Buat variabel" dan tokenisasi Bourne shell.
copts

Daftar string; defaultnya adalah []

Tambahkan opsi ini ke perintah kompilasi C/C++. Tunduk pada penggantian "Buat variabel" dan tokenisasi Bourne shell.

Setiap string dalam atribut ini ditambahkan dalam urutan tertentu ke COPTS sebelum mengompilasi target biner. Flag hanya berlaku untuk mengompilasi target ini, bukan dependensinya, jadi berhati-hatilah dengan file header yang disertakan di tempat lain. Semua jalur harus relatif terhadap ruang kerja, bukan terhadap paket saat ini. Atribut ini tidak diperlukan di luar third_party.

Jika paket mendeklarasikan fitur no_copts_tokenization, tokenisasi Bourne shell hanya berlaku untuk string yang terdiri dari satu variabel "Make".

cxxopts

Daftar string; defaultnya adalah []

Tambahkan opsi ini ke perintah kompilasi C++. Tunduk pada penggantian "Buat variabel" dan tokenisasi Bourne shell.
defines

Daftar string; defaultnya adalah []

Daftar definisi yang akan ditambahkan ke baris kompilasi target ini dan semua target dependen. Tunduk pada penggantian "Make" variable dan tokenisasi Bourne shell. Setiap string, yang harus terdiri dari satu token shell Bourne, diawali dengan -D dan ditambahkan ke command line kompilasi ke target ini, serta ke setiap aturan yang bergantung padanya. Berhati-hatilah, karena hal ini dapat memiliki efek yang luas -- definisi ditambahkan ke setiap target yang bergantung pada target ini. Jika ragu, tambahkan nilai yang ditentukan ke local_defines.
hdrs_check

String; default-nya adalah ""

Tidak digunakan lagi, tanpa pengoperasian.
implementation_deps

Daftar label; defaultnya adalah []

Daftar library lain yang menjadi tempat bergantung target library. Tidak seperti dengan deps, header dan jalur include library ini (dan semua dependensi transitifnya) hanya digunakan untuk kompilasi library ini, dan bukan library yang bergantung padanya. Library yang ditentukan dengan implementation_deps masih ditautkan dalam target biner yang bergantung pada library ini.
include_prefix

String; default-nya adalah ""

Awalan yang akan ditambahkan ke jalur header aturan ini.

Jika disetel, header dalam atribut hdrs aturan ini dapat diakses pada nilai atribut ini yang ditambahkan ke jalur relatif repositorinya.

Awalan dalam atribut strip_include_prefix dihapus sebelum awalan ini ditambahkan.

Atribut ini hanya sah berdasarkan third_party.

includes

Daftar string; defaultnya adalah []

Daftar direktori include yang akan ditambahkan ke baris kompilasi. Tunduk pada penggantian "Buat variabel". Setiap string diawali dengan jalur paket dan diteruskan ke toolchain C++ untuk perluasan melalui fitur CROSSTOOL "include_paths". Toolchain yang berjalan di sistem POSIX dengan definisi fitur umum akan menghasilkan -isystem path_to_package/include_entry. Ini hanya boleh digunakan untuk library pihak ketiga yang tidak sesuai dengan gaya penulisan pernyataan #include Google. Tidak seperti COPTS, tanda ini ditambahkan untuk aturan ini dan setiap aturan yang bergantung padanya. (Catatan: bukan aturan yang bergantung padanya.) Berhati-hatilah, karena hal ini dapat berdampak luas. Jika ragu, tambahkan tanda "-I" ke COPTS.

Jalur include yang ditambahkan akan menyertakan file yang dibuat serta file di hierarki sumber.

linkopts

Daftar string; defaultnya adalah []

Lihat cc_binary.linkopts. Atribut linkopts juga diterapkan ke target apa pun yang bergantung, secara langsung atau tidak langsung, pada library ini melalui atribut deps (atau melalui atribut lain yang diperlakukan serupa: atribut malloc dari cc_binary). Opsi link dependensi lebih diprioritaskan daripada opsi link dependen (yaitu, opsi link dependensi muncul lebih dulu di command line). Linkopts yang ditentukan dalam --linkopt lebih diutamakan daripada linkopts aturan.

Perhatikan bahwa atribut linkopts hanya berlaku saat membuat file atau executable .so, bukan saat membuat file .a atau .lo. Jadi, jika atribut linkstatic=True ditetapkan, atribut linkopts tidak akan memengaruhi pembuatan library ini, hanya pada target lain yang bergantung pada library ini.

Selain itu, penting untuk diperhatikan bahwa opsi "-Wl,-soname" atau "-Xlinker -soname" tidak didukung dan tidak boleh ditentukan dalam atribut ini.

File .so yang dihasilkan oleh aturan cc_library tidak ditautkan dengan library yang menjadi dependensinya. Jika Anda mencoba membuat library bersama untuk digunakan di luar repositori utama, misalnya untuk penggunaan manual dengan dlopen() atau LD_PRELOAD, sebaiknya gunakan aturan cc_binary dengan atribut linkshared=True. Lihat cc_binary.linkshared.

linkstamp

Label; defaultnya adalah None

Mengompilasi dan menautkan file sumber C++ yang ditentukan secara bersamaan ke dalam biner akhir. Trik ini diperlukan untuk memasukkan informasi stempel waktu ke dalam biner; jika kita mengompilasi file sumber ke file objek dengan cara biasa, stempel waktu akan salah. Kompilasi linkstamp mungkin tidak menyertakan kumpulan flag compiler tertentu dan oleh karena itu tidak boleh bergantung pada header, opsi compiler, atau variabel build tertentu. Opsi ini hanya diperlukan dalam paket base.
linkstatic

Boolean; defaultnya adalah False

Untuk cc_binary dan cc_test: tautkan biner dalam mode statis. Untuk cc_library.link_static: lihat di bawah.

Secara default, opsi ini aktif untuk cc_binary dan nonaktif untuk yang lainnya.

Jika diaktifkan dan ini adalah biner atau pengujian, opsi ini akan memberi tahu alat build untuk menautkan .a, bukan .so, untuk library pengguna jika memungkinkan. Library sistem seperti libc (tetapi bukan library runtime C/C++, lihat di bawah) masih ditautkan secara dinamis, seperti library yang tidak memiliki library statis. Jadi, file yang dapat dieksekusi yang dihasilkan akan tetap ditautkan secara dinamis, sehingga hanya sebagian besar statis.

Sebenarnya ada tiga cara berbeda untuk menautkan file yang dapat dieksekusi:

  • STATIS dengan fitur fully_static_link, yang semuanya ditautkan secara statis; misalnya, "gcc -static foo.o libbar.a libbaz.a -lm".
    Mode ini diaktifkan dengan menentukan fully_static_link dalam atribut features.
  • STATIC, yang semua library pengguna ditautkan secara statis (jika versi statis tersedia), tetapi library sistem (kecuali library runtime C/C++) ditautkan secara dinamis, misalnya "gcc foo.o libfoo.a libbaz.a -lm".
    Mode ini diaktifkan dengan menentukan linkstatic=True.
  • DINAMIS, yang semua librarynya ditautkan secara dinamis (jika versi dinamis tersedia), misalnya "gcc foo.o libfoo.so libbaz.so -lm".
    Mode ini diaktifkan dengan menentukan linkstatic=False.

Jika atribut linkstatic atau fully_static_link dalam features digunakan di luar //third_party sertakan komentar di dekat aturan untuk menjelaskan alasannya.

Atribut linkstatic memiliki arti yang berbeda jika digunakan pada aturan cc_library(). Untuk library C++, linkstatic=True menunjukkan bahwa hanya penautan statis yang diizinkan, sehingga tidak ada .so yang akan dihasilkan. linkstatic=False tidak mencegah pembuatan library statis. Atribut ini dimaksudkan untuk mengontrol pembuatan library dinamis.

Seharusnya hanya ada sedikit kode yang dibangun dengan linkstatic=False dalam produksi. Jika linkstatic=False, alat build akan membuat link simbolik ke library bersama yang bergantung di area *.runfiles.

local_defines

Daftar string; defaultnya adalah []

Daftar definisi yang akan ditambahkan ke baris kompilasi. Tunduk pada penggantian "Make" variable dan tokenisasi Bourne shell. Setiap string, yang harus terdiri dari satu token shell Bourne, diawali dengan -D dan ditambahkan ke command line kompilasi untuk target ini, tetapi tidak untuk dependensinya. Tidak seperti defines, definisi hanya ditambahkan ke baris perintah kompilasi untuk target ini.
module_interfaces

Daftar label; defaultnya adalah []

Daftar file dianggap sebagai Antarmuka Modul C++20.

Standar C++ tidak memiliki batasan tentang ekstensi file antarmuka modul

  • Penggunaan cppm Clang
  • GCC dapat menggunakan ekstensi file sumber apa pun
  • MSVC menggunakan ixx

Penggunaan dilindungi oleh flag --experimental_cpp_modules.

strip_include_prefix

String; default-nya adalah ""

Awalan yang akan dihapus dari jalur header aturan ini.

Jika ditetapkan, header dalam atribut hdrs aturan ini dapat diakses di jalur dengan awalan ini yang dihilangkan.

Jika berupa jalur relatif, jalur tersebut akan dianggap sebagai jalur relatif paket. Jika berupa jalur absolut, jalur tersebut dipahami sebagai jalur relatif repositori.

Awalan dalam atribut include_prefix ditambahkan setelah awalan ini dihapus.

Atribut ini hanya sah berdasarkan third_party.

textual_hdrs

Daftar label; defaultnya adalah []

Daftar file header yang dipublikasikan oleh library ini untuk disertakan secara tekstual oleh sumber dalam aturan dependen.

Ini adalah lokasi untuk mendeklarasikan file header yang tidak dapat dikompilasi sendiri; artinya, file tersebut harus selalu disertakan secara tekstual oleh file sumber lain untuk membuat kode yang valid.

win_def_file

Label; defaultnya adalah None

File DEF Windows yang akan diteruskan ke linker.

Atribut ini hanya boleh digunakan jika Windows adalah platform target. Opsi ini dapat digunakan untuk mengekspor simbol selama penautan library bersama.

cc_shared_library

Lihat sumber aturan
cc_shared_library(name, deps, additional_linker_inputs, compatible_with, deprecation, dynamic_deps, exec_compatible_with, exec_group_compatible_with, exec_properties, exports_filter, features, package_metadata, restricted_to, roots, shared_lib_name, static_deps, tags, target_compatible_with, testonly, toolchains, user_link_flags, visibility, win_def_file)

Tindakan ini menghasilkan library bersama.

Contoh

cc_shared_library(
    name = "foo_shared",
    deps = [
        ":foo",
    ],
    dynamic_deps = [
        ":bar_shared",
    ],
    additional_linker_inputs = [
        ":foo.lds",
    ],
    user_link_flags = [
        "-Wl,--version-script=$(location :foo.lds)",
    ],
)
cc_library(
    name = "foo",
    srcs = ["foo.cc"],
    hdrs = ["foo.h"],
    deps = [
        ":bar",
        ":baz",
    ],
)
cc_shared_library(
    name = "bar_shared",
    shared_lib_name = "bar.so",
    deps = [":bar"],
)
cc_library(
    name = "bar",
    srcs = ["bar.cc"],
    hdrs = ["bar.h"],
)
cc_library(
    name = "baz",
    srcs = ["baz.cc"],
    hdrs = ["baz.h"],
)

Dalam contoh ini, foo_shared secara statis menautkan foo dan baz, yang terakhir adalah dependensi transitif. bar tidak ditautkan karena sudah disediakan secara dinamis oleh dynamic_dep bar_shared.

foo_shared menggunakan file *.lds skrip linker untuk mengontrol simbol mana yang harus diekspor. Logika aturan cc_shared_library tidak mengontrol simbol mana yang diekspor, tetapi hanya menggunakan apa yang diasumsikan diekspor untuk memberikan error selama fase analisis jika dua pustaka bersama mengekspor target yang sama.

Setiap dependensi langsung cc_shared_library diasumsikan diekspor. Oleh karena itu, selama analisis, Bazel mengasumsikan bahwa foo diekspor oleh foo_shared. baz tidak diasumsikan diekspor oleh foo_shared. Setiap target yang cocok dengan exports_filter juga diasumsikan diekspor.

Setiap cc_library dalam contoh harus muncul paling banyak di satu cc_shared_library. Jika ingin menautkan baz juga ke bar_shared, kita perlu menambahkan tags = ["LINKABLE_MORE_THAN_ONCE"] ke baz.

Karena atribut shared_lib_name, file yang dihasilkan oleh bar_shared akan memiliki nama bar.so, bukan nama libbar.so yang akan dimilikinya secara default di Linux.

Error

Two shared libraries in dependencies export the same symbols.

Hal ini akan terjadi setiap kali Anda membuat target dengan dua dependensi cc_shared_library berbeda yang mengekspor target yang sama. Untuk memperbaikinya, Anda harus menghentikan library agar tidak diekspor dalam salah satu dependensi cc_shared_library.

Hal ini akan terjadi setiap kali Anda membuat cc_shared_library baru dengan dua dependensi cc_shared_library berbeda yang menautkan target yang sama secara statis. Mirip dengan error pada ekspor.

Salah satu cara untuk memperbaikinya adalah dengan berhenti menautkan library ke salah satu dependensi cc_shared_library. Pada saat yang sama, yang masih menautkannya harus mengekspor library agar yang tidak menautkannya tetap dapat melihat simbol. Cara lainnya adalah dengan menarik library ketiga yang mengekspor target. Cara ketiga adalah menandai pelaku cc_library dengan LINKABLE_MORE_THAN_ONCE tetapi perbaikan ini jarang diperlukan dan Anda harus memastikan bahwa cc_library memang aman untuk ditautkan lebih dari sekali.

'//foo:foo' is already linked statically in '//bar:bar' but not exported`

Artinya, library dalam penutupan transitif deps Anda dapat dijangkau tanpa melalui salah satu dependensi cc_shared_library, tetapi sudah ditautkan ke cc_shared_library lain di dynamic_deps dan tidak diekspor.

Solusinya adalah mengekspornya dari dependensi cc_shared_library atau menarik cc_shared_library ketiga yang mengekspornya.

Do not place libraries which only contain a precompiled dynamic library in deps.

Jika Anda memiliki library dinamis yang telah dikompilasi sebelumnya, library ini tidak perlu dan tidak dapat ditautkan secara statis ke target cc_shared_library saat ini yang sedang Anda buat. Oleh karena itu, nilai ini tidak termasuk dalam deps dari cc_shared_library. Jika library dinamis yang telah dikompilasi sebelumnya ini adalah dependensi salah satu cc_libraries Anda, maka cc_library harus bergantung langsung padanya.

Trying to export a library already exported by a different shared library

Anda akan melihat error ini jika pada aturan saat ini Anda mengklaim untuk mengekspor target yang sudah diekspor oleh salah satu dependensi dinamis Anda.

Untuk memperbaikinya, hapus target dari deps dan hanya mengandalkannya dari dependensi dinamis atau pastikan exports_filter tidak menangkap target ini.

Argumen

Atribut
name

Nama; wajib

Nama unik untuk target ini.

deps

Daftar label; defaultnya adalah []

Library tingkat teratas yang akan ditautkan secara statis ke dalam library bersama tanpa syarat setelah diarsipkan secara keseluruhan.

Semua dependensi library transitif dari dependensi langsung ini akan ditautkan ke library bersama ini selama belum ditautkan oleh cc_shared_library di dynamic_deps.

Selama analisis, penerapan aturan akan mempertimbangkan setiap target yang tercantum di deps sebagai diekspor oleh library bersama untuk memberikan error saat beberapa cc_shared_libraries mengekspor target yang sama. Penerapan aturan tidak menangani pemberitahuan kepada linker tentang simbol mana yang harus diekspor oleh objek bersama. Pengguna harus menanganinya melalui skrip linker atau deklarasi visibilitas dalam kode sumber.

Implementasi ini juga akan memicu error setiap kali library yang sama ditautkan secara statis ke lebih dari satu cc_shared_library. Hal ini dapat dihindari dengan menambahkan "LINKABLE_MORE_THAN_ONCE" ke cc_library.tags atau dengan mencantumkan `cc_library` sebagai ekspor salah satu library bersama sehingga salah satunya dapat dijadikan dynamic_dep yang lain.

additional_linker_inputs

Daftar label; defaultnya adalah []

File tambahan yang mungkin ingin Anda teruskan ke linker, misalnya, skrip linker. Anda harus meneruskan secara terpisah flag penaut yang diperlukan penaut agar mengetahui file ini. Anda dapat melakukannya melalui atribut user_link_flags.
dynamic_deps

Daftar label; defaultnya adalah []

Ini adalah dependensi cc_shared_library lain yang bergantung pada target saat ini.

Implementasi cc_shared_library akan menggunakan daftar dynamic_deps (secara transitif, yaitu juga dynamic_deps dari dynamic_deps target saat ini) untuk memutuskan cc_libraries mana dalam deps transitif yang tidak boleh ditautkan karena sudah disediakan oleh cc_shared_library yang berbeda.

exports_filter

Daftar string; defaultnya adalah []

Atribut ini berisi daftar target yang diklaim diekspor oleh library bersama saat ini.

Semua target deps sudah dipahami sebagai diekspor oleh library bersama. Atribut ini harus digunakan untuk mencantumkan target apa pun yang diekspor oleh library bersama, tetapi merupakan dependensi transitif dari deps.

Perhatikan bahwa atribut ini sebenarnya tidak menambahkan tepi dependensi ke target tersebut, tepi dependensi harus dibuat oleh deps.Entri dalam atribut ini hanyalah string. Perlu diingat bahwa saat menempatkan target dalam atribut ini, ini dianggap sebagai klaim bahwa library bersama mengekspor simbol dari target tersebut. Logika cc_shared_library sebenarnya tidak menangani pemberitahuan kepada linker tentang simbol mana yang harus diekspor.

Sintaksis berikut diizinkan:

//foo:__pkg__ untuk memperhitungkan target apa pun di foo/BUILD

//foo:__subpackages__ untuk memperhitungkan target apa pun di foo/BUILD atau paket lain di bawah foo/ seperti foo/bar/BUILD

roots

Daftar label; defaultnya adalah []

shared_lib_name

String; default-nya adalah ""

Secara default, cc_shared_library akan menggunakan nama untuk file output library bersama berdasarkan nama target dan platform. Hal ini mencakup ekstensi dan terkadang awalan. Terkadang Anda mungkin tidak menginginkan nama default, misalnya, saat memuat library bersama C++ untuk Python, awalan lib* default sering kali tidak diinginkan. Dalam hal ini, Anda dapat menggunakan atribut ini untuk memilih nama kustom.
static_deps

Daftar string; defaultnya adalah []

Daftar string; defaultnya adalah []

Tanda tambahan yang mungkin ingin Anda teruskan ke linker. Misalnya, agar linker mengetahui skrip linker yang diteruskan melalui additional_linker_inputs, Anda dapat menggunakan kode berikut:

 cc_shared_library(
    name = "foo_shared",
    additional_linker_inputs = select({
      "//src/conditions:linux": [
        ":foo.lds",
        ":additional_script.txt",
      ],
      "//conditions:default": []}),
    user_link_flags = select({
      "//src/conditions:linux": [
        "-Wl,-rpath,kittens",
        "-Wl,--version-script=$(location :foo.lds)",
        "-Wl,--script=$(location :additional_script.txt)",
      ],
      "//conditions:default": []}),
      ...
 )
win_def_file

Label; defaultnya adalah None

File DEF Windows yang akan diteruskan ke linker.

Atribut ini hanya boleh digunakan jika Windows adalah platform target. Opsi ini dapat digunakan untuk mengekspor simbol selama penautan library bersama.

cc_static_library

Lihat sumber aturan
cc_static_library(name, deps, compatible_with, deprecation, exec_compatible_with, exec_group_compatible_with, exec_properties, features, package_metadata, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)
Menghasilkan library statis dari daftar target dan dependensi transitifnya.

Library statis yang dihasilkan berisi file objek target yang tercantum dalam deps serta dependensi transitifnya, dengan preferensi diberikan kepada objek PIC.

Grup output

linkdeps

File teks yang berisi label dependensi transitif target yang tercantum dalam deps yang tidak memberikan file objek apa pun ke library statis, tetapi menyediakan setidaknya satu library statis, dinamis, atau antarmuka. Library statis yang dihasilkan mungkin memerlukan ketersediaan library ini pada waktu penautan.

linkopts

File teks yang berisi linkopts yang disediakan pengguna dari semua dependensi transitif target yang tercantum dalam deps.

Simbol duplikat

Secara default, aturan cc_static_library memeriksa apakah library statis yang dihasilkan tidak berisi simbol duplikat. Jika ya, build akan gagal dengan pesan error yang mencantumkan simbol duplikat dan file objek yang memuatnya.

Pemeriksaan ini dapat dinonaktifkan per target atau per paket dengan menetapkan features = ["-symbol_check"] atau secara global melalui --features=-symbol_check.

Dukungan toolchain untuk symbol_check

Toolchain C++ yang dikonfigurasi otomatis dan disertakan dengan Bazel mendukung fitur symbol_check di semua platform. Toolchain kustom dapat menambahkan dukungan untuknya dengan salah satu dari dua cara:

  • Menerapkan tindakan ACTION_NAMES.validate_static_library dan mengaktifkannya dengan fitur symbol_check. Set alat dalam tindakan dipanggil dengan dua argumen, yaitu library statis untuk memeriksa simbol duplikat dan jalur file yang harus dibuat jika pemeriksaan berhasil.
  • Fitur symbol_check menambahkan flag pengarsip yang menyebabkan tindakan yang membuat library statis gagal pada simbol duplikat.

Argumen

Atribut
name

Nama; wajib

Nama unik untuk target ini.

deps

Daftar label; defaultnya adalah []

Daftar target yang akan digabungkan ke dalam library statis, termasuk semua dependensi transitifnya.

Dependensi yang tidak menyediakan file objek apa pun tidak disertakan dalam library statis, tetapi labelnya dikumpulkan dalam file yang disediakan oleh grup output linkdeps.

cc_test

Lihat sumber aturan
cc_test(name, deps, srcs, data, additional_linker_inputs, args, compatible_with, conlyopts, copts, cxxopts, defines, deprecation, dynamic_deps, env, env_inherit, exec_compatible_with, exec_group_compatible_with, exec_properties, features, flaky, hdrs_check, includes, licenses, link_extra_lib, linkopts, linkshared, linkstatic, local, local_defines, malloc, module_interfaces, nocopts, package_metadata, reexport_deps, restricted_to, shard_count, size, stamp, tags, target_compatible_with, testonly, timeout, toolchains, visibility, win_def_file)

Aturan cc_test() mengompilasi pengujian. Di sini, pengujian adalah wrapper biner di sekitar beberapa kode pengujian.

Secara default, pengujian C++ ditautkan secara dinamis.
Untuk menautkan pengujian unit secara statis, tentukan linkstatic=True. Sebaiknya beri komentar mengapa pengujian Anda memerlukan linkstatic; hal ini mungkin tidak jelas.

Target output implisit

  • name.stripped (hanya dibuat jika diminta secara eksplisit): Versi biner yang dihilangkan. strip -g dijalankan pada biner untuk menghapus simbol debug. Opsi penghapusan tambahan dapat diberikan di command line menggunakan --stripopt=-foo.
  • name.dwp (hanya dibuat jika diminta secara eksplisit): Jika Fission diaktifkan: file paket informasi debug yang cocok untuk men-debug biner yang di-deploy dari jarak jauh. Lainnya: file kosong.

Lihat argumen cc_binary(), kecuali argumen stamp ditetapkan ke 0 secara default untuk pengujian dan cc_test memiliki atribut tambahan yang umum untuk semua aturan pengujian (*_test).

Argumen

Atribut
name

Nama; wajib

Nama unik untuk target ini.

deps

Daftar label; defaultnya adalah []

Daftar library lain yang akan ditautkan ke target biner.

Target ini dapat berupa cc_library atau objc_library.

Anda juga diizinkan untuk menempatkan skrip linker (.lds) ke dalam deps, dan mereferensikannya di linkopts, tetapi sebaiknya pertimbangkan additional_linker_inputs untuk kasus penggunaan tersebut.
srcs

Daftar label; defaultnya adalah []

Daftar file C dan C++ yang diproses untuk membuat target library. Ini adalah file sumber dan header C/C++, baik yang tidak dibuat (kode sumber normal) maupun yang dibuat.

Semua file .cc, .c, dan .cpp akan dikompilasi. Ini mungkin file yang dibuat: jika file bernama ada di outs aturan lain, cc_library ini akan otomatis bergantung pada aturan lain tersebut.

File assembler murni (.s, .asm) tidak diproses sebelumnya dan biasanya dibuat menggunakan assembler. File assembly yang telah diproses sebelumnya (.S) diproses sebelumnya dan biasanya dibangun menggunakan compiler C/C++.

File .h tidak akan dikompilasi, tetapi akan tersedia untuk disertakan oleh sumber dalam aturan ini. File .cc dan .h dapat secara langsung menyertakan header yang tercantum dalam srcs ini atau dalam hdrs aturan ini atau aturan apa pun yang tercantum dalam argumen deps.

Semua file #included harus disebutkan dalam atribut hdrs dari aturan ini atau aturan cc_library yang dirujuk, atau file tersebut harus dicantumkan dalam srcs jika bersifat pribadi untuk library ini. Lihat "Pemeriksaan penyertaan header" untuk deskripsi yang lebih mendetail.

File .so, .lo, dan .a adalah file yang telah dikompilasi sebelumnya. Library Anda mungkin memiliki hal ini sebagai srcs jika menggunakan kode pihak ketiga yang kode sumbernya tidak kami miliki.

Jika atribut srcs menyertakan label aturan lain, cc_library akan menggunakan file output aturan tersebut sebagai file sumber untuk dikompilasi. Hal ini berguna untuk pembuatan kode sumber satu kali (untuk penggunaan yang lebih sering, sebaiknya terapkan class aturan Starlark dan gunakan API cc_common)

Jenis file srcs yang diizinkan:

  • File sumber C dan C++: .c, .cc, .cpp, .cxx, .c++, .C
  • File header C dan C++: .h, .hh, .hpp, .hxx, .inc, .inl, .H
  • Assembler dengan praprosesor C: .S
  • Arsip: .a, .pic.a
  • Pustaka "Selalu tautkan": .lo, .pic.lo
  • Pustaka bersama, dengan atau tanpa versi: .so, .so.version
  • File objek: .o, .pic.o

... dan aturan apa pun yang menghasilkan file tersebut (misalnya, cc_embed_data). Ekstensi yang berbeda menunjukkan bahasa pemrograman yang berbeda sesuai dengan konvensi gcc.

data

Daftar label; defaultnya adalah []

Daftar file yang diperlukan oleh library ini saat runtime. Lihat komentar umum tentang data di Atribut umum yang ditentukan oleh sebagian besar aturan build.

Jika data adalah nama file yang dibuat, maka aturan cc_library ini otomatis bergantung pada aturan pembuatan.

Jika data adalah nama aturan, maka aturan cc_library ini otomatis bergantung pada aturan tersebut, dan outs aturan tersebut otomatis ditambahkan ke file data cc_library ini.

Kode C++ Anda dapat mengakses file data ini seperti berikut:


  const std::string path = devtools_build::GetDataDependencyFilepath(
      "my/test/data/file");
additional_linker_inputs

Daftar label; defaultnya adalah []

Dependensi yang hanya tersedia untuk perintah linker C++.

Tidak seperti deps, yang secara konseptual dibuat untuk dependensi kompilasi dan penautan, additional_linker_inputs secara khusus dibuat hanya untuk yang terakhir, dan menandakan dependensi yang hanya diperlukan untuk penautan (misalnya, file yang dirujuk dalam linkopts).

Misalnya, file .res Windows yang dikompilasi dapat diberikan di sini untuk disematkan dalam target biner.

conlyopts

Daftar string; defaultnya adalah []

Tambahkan opsi ini ke perintah kompilasi C. Tunduk pada penggantian "Buat variabel" dan tokenisasi Bourne shell.
copts

Daftar string; defaultnya adalah []

Tambahkan opsi ini ke perintah kompilasi C/C++. Tunduk pada penggantian "Buat variabel" dan tokenisasi Bourne shell.

Setiap string dalam atribut ini ditambahkan dalam urutan tertentu ke COPTS sebelum mengompilasi target biner. Flag hanya berlaku untuk mengompilasi target ini, bukan dependensinya, jadi berhati-hatilah dengan file header yang disertakan di tempat lain. Semua jalur harus relatif terhadap ruang kerja, bukan terhadap paket saat ini. Atribut ini tidak diperlukan di luar third_party.

Jika paket mendeklarasikan fitur no_copts_tokenization, tokenisasi Bourne shell hanya berlaku untuk string yang terdiri dari satu variabel "Make".

cxxopts

Daftar string; defaultnya adalah []

Tambahkan opsi ini ke perintah kompilasi C++. Tunduk pada penggantian "Buat variabel" dan tokenisasi Bourne shell.
defines

Daftar string; defaultnya adalah []

Daftar definisi yang akan ditambahkan ke baris kompilasi target ini dan semua target dependen. Tunduk pada penggantian "Make" variable dan tokenisasi Bourne shell. Setiap string, yang harus terdiri dari satu token shell Bourne, diawali dengan -D dan ditambahkan ke command line kompilasi ke target ini, serta ke setiap aturan yang bergantung padanya. Berhati-hatilah, karena hal ini dapat memiliki efek yang luas -- definisi ditambahkan ke setiap target yang bergantung pada target ini. Jika ragu, tambahkan nilai yang ditentukan ke local_defines.
dynamic_deps

Daftar label; defaultnya adalah []

Ini adalah dependensi cc_shared_library lain yang bergantung pada target saat ini.

Implementasi cc_shared_library akan menggunakan daftar dynamic_deps (secara transitif, yaitu juga dynamic_deps dari dynamic_deps target saat ini) untuk memutuskan cc_libraries mana dalam deps transitif yang tidak boleh ditautkan karena sudah disediakan oleh cc_shared_library yang berbeda.

hdrs_check

String; default-nya adalah ""

Tidak digunakan lagi, tanpa pengoperasian.
includes

Daftar string; defaultnya adalah []

Daftar direktori include yang akan ditambahkan ke baris kompilasi. Tunduk pada penggantian "Buat variabel". Setiap string diawali dengan jalur paket dan diteruskan ke toolchain C++ untuk perluasan melalui fitur CROSSTOOL "include_paths". Toolchain yang berjalan di sistem POSIX dengan definisi fitur umum akan menghasilkan -isystem path_to_package/include_entry. Ini hanya boleh digunakan untuk library pihak ketiga yang tidak sesuai dengan gaya penulisan pernyataan #include Google. Tidak seperti COPTS, tanda ini ditambahkan untuk aturan ini dan setiap aturan yang bergantung padanya. (Catatan: bukan aturan yang bergantung padanya.) Berhati-hatilah, karena hal ini dapat berdampak luas. Jika ragu, tambahkan tanda "-I" ke COPTS.

Jalur include yang ditambahkan akan menyertakan file yang dibuat serta file di hierarki sumber.

Label; defaultnya adalah "@bazel_tools//tools/cpp:link_extra_lib"

Mengontrol penautan library tambahan.

Secara default, biner C++ ditautkan dengan //tools/cpp:link_extra_lib, yang secara default bergantung pada tanda label //tools/cpp:link_extra_libs. Tanpa menyetel tanda, library ini kosong secara default. Menetapkan flag label memungkinkan penautan dependensi opsional, seperti penggantian untuk simbol lemah, interseptor untuk fungsi library bersama, atau library runtime khusus (untuk penggantian malloc, lebih baik malloc atau --custom_malloc). Menetapkan atribut ini ke None akan menonaktifkan perilaku ini.

linkopts

Daftar string; defaultnya adalah []

Tambahkan tanda ini ke perintah linker C++. Tunduk pada penggantian variabel"Merek", tokenisasi Bourne shell, dan perluasan label. Setiap string dalam atribut ini ditambahkan ke LINKOPTS sebelum menautkan target biner.

Setiap elemen dalam daftar ini yang tidak diawali dengan $ atau - dianggap sebagai label target di deps. Daftar file yang dihasilkan oleh target tersebut ditambahkan ke opsi linker. Error akan dilaporkan jika label tidak valid, atau tidak dideklarasikan di deps.

linkshared

Boolean; defaultnya adalah False

Buat pustaka bersama. Untuk mengaktifkan atribut ini, sertakan linkshared=True dalam aturan Anda. Secara default, opsi ini dinonaktifkan.

Kehadiran tanda ini berarti penautan terjadi dengan tanda -shared ke gcc, dan library bersama yang dihasilkan cocok untuk dimuat ke dalam, misalnya, program Java. Namun, untuk tujuan build, library ini tidak akan pernah ditautkan ke biner dependen, karena diasumsikan bahwa library bersama yang dibangun dengan aturan cc_binary hanya dimuat secara manual oleh program lain, sehingga tidak boleh dianggap sebagai pengganti aturan cc_library. Demi skalabilitas, sebaiknya hindari pendekatan ini dan biarkan java_library bergantung pada aturan cc_library saja.

Jika Anda menentukan linkopts=['-static'] dan linkshared=True, Anda akan mendapatkan satu unit yang sepenuhnya mandiri. Jika Anda menentukan linkstatic=True dan linkshared=True, Anda akan mendapatkan satu unit yang sebagian besar mandiri.

linkstatic

Boolean; defaultnya adalah False

Untuk cc_binary dan cc_test: tautkan biner dalam mode statis. Untuk cc_library.link_static: lihat di bawah.

Secara default, opsi ini aktif untuk cc_binary dan nonaktif untuk yang lainnya.

Jika diaktifkan dan ini adalah biner atau pengujian, opsi ini akan memberi tahu alat build untuk menautkan .a, bukan .so, untuk library pengguna jika memungkinkan. Library sistem seperti libc (tetapi bukan library runtime C/C++, lihat di bawah) masih ditautkan secara dinamis, seperti library yang tidak memiliki library statis. Jadi, file yang dapat dieksekusi yang dihasilkan akan tetap ditautkan secara dinamis, sehingga hanya sebagian besar statis.

Sebenarnya ada tiga cara berbeda untuk menautkan file yang dapat dieksekusi:

  • STATIS dengan fitur fully_static_link, yang semuanya ditautkan secara statis; misalnya, "gcc -static foo.o libbar.a libbaz.a -lm".
    Mode ini diaktifkan dengan menentukan fully_static_link dalam atribut features.
  • STATIC, yang semua library pengguna ditautkan secara statis (jika versi statis tersedia), tetapi library sistem (kecuali library runtime C/C++) ditautkan secara dinamis, misalnya "gcc foo.o libfoo.a libbaz.a -lm".
    Mode ini diaktifkan dengan menentukan linkstatic=True.
  • DINAMIS, yang semua librarynya ditautkan secara dinamis (jika versi dinamis tersedia), misalnya "gcc foo.o libfoo.so libbaz.so -lm".
    Mode ini diaktifkan dengan menentukan linkstatic=False.

Jika atribut linkstatic atau fully_static_link dalam features digunakan di luar //third_party sertakan komentar di dekat aturan untuk menjelaskan alasannya.

Atribut linkstatic memiliki arti yang berbeda jika digunakan pada aturan cc_library(). Untuk library C++, linkstatic=True menunjukkan bahwa hanya penautan statis yang diizinkan, sehingga tidak ada .so yang akan dihasilkan. linkstatic=False tidak mencegah pembuatan library statis. Atribut ini dimaksudkan untuk mengontrol pembuatan library dinamis.

Seharusnya hanya ada sedikit kode yang dibangun dengan linkstatic=False dalam produksi. Jika linkstatic=False, alat build akan membuat link simbolik ke library bersama yang bergantung di area *.runfiles.

local_defines

Daftar string; defaultnya adalah []

Daftar definisi yang akan ditambahkan ke baris kompilasi. Tunduk pada penggantian "Make" variable dan tokenisasi Bourne shell. Setiap string, yang harus terdiri dari satu token shell Bourne, diawali dengan -D dan ditambahkan ke command line kompilasi untuk target ini, tetapi tidak untuk dependensinya. Tidak seperti defines, definisi hanya ditambahkan ke baris perintah kompilasi untuk target ini.
malloc

Label; defaultnya adalah "@bazel_tools//tools/cpp:malloc"

Mengganti dependensi default pada malloc.

Secara default, biner C++ ditautkan dengan //tools/cpp:malloc, yang merupakan library kosong sehingga biner akhirnya menggunakan malloc libc. Label ini harus merujuk ke cc_library. Jika kompilasi ditujukan untuk aturan non-C++, opsi ini tidak akan berpengaruh. Nilai atribut ini diabaikan jika linkshared=True ditentukan.

module_interfaces

Daftar label; defaultnya adalah []

Daftar file dianggap sebagai Antarmuka Modul C++20.

Standar C++ tidak memiliki batasan tentang ekstensi file antarmuka modul

  • Penggunaan cppm Clang
  • GCC dapat menggunakan ekstensi file sumber apa pun
  • MSVC menggunakan ixx

Penggunaan dilindungi oleh flag --experimental_cpp_modules.

nocopts

String; default-nya adalah ""

Hapus opsi yang cocok dari perintah kompilasi C++. Tunduk pada penggantian variabel "Make". Nilai atribut ini ditafsirkan sebagai ekspresi reguler. COPTS yang sudah ada dan cocok dengan ekspresi reguler ini (termasuk nilai yang ditentukan secara eksplisit dalam atribut copts aturan) akan dihapus dari COPTS untuk tujuan mengompilasi aturan ini. Atribut ini tidak diperlukan atau digunakan di luar third_party. Nilai tidak diproses sebelumnya dengan cara apa pun selain penggantian variabel "Make".
reexport_deps

Daftar label; defaultnya adalah []

stamp

Bilangan bulat; defaultnya adalah 0

Apakah akan mengenkode informasi build ke dalam biner. Nilai yang mungkin:
  • stamp = 1: Selalu stempel informasi build ke dalam biner, bahkan dalam build --nostamp. Setelan ini harus dihindari, karena berpotensi menghentikan penyimpanan cache jarak jauh untuk biner dan tindakan hilir yang bergantung padanya.
  • stamp = 0: Selalu ganti informasi build dengan nilai konstanta. Hal ini memberikan penyiapan cache hasil build yang baik.
  • stamp = -1: Penyematan informasi build dikontrol oleh flag --[no]stamp.

Biner yang diberi stempel tidak dibangun ulang kecuali jika dependensinya berubah.

win_def_file

Label; defaultnya adalah None

File DEF Windows yang akan diteruskan ke linker.

Atribut ini hanya boleh digunakan jika Windows adalah platform target. Opsi ini dapat digunakan untuk mengekspor simbol selama penautan library bersama.

cc_toolchain

Lihat sumber aturan
cc_toolchain(name, all_files, ar_files, as_files, compatible_with, compiler_files, compiler_files_without_includes, coverage_files, deprecation, dwp_files, dynamic_runtime_lib, exec_compatible_with, exec_group_compatible_with, exec_properties, exec_transition_for_inputs, features, libc_top, licenses, linker_files, module_map, objcopy_files, output_licenses, package_metadata, restricted_to, static_runtime_lib, strip_files, supports_header_parsing, supports_param_files, tags, target_compatible_with, testonly, toolchain_config, toolchain_identifier, toolchains, visibility)

Mewakili toolchain C++.

Aturan ini bertanggung jawab untuk:

  • Mengumpulkan semua artefak yang diperlukan agar tindakan C++ dapat berjalan. Hal ini dilakukan dengan atribut seperti all_files, compiler_files, linker_files, atau atribut lain yang diakhiri dengan _files). Atribut ini paling umum berupa glob filegroup yang menggabungkan semua file yang diperlukan.
  • Membuat command line yang benar untuk tindakan C++. Hal ini dilakukan menggunakan penyedia CcToolchainConfigInfo (detail di bawah).

Gunakan atribut toolchain_config untuk mengonfigurasi toolchain C++. Lihat juga halaman ini untuk mengetahui dokumentasi konfigurasi toolchain C++ dan pemilihan toolchain yang lebih mendalam.

Gunakan tags = ["manual"] untuk mencegah toolchain dibangun dan dikonfigurasi secara tidak perlu saat memanggil bazel build //...

Argumen

Atribut
name

Nama; wajib

Nama unik untuk target ini.

all_files

Label; wajib

Koleksi semua artefak cc_toolchain. Artefak ini akan ditambahkan sebagai input ke semua tindakan terkait rules_cc (kecuali tindakan yang menggunakan set artefak yang lebih presisi dari atribut di bawah). Bazel mengasumsikan bahwa all_files adalah superset dari semua atribut penyedia artefak lainnya (misalnya, kompilasi linkstamp memerlukan file kompilasi dan link, sehingga menggunakan all_files).

Inilah yang ada di cc_toolchain.files, dan ini digunakan oleh semua aturan Starlark yang menggunakan toolchain C++.

ar_files

Label; defaultnya adalah None

Kumpulan semua artefak cc_toolchain yang diperlukan untuk tindakan pengarsipan.
as_files

Label; defaultnya adalah None

Kumpulan semua artefak cc_toolchain yang diperlukan untuk tindakan assembly.
compiler_files

Label; wajib

Kumpulan semua artefak cc_toolchain yang diperlukan untuk tindakan kompilasi.
compiler_files_without_includes

Label; defaultnya adalah None

Pengumpulan semua artefak cc_toolchain yang diperlukan untuk tindakan kompilasi jika penemuan input didukung (saat ini hanya untuk Google).
coverage_files

Label; defaultnya adalah None

Kumpulan semua artefak cc_toolchain yang diperlukan untuk tindakan cakupan. Jika tidak ditentukan, semua file akan digunakan.
dwp_files

Label; wajib

Kumpulan semua artefak cc_toolchain yang diperlukan untuk tindakan dwp.
dynamic_runtime_lib

Label; defaultnya adalah None

Artefak library dinamis untuk library runtime C++ (misalnya, libstdc++.so).

Ini akan digunakan saat fitur 'static_link_cpp_runtimes' diaktifkan, dan kita menautkan dependensi secara dinamis.

exec_transition_for_inputs

Boolean; defaultnya adalah False

Tidak digunakan lagi. Tanpa pengoperasian.
libc_top

Label; defaultnya adalah None

Kumpulan artefak untuk libc yang diteruskan sebagai input ke tindakan kompilasi/penautan.
linker_files

Label; wajib

Kumpulan semua artefak cc_toolchain yang diperlukan untuk tindakan penautan.
module_map

Label; defaultnya adalah None

Artefak peta modul yang akan digunakan untuk build modular.
objcopy_files

Label; wajib

Kumpulan semua artefak cc_toolchain yang diperlukan untuk tindakan objcopy.
output_licenses

Daftar string; defaultnya adalah []

static_runtime_lib

Label; defaultnya adalah None

Artefak library statis untuk library runtime C++ (misalnya, libstdc++.a).

Ini akan digunakan saat fitur 'static_link_cpp_runtimes' diaktifkan, dan kita menautkan dependensi secara statis.

strip_files

Label; wajib

Kumpulan semua artefak cc_toolchain yang diperlukan untuk tindakan strip.
supports_header_parsing

Boolean; defaultnya adalah False

Disetel ke True jika cc_toolchain mendukung tindakan parsing header.
supports_param_files

Boolean; defaultnya adalah True

Disetel ke True jika cc_toolchain mendukung penggunaan file param untuk tindakan penautan.
toolchain_config

Label; wajib

Label aturan yang menyediakan cc_toolchain_config_info.
toolchain_identifier

String; default-nya adalah ""

ID yang digunakan untuk mencocokkan cc_toolchain ini dengan crosstool_config.toolchain yang sesuai.

Hingga masalah #5380 diperbaiki cara yang direkomendasikan untuk mengaitkan cc_toolchain dengan CROSSTOOL.toolchain adalah sebagai berikut. Atribut ini akan diganti dengan atribut toolchain_config (#5380).

cc_toolchain_suite

Lihat sumber aturan
cc_toolchain_suite(name, compatible_with, deprecation, features, licenses, package_metadata, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)

Tidak digunakan lagi: aturan ini tidak melakukan apa pun dan akan dihapus.

Argumen

Atribut
name

Nama; wajib

Nama unik untuk target ini.

fdo_prefetch_hints

Lihat sumber aturan
fdo_prefetch_hints(name, compatible_with, deprecation, exec_compatible_with, exec_group_compatible_with, exec_properties, features, package_metadata, profile, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)

Mewakili profil petunjuk pengambilan data FDO yang ada di ruang kerja. Contoh:


fdo_prefetch_hints(
    name = "hints",
    profile = "//path/to/hints:profile.afdo",
)

Argumen

Atribut
name

Nama; wajib

Nama unik untuk target ini.

profile

Label; wajib

Label profil petunjuk. File petunjuk memiliki ekstensi .afdo Label juga dapat mengarah ke aturan fdo_absolute_path_profile.

fdo_profile

Lihat sumber aturan
fdo_profile(name, compatible_with, deprecation, exec_compatible_with, exec_group_compatible_with, exec_properties, features, memprof_profile, package_metadata, profile, proto_profile, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)

Mewakili profil FDO yang ada di ruang kerja. Contoh:


fdo_profile(
    name = "fdo",
    profile = "//path/to/fdo:profile.zip",
)

Argumen

Atribut
name

Nama; wajib

Nama unik untuk target ini.

memprof_profile

Label; defaultnya adalah None

Label profil MemProf. Profil diharapkan memiliki ekstensi .profdata (untuk profil memprof yang diindeks/disimbolkan), atau ekstensi .zip untuk file zip yang berisi file memprof.profdata.
profile

Label; wajib

Label profil FDO atau aturan yang membuatnya. File FDO dapat memiliki salah satu ekstensi berikut: .profraw untuk profil LLVM yang tidak diindeks, .profdata untuk profil LLVM yang diindeks, .zip yang menyimpan profil profraw LLVM, .afdo untuk profil AutoFDO, .xfdo untuk profil XBinary. Label juga dapat mengarah ke aturan fdo_absolute_path_profile.
proto_profile

Label; defaultnya adalah None

Label profil protobuf.

memprof_profile

Lihat sumber aturan
memprof_profile(name, compatible_with, deprecation, exec_compatible_with, exec_group_compatible_with, exec_properties, features, package_metadata, profile, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)

Mewakili profil MEMPROF yang ada di ruang kerja. Contoh:


memprof_profile(
    name = "memprof",
    profile = "//path/to/memprof:profile.afdo",
)

Argumen

Atribut
name

Nama; wajib

Nama unik untuk target ini.

profile

Label; wajib

Label profil MEMPROF. Profil diharapkan memiliki ekstensi .profdata (untuk profil memprof yang diindeks/disimbolkan), atau ekstensi .zip untuk file zip yang berisi file memprof.profdata. Label juga dapat mengarah ke aturan fdo_absolute_path_profile.

propeller_optimize

Lihat sumber aturan
propeller_optimize(name, cc_profile, compatible_with, deprecation, exec_compatible_with, exec_group_compatible_with, exec_properties, features, ld_profile, package_metadata, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)

Mewakili profil pengoptimalan Propeller di ruang kerja. Contoh:


propeller_optimize(
    name = "layout",
    cc_profile = "//path:cc_profile.txt",
    ld_profile = "//path:ld_profile.txt"
)

Argumen

Atribut
name

Nama; wajib

Nama unik untuk target ini.

cc_profile

Label; wajib

Label profil yang diteruskan ke berbagai tindakan kompilasi. File ini memiliki ekstensi .txt.
ld_profile

Label; wajib

Label profil yang diteruskan ke tindakan link. File ini memiliki ekstensi .txt.