Aturan C / C++

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

Aturan

cc_binary

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

Ini 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 menjadi main.

Target output implisit

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

Argumen

Atribut
name

Nama; wajib diisi

Nama unik untuk target ini.

deps

Daftar label; default adalah []

Daftar library lain yang akan ditautkan ke target biner.

Dapat berupa cc_library atau objc_library target.

Anda juga diizinkan untuk masukkan skrip penaut (.lds) ke dependensi, dan referensikan di linkopts.
srcs

Daftar label; default adalah []

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

Semua file .cc, .c, dan .cpp akan dapat dikompilasi. Ini mungkin file yang dihasilkan: jika file bernama ada outs dari beberapa aturan lain, cc_library ini akan bergantung secara otomatis pada aturan lain tersebut.

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

File .h tidak akan dikompilasi, tetapi akan tersedia untuk penyertaan menurut sumber dalam aturan ini. .cc dan File .h dapat langsung menyertakan header yang tercantum dalam srcs ini atau di hdrs aturan ini atau aturan yang tercantum dalam argumen deps.

Semua file #include hari harus disebutkan dalam Atribut hdrs dari cc_library ini atau yang direferensikan aturan, atau harus dicantumkan di srcs jika bersifat pribadi ke library ini. Lihat "Pemeriksaan penyertaan header" untuk penjelasan yang lebih rinci.

File .so, .lo, dan .a file yang telah dikompilasi sebelumnya. Pustaka Anda mungkin memiliki srcs jika menggunakan kode pihak ketiga yang tidak kami memiliki kode sumber.

Jika atribut srcs menyertakan label aturan lain, cc_library akan menggunakan file output dari aturan tersebut sebagai file sumber untuk mengompilasi. Hal ini berguna untuk pembuatan kode sumber satu kali (lebih dari sesekali digunakan, sebaiknya implementasikan class aturan Starlark dan gunakan cc_common API)

srcs jenis file 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 preprocessor C: .S
  • Arsipkan: .a, .pic.a
  • "Selalu tautkan" library: .lo, .pic.lo
  • Pustaka bersama, berversi 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; default adalah []

Daftar file yang dibutuhkan library ini saat runtime. Lihat komentar umum tentang data pada Atribut umum didefinisikan oleh sebagian besar aturan build.

Jika data adalah nama file yang dihasilkan, maka Aturan cc_library secara otomatis bergantung pada aturan.

Jika data adalah nama aturan, maka cc_library aturan secara otomatis bergantung pada aturan tersebut, dan outs aturan tersebut akan 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; default adalah []

Teruskan file-file ini ke perintah linker C++.

Misalnya, file .res Windows yang dikompilasi dapat disediakan di sini untuk disematkan pada target biner.

copts

Daftar {i>string<i}; default-nya adalah []

Tambahkan opsi ini ke perintah kompilasi C++. Tunduk kepada substitusi "Buat variabel" dan Tokenisasi shell Bourne.

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

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

defines

Daftar {i>string<i}; default-nya adalah []

Daftar definisi yang akan ditambahkan ke baris kompilasi. Tunduk kepada "Merek" substitusi variabel dan Tokenisasi shell Bourne. Setiap {i>string<i}, yang harus terdiri dari satu token shell Bourne, diawali dengan -D dan ditambahkan ke command line kompilasi ke target ini, serta setiap aturan yang bergantung padanya. Hati-hati, karena hal ini mungkin berdampak luas. Jika ragu, tambahkan nilai {i>define <i}ke local_defines saja.
dynamic_deps

Daftar label; default adalah []

Ini adalah dependensi cc_shared_library lain yang menjadi dependensi target saat ini.

Implementasi cc_shared_library akan menggunakan daftar dynamic_deps (secara transitif, yaitu juga dynamic_deps dari target saat ini dynamic_deps) untuk menentukan cc_libraries mana di deps transitif 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 {i>string<i}; default-nya adalah []

Daftar include dir yang akan ditambahkan ke baris kompilasi. Tunduk pada substitusi "Buat variabel". Setiap {i>string<i} diawali dengan jalur paket dan diteruskan ke toolchain C++ untuk perluasan melalui "include_paths" CROSSTOOL. Toolchain yang berjalan pada sistem POSIX dengan definisi fitur umum akan menghasilkan -isystem path_to_package/include_entry. Fungsi 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 menjadi dependensinya.) Membuat sangat berhati-hati, karena hal ini dapat menimbulkan jangkauan luas. Jika ragu, tambahkan "-Saya" flag ke COPTS.

Jalur include yang ditambahkan akan menyertakan file yang dihasilkan serta dalam hierarki sumber.

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

Mengontrol penautan library tambahan.

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

linkopts

Daftar {i>string<i}; default-nya adalah []

Tambahkan flag ini ke perintah linker C++. Tunduk kepada "Merek" substitusi variabel, Tokenisasi shell Bourne dan perluasan label. Setiap string dalam atribut ini ditambahkan ke LINKOPTS sebelum menautkan target biner.

Setiap elemen daftar ini yang tidak diawali dengan $ atau - diasumsikan sebagai label target di deps. Tujuan daftar file yang dihasilkan oleh target tersebut ditambahkan ke penaut lainnya. Error akan dilaporkan jika label tidak valid, atau tidak dideklarasikan di deps.

linkshared

Boolean; default-nya adalah False

Membuat galeri foto bersama. Untuk mengaktifkan atribut ini, sertakan linkshared=True dalam aturan Anda. Secara default opsi ini nonaktif.

Adanya tanda ini berarti penautan terjadi dengan tanda -shared ke gcc, dan library bersama yang dihasilkan cocok untuk dimuat ke dalam contoh program Java. Namun, untuk tujuan build, skrip tidak akan pernah ditautkan ke biner dependen, karena diasumsikan bahwa perpustakaan bersama dibangun dengan Aturan cc_binary hanya dimuat secara manual oleh program lain, jadi library ini tidak boleh dianggap sebagai pengganti cc_library aturan. Demi skalabilitas, sebaiknya hindari pendekatan ini sama sekali dan hanya dengan mengizinkan java_library bergantung pada aturan cc_library sebagai gantinya.

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

linkstatic

Boolean; default-nya adalah True

Untuk cc_binary dan cc_test: menautkan biner secara statis mode. Untuk cc_library.link_static: lihat di bawah.

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

Jika diaktifkan dan ini adalah biner atau pengujian, opsi ini 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 tertaut secara dinamis, seperti library yang tidak ada library statis. Jadi, file yang dapat dieksekusi yang dihasilkan akan tetap dinamis tertaut, oleh karena itu hanya sebagian besar statis.

Sebenarnya ada tiga cara untuk menautkan {i>executable<i}:

  • STATIC dengan fitur full_static_link, di mana semuanya ditautkan secara statis; mis. "gcc -static foo.o libbar.a libbaz.a -lm".
    Mode ini diaktifkan dengan menetapkan fully_static_link pada features.
  • STATIC, di mana semua pustaka pengguna ditautkan secara statis (jika baru tersedia), tetapi jika library sistem (tidak termasuk library runtime C/C++) tertaut secara dinamis, mis. "gcc foo.o libfoo.a libbaz.a -lm".
    Mode ini diaktifkan dengan menetapkan linkstatic=True.
  • DINAMIS, yang semua library ditautkan secara dinamis (jika versi dinamis tersedia), mis. "gcc foo.o libfoo.so libbaz.so -lm".
    Mode ini diaktifkan dengan menetapkan linkstatic=False.

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

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

Seharusnya sangat sedikit kode yang dibuat dengan linkstatic=False dalam produksi. Jika linkstatic=False, alat build akan membuat symlink ke bergantung pada library bersama di area *.runfiles.

local_defines

Daftar {i>string<i}; default-nya adalah []

Daftar definisi yang akan ditambahkan ke baris kompilasi. Tunduk kepada "Merek" substitusi variabel dan Tokenisasi shell Bourne. Setiap {i>string<i}, yang harus terdiri dari satu token shell Bourne, diawali dengan -D dan ditambahkan ke command line kompilasi untuk target ini, tetapi tidak kepada tanggungannya.
malloc

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

Mengganti dependensi default pada malloc.

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

module_interfaces

Daftar label; default adalah []

Daftar file ini dianggap sebagai Antarmuka Modul C++20.

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

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

Penggunaan dilindungi oleh flag --experimental_cpp_modules.

nocopts

String; default-nya adalah ""

Menghapus opsi yang cocok dari perintah kompilasi C++. Tunduk kepada "Merek" variabel. Nilai atribut ini ditafsirkan sebagai ekspresi reguler. Semua 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 kompilasi aturan ini. Atribut ini tidak boleh diperlukan atau digunakan di luar third_party. Nilai tidak diproses sebelumnya dengan cara apa pun selain "Membuat" substitusi variabel.
reexport_deps

Daftar label; default adalah []

stamp

{i>Integer<i} (Bilangan bulat): default-nya adalah -1

Apakah ingin mengenkode informasi build ke dalam biner. Nilai yang mungkin:
  • stamp = 1: Selalu tambahkan informasi build ke dalam biner, bahkan dalam --nostamp build. Ini harus dihindari, karena berpotensi mematikan caching jarak jauh untuk biner dan tindakan downstream apa pun yang bergantung padanya.
  • stamp = 0: Selalu ganti informasi build dengan nilai konstanta. Ini memberikan cache hasil build yang baik.
  • stamp = -1: Penyematan informasi build dikontrol oleh Tanda --[no]stamp.

Biner yang distempel tidak dibangun ulang kecuali jika dependensinya berubah.

win_def_file

Label; default adalah None

File DEF Windows yang akan diteruskan ke penaut.

Atribut ini hanya boleh digunakan jika Windows adalah platform target. Template ini dapat digunakan untuk ekspor simbol selama menautkan galeri foto bersama.

cc_import

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

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

Berikut ini adalah kasus penggunaan umum:
Akun Layanan 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 = 1,
)
2. Menautkan library bersama (Unix)

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

Pada 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

Pada 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 = 1,
)

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 = 1,
)
5. Menautkan ke library statis atau bersama

Pada 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 = 1, # default value
)

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

cc_import mendukung atribut sertakan. Misalnya:


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 diisi

Nama unik untuk target ini.

deps

Daftar label; default adalah []

Daftar library lain yang diandalkan target. Lihat komentar umum tentang deps pada Atribut umum didefinisikan oleh sebagian besar aturan build.
hdrs

Daftar label; default adalah []

Daftar file {i>header<i} yang diterbitkan oleh pustaka yang dikompilasi sebelumnya ini agar langsung disertakan oleh sumber dalam aturan yang bergantung.

Boolean; default-nya adalah False

Jika 1, biner yang bergantung (langsung atau tidak langsung) pada C++ ini prakompilasi akan menautkan semua file objek yang diarsipkan di pustaka statis, bahkan jika beberapa di antaranya tidak memiliki simbol yang dirujuk oleh biner. Fungsi ini berguna jika kode Anda tidak secara eksplisit dipanggil oleh kode di 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 ini disebabkan oleh masalah umum, upgrade VS 2017 Anda ke versi terbaru.

includes

Daftar {i>string<i}; default-nya adalah []

Daftar include dir yang akan ditambahkan ke baris kompilasi. Tunduk pada substitusi "Buat variabel". Setiap {i>string<i} diawali dengan jalur paket dan diteruskan ke toolchain C++ untuk perluasan melalui "include_paths" CROSSTOOL. Toolchain yang berjalan pada sistem POSIX dengan definisi fitur umum akan menghasilkan -isystem path_to_package/include_entry. Fungsi 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 menjadi dependensinya.) Membuat sangat berhati-hati, karena hal ini dapat menimbulkan jangkauan luas. Jika ragu, tambahkan "-Saya" flag ke COPTS.

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

interface_library

Label; default adalah None

Satu library antarmuka untuk menautkan library bersama.

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

linkopts

Daftar {i>string<i}; default-nya adalah []

Tambahkan flag ini ke perintah linker C++. Tunduk kepada "Merek" substitusi variabel, Tokenisasi shell Bourne dan perluasan label. Setiap string dalam atribut ini ditambahkan ke LINKOPTS sebelum menautkan target biner.

Setiap elemen daftar ini yang tidak diawali dengan $ atau - diasumsikan sebagai label target di deps. Tujuan daftar file yang dihasilkan oleh target tersebut ditambahkan ke penaut lainnya. Error akan dilaporkan jika label tidak valid, atau tidak dideklarasikan di deps.

objects

Daftar label; default adalah []

pic_objects

Daftar label; default adalah []

pic_static_library

Label; default adalah None

shared_library

Label; default adalah None

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

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

static_library

Label; default adalah None

Satu library statis yang telah dikompilasi sebelumnya.

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

system_provided

Boolean; default-nya adalah False

Jika 1, artinya library bersama yang diperlukan saat runtime disediakan oleh sistem. Di beberapa 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, copts, defines, deprecation, distribs, exec_compatible_with, exec_properties, features, hdrs_check, implementation_deps, include_prefix, includes, licenses, linkopts, linkstamp, linkstatic, local_defines, module_interfaces, 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, tergantung apa yang diperlukan.

Jika Anda membuat sesuatu dengan tautan statis yang bergantung pada cc_library, output dari 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 pustaka bersama, dengan foo adalah nama aturannya. Tujuan jenis library lain yang diakhiri dengan .lo dan .a, secara berurutan. Jika Anda memerlukan nama pustaka bersama tertentu, untuk untuk menentukan modul Python, gunakan genrule untuk menyalin library sesuai nama yang diinginkan.

Pemeriksaan penyertaan header

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

Untuk aturan cc_library, header di hdrs terdiri dari antarmuka publik perpustakaan dan dapat langsung disertakan baik dari file dalam hdrs dan srcs library itu sendiri serta dari file dalam hdrs dan srcs dari cc_* aturan yang mencantumkan library di deps. Header di srcs hanya boleh disertakan langsung dari file dalam hdrs dan srcs library itu sendiri. Kapan memutuskan apakah akan menempatkan header ke hdrs atau srcs, Anda harus bertanya apakah Anda ingin konsumen perpustakaan ini dapat langsung menyertakannya. Ini kurang lebih merupakan keputusan yang sama dengan antara visibilitas public dan private dalam bahasa pemrograman.

Aturan cc_binary dan cc_test tidak memiliki ekspor antarmuka, sehingga juga tidak memiliki atribut hdrs. Semua header milik biner atau tes secara langsung harus tercantum dalam srcs.

Untuk menggambarkan 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 langsung menyertakan foo.h dan bar.h, tetapi tidak baz.h.

Menyertakan filePenyertaan yang diizinkan
foo.hbar.h
foo.cc{i>foo.h bar.h<i}
bar.hbar-impl.h baz.h
baris-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 langsung penyertaan/penyertaan. Dalam contoh di atas, foo.cc diizinkan untuk menyertakan bar.h, yang mungkin mencakup baz.h, yang dalam belokan diizinkan menyertakan baz-impl.h. Secara teknis, kompilasi file .cc dapat menyertakan header apa pun secara transitif file di hdrs atau srcs di cc_library apa pun dalam penutupan deps transitif. Di beberapa dalam hal ini, compiler dapat membaca baz.h dan baz-impl.h saat mengompilasi foo.cc, namun foo.cc tidak boleh berisi #include "baz.h". Agar dapat diizinkan, baz harus ditambahkan ke deps dari 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 features dari parameter Fungsi package. Toolchain yang disediakan oleh Bazel hanya mendukung fitur ini dengan {i>clang<i} 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 = 1,
)

Contoh berikut berasal dari third_party/python2_4_3/BUILD. Beberapa kode menggunakan library dl (untuk memuat satu lagi, library dinamis), jadi 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 bawaan di depot. File header berada di 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 diisi

Nama unik untuk target ini.

deps

Daftar label; default adalah []

Daftar library lain yang menjadi target library.

Ini dapat berupa target cc_library atau objc_library.

Lihat komentar umum tentang deps pada Atribut umum didefinisikan oleh sebagian besar aturan build.

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

Meskipun ada "dependensi" tidak semua klien library ini berada di sini. Dependensi data runtime termasuk dalam data. File sumber yang dibuat oleh aturan lain termasuk dalam srcs.

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

Untuk bergantung pada sesuatu tanpa menautkannya ke library ini, tambahkan menjadi data.

srcs

Daftar label; default adalah []

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

Semua file .cc, .c, dan .cpp akan dapat dikompilasi. Ini mungkin file yang dihasilkan: jika file bernama ada outs dari beberapa aturan lain, cc_library ini akan bergantung secara otomatis pada aturan lain tersebut.

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

File .h tidak akan dikompilasi, tetapi akan tersedia untuk penyertaan menurut sumber dalam aturan ini. .cc dan File .h dapat langsung menyertakan header yang tercantum dalam srcs ini atau di hdrs aturan ini atau aturan yang tercantum dalam argumen deps.

Semua file #include hari harus disebutkan dalam Atribut hdrs dari cc_library ini atau yang direferensikan aturan, atau harus dicantumkan di srcs jika bersifat pribadi ke library ini. Lihat "Pemeriksaan penyertaan header" untuk penjelasan yang lebih rinci.

File .so, .lo, dan .a file yang telah dikompilasi sebelumnya. Pustaka Anda mungkin memiliki srcs jika menggunakan kode pihak ketiga yang tidak kami memiliki kode sumber.

Jika atribut srcs menyertakan label aturan lain, cc_library akan menggunakan file output dari aturan tersebut sebagai file sumber untuk mengompilasi. Hal ini berguna untuk pembuatan kode sumber satu kali (lebih dari sesekali digunakan, sebaiknya implementasikan class aturan Starlark dan gunakan cc_common API)

srcs jenis file 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 preprocessor C: .S
  • Arsipkan: .a, .pic.a
  • "Selalu tautkan" library: .lo, .pic.lo
  • Pustaka bersama, berversi 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; default adalah []

Daftar file yang dibutuhkan library ini saat runtime. Lihat komentar umum tentang data pada Atribut umum didefinisikan oleh sebagian besar aturan build.

Jika data adalah nama file yang dihasilkan, maka Aturan cc_library secara otomatis bergantung pada aturan.

Jika data adalah nama aturan, maka cc_library aturan secara otomatis bergantung pada aturan tersebut, dan outs aturan tersebut akan 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; default adalah []

Daftar file {i>header<i} yang diterbitkan oleh library ini agar disertakan langsung oleh sumber dalam aturan dependen.

Ini adalah lokasi yang sangat disukai untuk mendeklarasikan file {i>header<i} yang menjelaskan antarmuka {i>library<i}. {i>Header<i} ini akan dibuat tersedia untuk disertakan oleh sumber dalam aturan ini atau aturan dependen. Header yang tidak dimaksudkan untuk disertakan oleh klien library ini harus tercantum dalam atribut srcs, meskipun atribut tersebut disertakan oleh {i>header <i}yang diterbitkan. Lihat "Penyertaan header memeriksa" untuk mengetahui deskripsi lebih mendetail.

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

additional_compiler_inputs

Daftar label; default adalah []

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

Daftar label; default adalah []

Teruskan file-file ini ke perintah linker C++.

Misalnya, file .res Windows yang dikompilasi dapat disediakan di sini untuk disematkan pada target biner.

Boolean; default-nya adalah False

Jika 1, biner yang bergantung (langsung atau tidak langsung) pada C++ ini {i>library<i} akan menautkan semua file objek untuk file yang tercantum dalam srcs, meskipun beberapa di antaranya tidak berisi simbol yang dirujuk oleh biner. Fungsi ini berguna jika kode Anda tidak secara eksplisit dipanggil oleh kode di 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 ini disebabkan oleh masalah umum, upgrade VS 2017 Anda ke versi terbaru.

copts

Daftar {i>string<i}; default-nya adalah []

Tambahkan opsi ini ke perintah kompilasi C++. Tunduk kepada substitusi "Buat variabel" dan Tokenisasi shell Bourne.

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

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

defines

Daftar {i>string<i}; default-nya adalah []

Daftar definisi yang akan ditambahkan ke baris kompilasi. Tunduk kepada "Merek" substitusi variabel dan Tokenisasi shell Bourne. Setiap {i>string<i}, yang harus terdiri dari satu token shell Bourne, diawali dengan -D dan ditambahkan ke command line kompilasi ke target ini, serta setiap aturan yang bergantung padanya. Hati-hati, karena hal ini mungkin berdampak luas. Jika ragu, tambahkan nilai {i>define <i}ke local_defines saja.
hdrs_check

String; default-nya adalah ""

Tidak digunakan lagi, tanpa pengoperasian.
implementation_deps

Daftar label; default adalah []

Daftar library lain yang menjadi target library. Tidak seperti dengan deps, header dan sertakan jalur library ini (dan semua dependensi transitif) hanya digunakan untuk kompilasi library ini, bukan library yang yang bergantung pada {i>database.<i} Library yang ditentukan dengan implementation_deps masih ditautkan target biner yang bergantung pada library ini.

Untuk saat ini, penggunaan dibatasi pada cc_libraries dan dilindungi oleh tanda --experimental_cc_implementation_deps.

include_prefix

String; default-nya adalah ""

Awalan yang akan ditambahkan ke jalur header aturan ini.

Jika ditetapkan, header di atribut hdrs pada aturan ini dapat diakses at adalah nilai atribut ini yang ditambahkan ke jalur relatif repositorinya.

Awalan dalam atribut strip_include_prefix dihapus sebelum tindakan ini ditambahkan.

Atribut ini hanya sah menurut third_party.

includes

Daftar {i>string<i}; default-nya adalah []

Daftar include dir yang akan ditambahkan ke baris kompilasi. Tunduk pada substitusi "Buat variabel". Setiap {i>string<i} diawali dengan jalur paket dan diteruskan ke toolchain C++ untuk perluasan melalui "include_paths" CROSSTOOL. Toolchain yang berjalan pada sistem POSIX dengan definisi fitur umum akan menghasilkan -isystem path_to_package/include_entry. Fungsi 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 menjadi dependensinya.) Membuat sangat berhati-hati, karena hal ini dapat menimbulkan jangkauan luas. Jika ragu, tambahkan "-Saya" flag ke COPTS.

Jalur include yang ditambahkan akan menyertakan file yang dihasilkan serta dalam hierarki sumber.

linkopts

Daftar {i>string<i}; default-nya adalah []

Lihat cc_binary.linkopts. Atribut linkopts juga diterapkan ke setiap target yang bergantung, secara langsung atau tidak langsung, pada library ini melalui deps (atau melalui atribut lain yang diperlakukan serupa: malloc dari cc_binary). Ketergantungan linkopts lebih diutamakan daripada linkopt dependen (yaitu, linkopt dependensi akan muncul kemudian di baris perintah). Linkopt yang ditentukan di --linkopt lebih diutamakan daripada opsi penautan aturan.

Perlu diperhatikan bahwa atribut linkopts hanya berlaku saat membuat file .so atau {i> executable<i}, bukan saat membuat file .a atau .lo. Jadi, jika atribut linkstatic=True ditetapkan, Atribut linkopts tidak berpengaruh pada pembuatan library ini, hanya pada target lain yang bergantung pada library ini.

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

File .so yang dihasilkan oleh cc_library aturan tidak terkait dengan library yang bergantung padanya kueri. Jika Anda mencoba membuat pustaka bersama untuk digunakan di luar repositori utama, mis. untuk penggunaan manual dengan dlopen() atau LD_PRELOAD, mungkin lebih baik gunakan aturan cc_binary dengan atribut linkshared=True. Lihat cc_binary.linkshared.

linkstamp

Label; default adalah None

Secara bersamaan mengompilasi dan menautkan file sumber C++ yang ditentukan ke instance biner. Tipuan ini diperlukan untuk memperkenalkan stempel waktu informasi ke dalam biner; jika kita mengompilasi file sumber ke file objek dengan cara biasa, stempel waktunya akan salah. Kompilasi linkstamp mungkin tidak menyertakan serangkaian flag compiler dan tidak boleh bergantung pada header, opsi compiler, atau variabel build lainnya. Opsi ini hanya diperlukan di base.
linkstatic

Boolean; default-nya adalah False

Untuk cc_binary dan cc_test: menautkan biner secara statis mode. Untuk cc_library.link_static: lihat di bawah.

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

Jika diaktifkan dan ini adalah biner atau pengujian, opsi ini 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 tertaut secara dinamis, seperti library yang tidak ada library statis. Jadi, file yang dapat dieksekusi yang dihasilkan akan tetap dinamis tertaut, oleh karena itu hanya sebagian besar statis.

Sebenarnya ada tiga cara untuk menautkan {i>executable<i}:

  • STATIC dengan fitur full_static_link, di mana semuanya ditautkan secara statis; mis. "gcc -static foo.o libbar.a libbaz.a -lm".
    Mode ini diaktifkan dengan menetapkan fully_static_link pada features.
  • STATIC, di mana semua pustaka pengguna ditautkan secara statis (jika baru tersedia), tetapi jika library sistem (tidak termasuk library runtime C/C++) tertaut secara dinamis, mis. "gcc foo.o libfoo.a libbaz.a -lm".
    Mode ini diaktifkan dengan menetapkan linkstatic=True.
  • DINAMIS, yang semua library ditautkan secara dinamis (jika versi dinamis tersedia), mis. "gcc foo.o libfoo.so libbaz.so -lm".
    Mode ini diaktifkan dengan menetapkan linkstatic=False.

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

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

Seharusnya sangat sedikit kode yang dibuat dengan linkstatic=False dalam produksi. Jika linkstatic=False, alat build akan membuat symlink ke bergantung pada library bersama di area *.runfiles.

local_defines

Daftar {i>string<i}; default-nya adalah []

Daftar definisi yang akan ditambahkan ke baris kompilasi. Tunduk kepada "Merek" substitusi variabel dan Tokenisasi shell Bourne. Setiap {i>string<i}, yang harus terdiri dari satu token shell Bourne, diawali dengan -D dan ditambahkan ke command line kompilasi untuk target ini, tetapi tidak kepada tanggungannya.
module_interfaces

Daftar label; default adalah []

Daftar file ini dianggap sebagai Antarmuka Modul C++20.

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

  • Clang menggunakan cppm
  • 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 di atribut hdrs pada aturan ini dapat diakses di jalurnya dengan potongan awalan ini.

Jika jalur relatif, maka akan diambil sebagai jalur yang relatif terhadap paket. Jika nilai itu adalah mutlak, itu dipahami sebagai jalur relatif repositori.

Awalan dalam atribut include_prefix ditambahkan setelah awalan ini dihilangkan.

Atribut ini hanya sah menurut third_party.

textual_hdrs

Daftar label; default adalah []

Daftar file {i>header<i} yang diterbitkan oleh library ini agar disertakan secara tekstual oleh sumber dalam aturan dependen.

Ini adalah lokasi untuk mendeklarasikan file {i>header<i} yang tidak dapat dikompilasi sendiri; yaitu, mereka selalu perlu disertakan secara tekstual oleh file sumber lain untuk membuat pada kode sumber.

win_def_file

Label; default adalah None

File DEF Windows yang akan diteruskan ke penaut.

Atribut ini hanya boleh digunakan jika Windows adalah platform target. Template ini dapat digunakan untuk ekspor simbol selama menautkan galeri foto bersama.

cc_proto_library

Lihat sumber aturan
cc_proto_library(name, deps, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)

cc_proto_library menghasilkan kode C++ dari file .proto.

deps harus mengarah ke aturan proto_library .

Contoh:


cc_library(
    name = "lib",
    deps = [":foo_cc_proto"],
)

cc_proto_library(
    name = "foo_cc_proto",
    deps = [":foo_proto"],
)

proto_library(
    name = "foo_proto",
)

Argumen

Atribut
name

Nama; wajib diisi

Nama unik untuk target ini.

deps

Daftar label; default adalah []

Daftar proto_library aturan untuk menghasilkan kode C++.

cc_shared_library

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

Layanan ini menghasilkan {i>shared library<i}.

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 menautkan foo secara statis dan baz, yang kedua adalah dependensi transitif. Tidak tautkan bar karena sudah disediakan secara dinamis oleh dynamic_dep bar_shared.

foo_shared menggunakan file skrip penaut *.lds untuk mengontrol semua simbol harus diekspor. Logika aturan cc_shared_library melakukan tidak mengontrol simbol mana yang diekspor, itu hanya menggunakan apa yang diasumsikan diekspor untuk memberikan kesalahan selama fase analisis jika dua {i>shared library<i} mengekspor target yang sama.

Setiap dependensi langsung dari cc_shared_library diasumsikan diekspor. Oleh karena itu, selama analisis berlangsung, Bazel berasumsi bahwa foo diekspor oleh foo_shared. baz tidak dianggap diekspor paling lambat foo_shared. Setiap target yang cocok dengan exports_filter juga diasumsikan sebagai ekspor.

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

Karena atribut shared_lib_name, file yang dihasilkan oleh bar_shared akan memiliki nama bar.so, bukan dengan nama libbar.so yang akan digunakan 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 jenis Dependensi cc_shared_library yang mengekspor target yang sama. Untuk memperbaikinya Anda harus menghentikan library agar tidak diekspor di salah satu Dependensi cc_shared_library.

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

Salah satu cara untuk memperbaikinya adalah dengan berhenti menghubungkan {i>library<i} ke salah satu Dependensi cc_shared_library. Pada saat yang sama, parameter yang masih menautkannya perlu mengekspor library agar library yang tidak menautkannya tetap dapat dilihat simbol-simbol tersebut. Cara lain adalah dengan menarik library ketiga yang mengekspor target. Cara ketiga adalah memberi tag cc_library penyebab masalah dengan LINKABLE_MORE_THAN_ONCE tetapi perbaikan ini jarang terjadi 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 yang berbeda di dynamic_deps dan tidak diekspor.

Solusinya adalah dengan mengekspornya dari dependensi cc_shared_library atau menariknya cc_shared_library ketiga yang mengekspornya.

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

Jika Anda memiliki pustaka dinamis yang telah dikompilasi sebelumnya, hal ini tidak perlu dan tidak boleh ditautkan secara statis ke target cc_shared_library saat ini yang Anda yang sedang dibuat. Oleh karena itu, file ini tidak termasuk dalam deps cc_shared_library. Jika library dinamis yang dikompilasi sebelumnya ini merupakan dependensi dari cc_libraries, maka cc_library harus bergantung padanya secara langsung.

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 cukup andalkan dari objek dependensi atau memastikan bahwa exports_filter tidak menangkap target ini.

Argumen

Atribut
name

Nama; wajib diisi

Nama unik untuk target ini.

deps

Daftar label; default adalah []

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

Setiap dependensi library transitif dari dependensi langsung ini akan ditautkan ke library selama belum ditautkan oleh cc_shared_library dalam dynamic_deps.

Selama analisis, penerapan aturan akan mempertimbangkan target apa pun yang tercantum dalam deps sedang diekspor oleh library bersama untuk menghasilkan error saat beberapa cc_shared_libraries mengekspor target yang sama. Penerapan aturan tidak memperhatikan menginformasikan penaut tentang simbol mana yang harus diekspor objek bersama. Pengguna harus menangani hal ini melalui visibilitas atau skrip penaut deklarasi dalam kode sumber.

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

additional_linker_inputs

Daftar label; default adalah []

File tambahan apa pun yang mungkin ingin Anda teruskan ke penaut, misalnya, skrip penaut. Anda harus meneruskan tanda penaut secara terpisah yang diperlukan penaut untuk mengetahui file ini. Anda dapat melakukannya melalui atribut user_link_flags.
dynamic_deps

Daftar label; default adalah []

Ini adalah dependensi cc_shared_library lain yang menjadi dependensi target saat ini.

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

experimental_disable_topo_sort_do_not_use_remove_before_7_0

Boolean; default-nya adalah False

exports_filter

Daftar {i>string<i}; default-nya adalah []

Atribut ini berisi daftar target yang diklaim untuk diekspor oleh properti perpustakaan bersama.

Setiap target deps sudah dipahami untuk diekspor oleh library bersama. Atribut ini harus digunakan untuk mencantumkan target yang diekspor oleh library bersama tetapi merupakan dependensi transitif deps.

Perhatikan, atribut ini tidak benar-benar menambahkan edge dependensi ke target tersebut, edge dependensi seharusnya dibuat oleh deps.Entri dalam hanya berupa string. Perhatikan bahwa saat menempatkan target dalam atribut ini, hal ini dianggap sebagai klaim bahwa library bersama mengekspor simbol dari target tersebut. Logika cc_shared_library sebenarnya tidak menangani pemberian tahu penaut tentang semua simbol harus diekspor.

Sintaksis berikut diizinkan:

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

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

roots

Daftar label; default adalah []

shared_lib_name

String; default-nya adalah ""

Secara default, cc_shared_library akan menggunakan nama untuk file output pustaka 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 ini untuk memilih nama kustom.
static_deps

Daftar {i>string<i}; default-nya adalah []

Daftar {i>string<i}; default-nya adalah []

Tanda tambahan apa pun yang mungkin ingin Anda teruskan ke penaut. Misalnya, untuk membuat penaut yang mengetahui skrip penaut yang diteruskan melalui additional_linker_inputs, Anda dapat menggunakan berikut ini:

 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; default adalah None

File DEF Windows yang akan diteruskan ke penaut.

Atribut ini hanya boleh digunakan jika Windows adalah platform target. Template ini dapat digunakan untuk ekspor simbol selama menautkan galeri foto bersama.

cc_static_library

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

Pustaka statis yang dihasilkan berisi file objek dari target yang tercantum di deps serta dependensi transitifnya, dengan preferensi diberikan pada PIC objek.

Grup output

linkdeps

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

linkopts

File teks yang berisi linkopts yang diberikan pengguna untuk semua transitif dependensi target yang tercantum di deps.

Simbol duplikat

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

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

Dukungan Toolchain untuk symbol_check

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

  • Mengimplementasikan tindakan ACTION_NAMES.validate_static_library dan mengaktifkannya dengan fitur symbol_check. Set alat dalam aksi adalah dipanggil dengan dua argumen, pustaka statis untuk memeriksa simbol duplikat dan jalur file yang harus dibuat jika pemeriksaan lulus.
  • Memiliki fitur symbol_check akan menambahkan tanda pengarsip yang menyebabkan tindakan yang membuat {i>library <i}statis agar gagal pada simbol duplikat.

Argumen

Atribut
name

Nama; wajib diisi

Nama unik untuk target ini.

deps

Daftar label; default adalah []

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

Dependensi yang tidak menyediakan file objek apa pun tidak termasuk dalam konfigurasi {i>library<i}, tetapi label mereka dikumpulkan dalam file yang disediakan oleh linkdeps grup output.

cc_test

Lihat sumber aturan
cc_test(name, deps, srcs, data, additional_linker_inputs, args, compatible_with, copts, defines, deprecation, distribs, dynamic_deps, env, env_inherit, exec_compatible_with, exec_properties, features, flaky, hdrs_check, includes, licenses, link_extra_lib, linkopts, linkshared, linkstatic, local, local_defines, malloc, module_interfaces, nocopts, 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, tes adalah {i>wrapper<i} biner untuk beberapa kode pengujian.

Secara default, pengujian C++ ditautkan secara dinamis.
Untuk menautkan pengujian unit secara statis, tentukan linkstatic=True. Mungkin akan lebih baik untuk berkomentar tentang mengapa pengujian Anda membutuhkan linkstatic; hal ini mungkin tidak terlihat jelas.

Target output implisit

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

Lihat argumen cc_binary(), dengan pengecualian argumen stamp diatur ke 0 secara {i>default<i} untuk pengujian dan bahwa cc_test memiliki tambahan atribut yang umum untuk semua aturan pengujian (*_test).

Argumen

Atribut
name

Nama; wajib diisi

Nama unik untuk target ini.

deps

Daftar label; default adalah []

Daftar library lain yang akan ditautkan ke target biner.

Dapat berupa cc_library atau objc_library target.

Anda juga diizinkan untuk masukkan skrip penaut (.lds) ke dependensi, dan referensikan di linkopts.
srcs

Daftar label; default adalah []

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

Semua file .cc, .c, dan .cpp akan dapat dikompilasi. Ini mungkin file yang dihasilkan: jika file bernama ada outs dari beberapa aturan lain, cc_library ini akan bergantung secara otomatis pada aturan lain tersebut.

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

File .h tidak akan dikompilasi, tetapi akan tersedia untuk penyertaan menurut sumber dalam aturan ini. .cc dan File .h dapat langsung menyertakan header yang tercantum dalam srcs ini atau di hdrs aturan ini atau aturan yang tercantum dalam argumen deps.

Semua file #include hari harus disebutkan dalam Atribut hdrs dari cc_library ini atau yang direferensikan aturan, atau harus dicantumkan di srcs jika bersifat pribadi ke library ini. Lihat "Pemeriksaan penyertaan header" untuk penjelasan yang lebih rinci.

File .so, .lo, dan .a file yang telah dikompilasi sebelumnya. Pustaka Anda mungkin memiliki srcs jika menggunakan kode pihak ketiga yang tidak kami memiliki kode sumber.

Jika atribut srcs menyertakan label aturan lain, cc_library akan menggunakan file output dari aturan tersebut sebagai file sumber untuk mengompilasi. Hal ini berguna untuk pembuatan kode sumber satu kali (lebih dari sesekali digunakan, sebaiknya implementasikan class aturan Starlark dan gunakan cc_common API)

srcs jenis file 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 preprocessor C: .S
  • Arsipkan: .a, .pic.a
  • "Selalu tautkan" library: .lo, .pic.lo
  • Pustaka bersama, berversi 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; default adalah []

Daftar file yang dibutuhkan library ini saat runtime. Lihat komentar umum tentang data pada Atribut umum didefinisikan oleh sebagian besar aturan build.

Jika data adalah nama file yang dihasilkan, maka Aturan cc_library secara otomatis bergantung pada aturan.

Jika data adalah nama aturan, maka cc_library aturan secara otomatis bergantung pada aturan tersebut, dan outs aturan tersebut akan 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; default adalah []

Teruskan file-file ini ke perintah linker C++.

Misalnya, file .res Windows yang dikompilasi dapat disediakan di sini untuk disematkan pada target biner.

copts

Daftar {i>string<i}; default-nya adalah []

Tambahkan opsi ini ke perintah kompilasi C++. Tunduk kepada substitusi "Buat variabel" dan Tokenisasi shell Bourne.

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

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

defines

Daftar {i>string<i}; default-nya adalah []

Daftar definisi yang akan ditambahkan ke baris kompilasi. Tunduk kepada "Merek" substitusi variabel dan Tokenisasi shell Bourne. Setiap {i>string<i}, yang harus terdiri dari satu token shell Bourne, diawali dengan -D dan ditambahkan ke command line kompilasi ke target ini, serta setiap aturan yang bergantung padanya. Hati-hati, karena hal ini mungkin berdampak luas. Jika ragu, tambahkan nilai {i>define <i}ke local_defines saja.
dynamic_deps

Daftar label; default adalah []

Ini adalah dependensi cc_shared_library lain yang menjadi dependensi target saat ini.

Implementasi cc_shared_library akan menggunakan daftar dynamic_deps (secara transitif, yaitu juga dynamic_deps dari target saat ini dynamic_deps) untuk menentukan cc_libraries mana di deps transitif 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 {i>string<i}; default-nya adalah []

Daftar include dir yang akan ditambahkan ke baris kompilasi. Tunduk pada substitusi "Buat variabel". Setiap {i>string<i} diawali dengan jalur paket dan diteruskan ke toolchain C++ untuk perluasan melalui "include_paths" CROSSTOOL. Toolchain yang berjalan pada sistem POSIX dengan definisi fitur umum akan menghasilkan -isystem path_to_package/include_entry. Fungsi 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 menjadi dependensinya.) Membuat sangat berhati-hati, karena hal ini dapat menimbulkan jangkauan luas. Jika ragu, tambahkan "-Saya" flag ke COPTS.

Jalur include yang ditambahkan akan menyertakan file yang dihasilkan serta dalam hierarki sumber.

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

Mengontrol penautan library tambahan.

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

linkopts

Daftar {i>string<i}; default-nya adalah []

Tambahkan flag ini ke perintah linker C++. Tunduk kepada "Merek" substitusi variabel, Tokenisasi shell Bourne dan perluasan label. Setiap string dalam atribut ini ditambahkan ke LINKOPTS sebelum menautkan target biner.

Setiap elemen daftar ini yang tidak diawali dengan $ atau - diasumsikan sebagai label target di deps. Tujuan daftar file yang dihasilkan oleh target tersebut ditambahkan ke penaut lainnya. Error akan dilaporkan jika label tidak valid, atau tidak dideklarasikan di deps.

linkshared

Boolean; default-nya adalah False

Membuat galeri foto bersama. Untuk mengaktifkan atribut ini, sertakan linkshared=True dalam aturan Anda. Secara default opsi ini nonaktif.

Adanya tanda ini berarti penautan terjadi dengan tanda -shared ke gcc, dan library bersama yang dihasilkan cocok untuk dimuat ke dalam contoh program Java. Namun, untuk tujuan build, skrip tidak akan pernah ditautkan ke biner dependen, karena diasumsikan bahwa perpustakaan bersama dibangun dengan Aturan cc_binary hanya dimuat secara manual oleh program lain, jadi library ini tidak boleh dianggap sebagai pengganti cc_library aturan. Demi skalabilitas, sebaiknya hindari pendekatan ini sama sekali dan hanya dengan mengizinkan java_library bergantung pada aturan cc_library sebagai gantinya.

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

linkstatic

Boolean; default-nya adalah False

Untuk cc_binary dan cc_test: menautkan biner secara statis mode. Untuk cc_library.link_static: lihat di bawah.

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

Jika diaktifkan dan ini adalah biner atau pengujian, opsi ini 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 tertaut secara dinamis, seperti library yang tidak ada library statis. Jadi, file yang dapat dieksekusi yang dihasilkan akan tetap dinamis tertaut, oleh karena itu hanya sebagian besar statis.

Sebenarnya ada tiga cara untuk menautkan {i>executable<i}:

  • STATIC dengan fitur full_static_link, di mana semuanya ditautkan secara statis; mis. "gcc -static foo.o libbar.a libbaz.a -lm".
    Mode ini diaktifkan dengan menetapkan fully_static_link pada features.
  • STATIC, di mana semua pustaka pengguna ditautkan secara statis (jika baru tersedia), tetapi jika library sistem (tidak termasuk library runtime C/C++) tertaut secara dinamis, mis. "gcc foo.o libfoo.a libbaz.a -lm".
    Mode ini diaktifkan dengan menetapkan linkstatic=True.
  • DINAMIS, yang semua library ditautkan secara dinamis (jika versi dinamis tersedia), mis. "gcc foo.o libfoo.so libbaz.so -lm".
    Mode ini diaktifkan dengan menetapkan linkstatic=False.

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

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

Seharusnya sangat sedikit kode yang dibuat dengan linkstatic=False dalam produksi. Jika linkstatic=False, alat build akan membuat symlink ke bergantung pada library bersama di area *.runfiles.

local_defines

Daftar {i>string<i}; default-nya adalah []

Daftar definisi yang akan ditambahkan ke baris kompilasi. Tunduk kepada "Merek" substitusi variabel dan Tokenisasi shell Bourne. Setiap {i>string<i}, yang harus terdiri dari satu token shell Bourne, diawali dengan -D dan ditambahkan ke command line kompilasi untuk target ini, tetapi tidak kepada tanggungannya.
malloc

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

Mengganti dependensi default pada malloc.

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

module_interfaces

Daftar label; default adalah []

Daftar file ini dianggap sebagai Antarmuka Modul C++20.

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

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

Penggunaan dilindungi oleh flag --experimental_cpp_modules.

nocopts

String; default-nya adalah ""

Menghapus opsi yang cocok dari perintah kompilasi C++. Tunduk kepada "Merek" variabel. Nilai atribut ini ditafsirkan sebagai ekspresi reguler. Semua 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 kompilasi aturan ini. Atribut ini tidak boleh diperlukan atau digunakan di luar third_party. Nilai tidak diproses sebelumnya dengan cara apa pun selain "Membuat" substitusi variabel.
reexport_deps

Daftar label; default adalah []

stamp

{i>Integer<i} (Bilangan bulat): default-nya adalah 0

Apakah ingin mengenkode informasi build ke dalam biner. Nilai yang mungkin:
  • stamp = 1: Selalu tambahkan informasi build ke dalam biner, bahkan dalam --nostamp build. Ini harus dihindari, karena berpotensi mematikan caching jarak jauh untuk biner dan tindakan downstream apa pun yang bergantung padanya.
  • stamp = 0: Selalu ganti informasi build dengan nilai konstanta. Ini memberikan cache hasil build yang baik.
  • stamp = -1: Penyematan informasi build dikontrol oleh Tanda --[no]stamp.

Biner yang distempel tidak dibangun ulang kecuali jika dependensinya berubah.

win_def_file

Label; default adalah None

File DEF Windows yang akan diteruskan ke penaut.

Atribut ini hanya boleh digunakan jika Windows adalah platform target. Template ini dapat digunakan untuk ekspor simbol selama menautkan galeri foto 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, distribs, dwp_files, dynamic_runtime_lib, exec_compatible_with, exec_properties, exec_transition_for_inputs, features, libc_top, licenses, linker_files, module_map, objcopy_files, output_licenses, restricted_to, static_runtime_lib, strip_files, supports_header_parsing, supports_param_files, tags, target_compatible_with, testonly, toolchain_config, toolchain_identifier, toolchains, visibility)

Merepresentasikan toolchain C++.

Aturan ini bertanggung jawab untuk:

  • Mengumpulkan semua artefak yang diperlukan untuk menjalankan tindakan C++. Hal ini dilakukan dengan seperti all_files, compiler_files, linker_files, atau atribut lainnya yang diakhiri dengan _files). Berikut adalah paling sering {i>filegroup<i} menggabungkan semua file yang diperlukan.
  • Membuat command line yang benar untuk tindakan C++. Hal ini dilakukan dengan Penyedia CcToolchainConfigInfo (detail di bawah).

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

Menggunakan tags = ["manual"] untuk mencegah toolchain dibuat dan dikonfigurasi tidak perlu saat memanggil bazel build //...

Argumen

Atribut
name

Nama; wajib diisi

Nama unik untuk target ini.

all_files

Label; wajib diisi

Koleksi semua artefak cc_toolchain. Artefak ini akan ditambahkan sebagai input ke semua tindakan terkait rules_cc (kecuali tindakan yang menggunakan kumpulan artefak dari atribut di bawah). Bazel menganggap all_files adalah superset dari semua atribut penyedia artefak lainnya (mis., kompilasi linkstamp membutuhkan kompilasi dan menautkan file, sehingga memerlukan all_files).

Itulah isi cc_toolchain.files, dan ini digunakan oleh semua Starlark menggunakan toolchain C++.

ar_files

Label; default adalah None

Koleksi semua artefak cc_toolchain yang diperlukan untuk tindakan pengarsipan.
as_files

Label; default adalah None

Koleksi semua artefak cc_ toolchain yang diperlukan untuk tindakan assembly.
compiler_files

Label; wajib diisi

Koleksi semua artefak cc_toolchain yang diperlukan untuk tindakan kompilasi.
compiler_files_without_includes

Label; default adalah None

Koleksi semua artefak cc_ toolchain yang diperlukan untuk tindakan kompilasi jika penemuan input didukung (saat ini khusus Google).
coverage_files

Label; default adalah None

Koleksi semua artefak cc_toolchain yang diperlukan untuk tindakan cakupan. Jika tidak ditentukan, {i>all_file<i} digunakan.
dwp_files

Label; wajib diisi

Koleksi semua artefak cc_toolchain yang diperlukan untuk tindakan dwp.
dynamic_runtime_lib

Label; default adalah None

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

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

exec_transition_for_inputs

Boolean; default-nya adalah False

Tidak digunakan lagi. Tanpa pengoperasian.
libc_top

Label; default adalah None

Kumpulan artefak untuk libc yang diteruskan sebagai input untuk mengompilasi/menautkan tindakan.
linker_files

Label; wajib diisi

Koleksi semua artefak cc_ toolchain yang diperlukan untuk menautkan tindakan.
module_map

Label; default adalah None

Artefak peta modul yang akan digunakan untuk build modular.
objcopy_files

Label; wajib diisi

Koleksi semua artefak cc_toolchain yang diperlukan untuk tindakan objcopy.
output_licenses

Daftar {i>string<i}; default-nya adalah []

static_runtime_lib

Label; default adalah None

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

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

strip_files

Label; wajib diisi

Koleksi semua artefak cc_toolchain yang diperlukan untuk tindakan strip.
supports_header_parsing

Boolean; default-nya adalah False

Tetapkan ke Benar jika cc_toolchain mendukung tindakan penguraian header.
supports_param_files

Boolean; default-nya adalah True

Setel ke Benar (True) jika cc_ toolchain mendukung penggunaan file param untuk menautkan tindakan.
toolchain_config

Label; wajib diisi

Label aturan yang menyediakan cc_toolchain_config_info.
toolchain_identifier

String; default-nya adalah ""

ID yang digunakan untuk cocok dengan cc_toolchain ini dengan ID crosstool_config.toolchain.

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

cc_toolchain_suite

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

Tidak digunakan lagi: aturan tidak dioperasikan dan akan dihapus.

Argumen

Atribut
name

Nama; wajib diisi

Nama unik untuk target ini.

fdo_prefetch_hints

Lihat sumber aturan
fdo_prefetch_hints(name, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, 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 diisi

Nama unik untuk target ini.

profile

Label; wajib diisi

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, distribs, exec_compatible_with, exec_properties, features, memprof_profile, 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 diisi

Nama unik untuk target ini.

memprof_profile

Label; default adalah None

Label profil MemProf. Profil ini diharapkan memiliki baik ekstensi .profdata (untuk memprof terindeks/disimbolkan profil), atau ekstensi .zip untuk {i>zipfile<i} yang berisi memprof.profdata .
profile

Label; wajib diisi

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

Label; default adalah None

Label profil protobuf.

memprof_profile

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

Merepresentasikan profil MEMPROF yang ada di ruang kerja. Contoh:


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

Argumen

Atribut
name

Nama; wajib diisi

Nama unik untuk target ini.

profile

Label; wajib diisi

Label profil MEMPROF. Profil ini diharapkan memiliki baik ekstensi .profdata (untuk memprof terindeks/disimbolkan profil), atau ekstensi .zip untuk {i>zipfile<i} yang berisi 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, distribs, exec_compatible_with, exec_properties, features, ld_profile, 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 diisi

Nama unik untuk target ini.

cc_profile

Label; wajib diisi

Label profil yang diteruskan ke berbagai tindakan kompilasi. File ini memiliki ekstensi {i> .txt<i}.
ld_profile

Label; wajib diisi

Label profil yang diteruskan ke tindakan penautan. File ini memiliki ekstensi {i> .txt<i}.