Aturan C / C ++

Laporkan masalah Lihat sumber

Aturan

cc_biner

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

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 strip tambahan dapat diberikan pada command line menggunakan --stripopt=-foo. Output ini hanya dibuat jika diminta secara eksplisit.
  • 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. Lain-lain: file kosong.

Argumen

Atribut
name

Name; required

Nama unik untuk target ini.

deps

List of labels; optional

Daftar library lain yang akan ditautkan ke target biner.

Ini bisa berupa target cc_library atau objc_library.

srcs

List of labels; optional

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

Semua file .cc, .c, dan .cpp akan dikompilasi. Ini mungkin adalah file yang dihasilkan: jika file bernama berada di outs dari beberapa aturan lain, aturan ini akan otomatis bergantung pada aturan lain tersebut.

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

Semua file #include harus disebutkan dalam atribut srcs aturan ini, atau dalam atribut hdrs dari cc_library() yang direferensikan. Gaya yang direkomendasikan adalah agar header yang terkait dengan library dicantumkan dalam atribut hdrs library tersebut, dan header lainnya yang terkait dengan sumber aturan ini akan dicantumkan dalam srcs. Lihat "Pemeriksaan penyertaan header" untuk deskripsi lebih mendetail.

Jika nama aturan ada di srcs, aturan ini akan otomatis bergantung pada aturan tersebut. Jika outs aturan bernama adalah file sumber C atau C++, file tersebut akan dikompilasi ke dalam aturan ini. Jika file tersebut adalah file library, aturan tersebut akan ditautkan.

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
  • Library "Selalu tautkan": .lo, .pic.lo
  • Library bersama, berversi atau tidak berversi: .so, .so.version
  • File objek: .o, .pic.o

...dan aturan apa pun yang membuat file tersebut. Ekstensi yang berbeda menunjukkan bahasa pemrograman yang berbeda sesuai dengan konvensi gcc.

additional_linker_inputs

List of labels; optional

Teruskan file ini ke perintah penaut C++.

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

copts

List of strings; optional

Tambahkan opsi ini ke perintah kompilasi C++. Tunduk pada substitusi "Make variabel" dan tokenisasi shell Shell.

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

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

defines

List of strings; optional

Daftar definisi yang akan ditambahkan ke baris kompilasi. Tunduk pada substitusi variabel"Make" dan token shell Shell. Setiap string, 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. Berhati-hatilah karena hal ini mungkin memiliki efek yang luas. Jika ragu, tambahkan nilai yang ditentukan ke local_defines.
includes

List of strings; optional

Daftar direktori penyertaan yang akan ditambahkan ke baris kompilasi.

Tunduk pada substitusi "Buat variabel". Setiap string diawali dengan -isystem dan ditambahkan ke COPTS. Tidak seperti COPTS, flag ini ditambahkan untuk aturan ini dan setiap aturan yang bergantung padanya. (Catatan: bukan aturan yang diandalkan) Berhati-hatilah, karena hal ini dapat menimbulkan efek yang luas. Jika ragu, tambahkan flag "-I" ke COPTS.

Header harus ditambahkan ke src atau hdr, jika tidak, header tersebut tidak akan tersedia untuk aturan dependen saat kompilasi di-sandbox (default).

linkopts

List of strings; optional

Tambahkan flag ini ke perintah penaut C++. Tunduk pada substitusi variabel"Make", tokenisasi shell Bourne dan perluasan label. Setiap string dalam atribut ini ditambahkan ke LINKOPTS sebelum menautkan target biner.

Setiap elemen daftar ini yang tidak dimulai dengan $ atau - diasumsikan sebagai label target dalam deps. Daftar file yang dihasilkan oleh target tersebut akan ditambahkan ke opsi penaut. Error akan dilaporkan jika label tidak valid atau tidak dideklarasikan dalam deps.

linkshared

Boolean; optional; nonconfigurable; default is False

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

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

Jika 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; optional; default is True

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

Secara default, opsi ini diaktifkan untuk cc_binary dan dinonaktifkan untuk sisanya.

Jika diaktifkan dan ini adalah biner atau pengujian, opsi ini akan memberi tahu alat build untuk menautkan ke .a, bukan .so untuk library pengguna, jika memungkinkan. Beberapa library sistem mungkin masih ditautkan secara dinamis, begitu juga library yang tidak memiliki library statis. Jadi, file yang dapat dieksekusi yang dihasilkan akan tetap ditautkan secara dinamis, sehingga sebagian besar hanya statis.

Ada tiga cara yang berbeda untuk menautkan file yang dapat dieksekusi:

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

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.

Jika linkstatic=False, alat build akan membuat symlink ke library bersama yang bergantung pada area *.runfiles.

local_defines

List of strings; optional

Daftar definisi yang akan ditambahkan ke baris kompilasi. Tunduk pada substitusi variabel"Make" dan token shell 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 ke turunannya.
malloc

Label; optional; default is @bazel_tools//tools/cpp:malloc

Mengganti dependensi default di Malloc.

Secara default, biner C++ ditautkan ke //tools/cpp:malloc, yang merupakan library kosong sehingga biner akhirnya menggunakan libc maloc. 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.

nocopts

String; optional

Hapus opsi yang cocok dari perintah kompilasi C++. Tunduk pada substitusi variabel"Make". Nilai atribut ini ditafsirkan sebagai regular expression. Setiap COPTS yang sudah ada yang cocok dengan ekspresi reguler ini (termasuk nilai yang secara eksplisit ditentukan dalam atribut copts aturan) akan dihapus dari COPTS untuk tujuan mengompilasi aturan ini. Atribut ini jarang diperlukan.
stamp

Integer; optional; default is -1

Apakah mengenkode informasi build ke dalam biner. Nilai yang memungkinkan:
  • stamp = 1: Selalu cap informasi informasi ke biner, bahkan dalam build --nostamp. Setelan ini harus dihindari, karena berpotensi menghentikan caching jarak jauh untuk biner dan tindakan downstream yang bergantung padanya.
  • stamp = 0: Selalu mengganti informasi build dengan nilai konstanta. Ini memberikan penyimpanan hasil build yang baik ke dalam cache.
  • stamp = -1: Penyematan informasi build dikontrol oleh tanda --[no]stamp.

Biner yang distempel tidak dibuat ulang kecuali jika dependensinya berubah.

win_def_file

Label; optional

File DEF Windows yang akan diteruskan ke penaut.

Atribut ini hanya boleh digunakan jika Windows adalah platform targetnya. API ini dapat digunakan untuk mengekspor simbol selama menautkan library bersama.

cc_impor

Lihat sumber aturan
cc_import(name, deps, data, hdrs, alwayslink, compatible_with, deprecation, distribs, features, interface_library, licenses, restricted_to, shared_library, static_library, system_provided, tags, target_compatible_with, testonly, visibility)

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

Berikut adalah kasus penggunaan standar:
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 (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 (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
Di Unix:
cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  static_library = "libmylib.a",
  shared_library = "libmylib.so",
)

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

# second will link to libmylib.so
cc_binary(
  name = "second",
  srcs = ["second.cc"],
  deps = [":mylib"],
  linkstatic = 0,
)
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",
)

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

# second will link to mylib.dll through mylib.lib
cc_binary(
  name = "second",
  srcs = ["second.cc"],
  deps = [":mylib"],
  linkstatic = 0,
)
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

Name; required

Nama unik untuk target ini.

deps

List of labels; optional

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

List of labels; optional

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

Boolean; optional; default is False

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

Jika selalu link tidak berfungsi dengan VS 2017 di Windows, yang disebabkan oleh masalah umum, upgrade VS 2017 ke versi terbaru.

interface_library

Label; optional

Library antarmuka tunggal untuk menautkan library bersama.

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

shared_library

Label; optional

Library bersama yang telah dikompilasi sebelumnya. Bazel memastikannya tersedia untuk biner yang bergantung padanya selama runtime.

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

static_library

Label; optional

Library statis tunggal yang telah dikompilasi sebelumnya.

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

system_provided

Boolean; optional; default is False

Jika 1, ini menunjukkan 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, alwayslink, compatible_with, copts, defines, deprecation, distribs, exec_compatible_with, exec_properties, features, implementation_deps, include_prefix, includes, licenses, linkopts, linkstamp, linkstatic, local_defines, nocopts, restricted_to, strip_include_prefix, tags, target_compatible_with, testonly, textual_hdrs, toolchains, visibility, win_def_file)

Pemeriksaan penyertaan header

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

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

Aturan cc_binary dan cc_test tidak memiliki antarmuka yang diekspor, sehingga juga tidak memiliki atribut hdrs. Semua header yang termasuk dalam biner atau pengujian secara langsung harus dicantumkan di 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 menyertakan foo.h dan bar.h secara langsung, tetapi tidak baz.h.

Menyertakan filePenyertaan yang diizinkan
foo.hbatang
foo.ccfoo.h batang.h
batangbar-impl.h baz.h
batang-impl.hbar.h baz.h
bar.ccbar.h bar-impl.h baz.h
Baz.hbaz-impl.h
baz-impl.hBaz.h
Baz.ccbaz.h-impl.h

Aturan pemeriksaan penyertaan hanya berlaku untuk penyertaan langsung. Dalam contoh di atas, foo.cc diizinkan untuk menyertakan bar.h, yang dapat mencakup baz.h, yang nantinya 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 di penutupan deps transitif. Dalam hal ini, compiler dapat membaca baz.h dan baz-impl.h saat mengompilasi foo.cc, tetapi foo.cc tidak boleh berisi #include "baz.h". Agar 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.

Argumen

Atribut
name

Name; required

Nama unik untuk target ini.

deps

List of labels; optional

Daftar library lain yang akan ditautkan ke target biner.

Ini bisa berupa target cc_library atau objc_library.

srcs

List of labels; optional

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

Semua file .cc, .c, dan .cpp akan dikompilasi. Ini mungkin adalah file yang dihasilkan: jika file bernama berada di outs dari beberapa aturan lain, aturan ini akan otomatis bergantung pada aturan lain tersebut.

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

Semua file #include harus disebutkan dalam atribut srcs aturan ini, atau dalam atribut hdrs dari cc_library() yang direferensikan. Gaya yang direkomendasikan adalah agar header yang terkait dengan library dicantumkan dalam atribut hdrs library tersebut, dan header lainnya yang terkait dengan sumber aturan ini akan dicantumkan dalam srcs. Lihat "Pemeriksaan penyertaan header" untuk deskripsi lebih mendetail.

Jika nama aturan ada di srcs, aturan ini akan otomatis bergantung pada aturan tersebut. Jika outs aturan bernama adalah file sumber C atau C++, file tersebut akan dikompilasi ke dalam aturan ini. Jika file tersebut adalah file library, aturan tersebut akan ditautkan.

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
  • Library "Selalu tautkan": .lo, .pic.lo
  • Library bersama, berversi atau tidak berversi: .so, .so.version
  • File objek: .o, .pic.o

...dan aturan apa pun yang membuat file tersebut. Ekstensi yang berbeda menunjukkan bahasa pemrograman yang berbeda sesuai dengan konvensi gcc.

hdrs

List of labels; optional

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

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

Boolean; optional; default is False

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

Jika selalu link tidak berfungsi dengan VS 2017 di Windows, yang disebabkan oleh masalah umum, upgrade VS 2017 ke versi terbaru.

copts

List of strings; optional

Tambahkan opsi ini ke perintah kompilasi C++. Tunduk pada substitusi "Make variabel" dan tokenisasi shell Shell.

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

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

defines

List of strings; optional

Daftar definisi yang akan ditambahkan ke baris kompilasi. Tunduk pada substitusi variabel"Make" dan token shell Shell. Setiap string, 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. Berhati-hatilah karena hal ini mungkin memiliki efek yang luas. Jika ragu, tambahkan nilai yang ditentukan ke local_defines.
implementation_deps

List of labels; optional

Daftar library lain yang menjadi target library. Tidak seperti deps, header dan jalur penyertaan 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.

Untuk saat ini, penggunaan dibatasi untuk cc_library dan dilindungi oleh flag --experimental_cc_implementation_deps.

include_prefix

String; optional

Awalan yang akan ditambahkan ke jalur header aturan ini.

Jika ditetapkan, header dalam atribut hdrs aturan ini yang dapat diakses adalah nilai atribut ini yang ditambahkan di awal jalur relatif repositori.

Awalan dalam atribut strip_include_prefix dihapus sebelum awalan ini ditambahkan.

includes

List of strings; optional

Daftar direktori penyertaan yang akan ditambahkan ke baris kompilasi.

Tunduk pada substitusi "Buat variabel". Setiap string diawali dengan -isystem dan ditambahkan ke COPTS. Tidak seperti COPTS, flag ini ditambahkan untuk aturan ini dan setiap aturan yang bergantung padanya. (Catatan: bukan aturan yang diandalkan) Berhati-hatilah, karena hal ini dapat menimbulkan efek yang luas. Jika ragu, tambahkan flag "-I" ke COPTS.

Header harus ditambahkan ke src atau hdr, jika tidak, header tersebut tidak akan tersedia untuk aturan dependen saat kompilasi di-sandbox (default).

linkopts

List of strings; optional

Tambahkan flag ini ke perintah penaut C++. Tunduk pada substitusi variabel"Make", tokenisasi shell Bourne dan perluasan label. Setiap string dalam atribut ini ditambahkan ke LINKOPTS sebelum menautkan target biner.

Setiap elemen daftar ini yang tidak dimulai dengan $ atau - diasumsikan sebagai label target dalam deps. Daftar file yang dihasilkan oleh target tersebut akan ditambahkan ke opsi penaut. Error akan dilaporkan jika label tidak valid atau tidak dideklarasikan dalam deps.

linkstamp

Label; optional

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 linktamp mungkin tidak mencakup kumpulan flag compiler tertentu, sehingga tidak boleh bergantung pada header, opsi compiler, atau variabel build tertentu lainnya. Opsi ini hanya diperlukan dalam paket base.
linkstatic

Boolean; optional; default is False

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

Secara default, opsi ini diaktifkan untuk cc_binary dan dinonaktifkan untuk sisanya.

Jika diaktifkan dan ini adalah biner atau pengujian, opsi ini akan memberi tahu alat build untuk menautkan ke .a, bukan .so untuk library pengguna, jika memungkinkan. Beberapa library sistem mungkin masih ditautkan secara dinamis, begitu juga library yang tidak memiliki library statis. Jadi, file yang dapat dieksekusi yang dihasilkan akan tetap ditautkan secara dinamis, sehingga sebagian besar hanya statis.

Ada tiga cara yang berbeda untuk menautkan file yang dapat dieksekusi:

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

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.

Jika linkstatic=False, alat build akan membuat symlink ke library bersama yang bergantung pada area *.runfiles.

local_defines

List of strings; optional

Daftar definisi yang akan ditambahkan ke baris kompilasi. Tunduk pada substitusi variabel"Make" dan token shell 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 ke turunannya.
nocopts

String; optional

Hapus opsi yang cocok dari perintah kompilasi C++. Tunduk pada substitusi variabel"Make". Nilai atribut ini ditafsirkan sebagai regular expression. Setiap COPTS yang sudah ada yang cocok dengan ekspresi reguler ini (termasuk nilai yang secara eksplisit ditentukan dalam atribut copts aturan) akan dihapus dari COPTS untuk tujuan mengompilasi aturan ini. Atribut ini jarang diperlukan.
strip_include_prefix

String; optional

Awalan yang akan dihapus dari jalur header aturan ini.

Jika disetel, header dalam atribut hdrs aturan ini dapat diakses di jalurnya dengan awalan ini yang terpotong.

Jika itu adalah jalur relatif, jalur tersebut akan diambil sebagai jalur relatif paket. Jika bersifat mutlak, kolom ini akan dipahami sebagai jalur relatif repositori.

Awalan dalam atribut include_prefix ditambahkan setelah awalan ini dihapus.

textual_hdrs

List of labels; optional

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

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

win_def_file

Label; optional

File DEF Windows yang akan diteruskan ke penaut.

Atribut ini hanya boleh digunakan jika Windows adalah platform targetnya. API ini dapat digunakan untuk mengekspor simbol selama menautkan library bersama.

cc_proto_library

Lihat sumber aturan
cc_proto_library(name, deps, data, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, licenses, restricted_to, tags, target_compatible_with, testonly, 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

Name; required

Nama unik untuk target ini.

deps

List of labels; optional

Daftar aturan proto_library untuk menghasilkan kode C++.

cc_library_bersama

Lihat sumber aturan
cc_shared_library(name, deps, additional_linker_inputs, dynamic_deps, exports_filter, shared_lib_name, tags, user_link_flags, win_def_file)

Alat 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 foo_shared menautkan secara statis foo dan baz, yang terakhir menjadi dependensi transitif. Ini tidak menautkan bar karena sudah disediakan secara dinamis oleh dynamic_dep bar_shared.

foo_shared menggunakan skrip *.lds skrip penaut 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 library bersama mengekspor target yang sama.

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

Setiap cc_library dalam contoh harus muncul paling banyak dalam satu cc_shared_library. Jika ingin menautkan baz juga ke bar_shared, kita harus 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 yang berbeda yang mengekspor target yang sama. Untuk mengatasi hal ini, 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 terkait ekspor.

Salah satu cara untuk memperbaikinya adalah dengan berhenti menautkan library ke dalam salah satu dependensi cc_shared_library. Pada saat yang sama, situs yang masih menautkan library tersebut harus mengekspor library sehingga library yang tidak menautkannya akan tetap mempertahankan visibilitas ke simbol. Cara lainnya adalah dengan menarik library ketiga yang mengekspor target. Cara ketiga adalah memberi tag penyebab cc_library dengan LINKABLE_MORE_THAN_ONCE, tetapi perbaikan ini akan jarang terjadi dan Anda harus benar-benar memastikan bahwa cc_library tersebut benar-benar 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 dalam dynamic_deps dan tidak diekspor.

Solusinya adalah mengekspornya dari dependensi cc_shared_library atau mengambil 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, variabel ini tidak termasuk dalam deps dari cc_shared_library. Jika library dinamis yang telah dikompilasi ini merupakan dependensi dari salah satu cc_libraries Anda, cc_library perlu 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 targetnya dari dependensi dinamis, atau pastikan exports_filter tidak menangkap target ini.

Argumen

Atribut
name

Name; required

Nama unik untuk target ini.

deps

List of labels; optional

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

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

Selama analisis, penerapan aturan akan menganggap setiap target yang tercantum dalam deps sebagai diekspor oleh library bersama untuk memberikan error saat beberapa cc_shared_libraries mengekspor target yang sama. Implementasi aturan tidak akan memberi tahu penaut tentang simbol mana yang harus diekspor oleh objek bersama. Pengguna harus menangani hal ini melalui skrip penaut atau deklarasi visibilitas di kode sumber.

Implementasi 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 dari salah satu library bersama, sehingga salah satu dapat membuat dynamic_dep dari yang lain.

additional_linker_inputs

List of labels; optional

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

List of labels; optional

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 dynamic_deps target saat ini) untuk menentukan cc_libraries mana dalam deps transitif yang tidak boleh ditautkan karena sudah disediakan oleh cc_shared_library yang berbeda.

exports_filter

List of strings; optional

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

Semua 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 bahwa atribut ini sebenarnya tidak menambahkan tepi dependensi ke target tersebut, tepi dependensi seharusnya dibuat oleh deps.Entri dalam atribut ini hanyalah string. Perhatikan bahwa saat menempatkan target dalam atribut ini, ini dianggap sebagai klaim bahwa library bersama mengekspor simbol dari target tersebut. Logika cc_shared_library tidak benar-benar menangani pemberitahuan kepada linker mengenai simbol mana yang harus diekspor.

Sintaksis berikut diizinkan:

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

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

shared_lib_name

String; optional

Secara default, cc_shared_library akan menggunakan nama untuk file output library bersama berdasarkan platform dan nama target. 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.

List of strings; optional

Flag tambahan yang mungkin ingin Anda teruskan ke penaut. Misalnya, agar penaut mengetahui skrip penaut yang diteruskan melalui input_linker_inputs tambahan, Anda dapat menggunakan hal 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; optional

File DEF Windows yang akan diteruskan ke penaut.

Atribut ini hanya boleh digunakan jika Windows adalah platform targetnya. API ini dapat digunakan untuk mengekspor simbol selama menautkan library bersama.

fdo_prefetch_hints

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

Merepresentasikan profil petunjuk pengambilan data FDO yang ada di ruang kerja atau di jalur absolut yang ditentukan. Contoh:

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

fdo_profile(
  name = "hints_abs",
  absolute_path_profile = "/absolute/path/profile.afdo",
)

Argumen

Atribut
name

Name; required

Nama unik untuk target ini.

profile

Label; optional

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

profil_fdo

Lihat sumber aturan
fdo_profile(name, absolute_path_profile, compatible_with, deprecation, distribs, features, licenses, profile, proto_profile, restricted_to, tags, target_compatible_with, testonly, visibility)

Mewakili profil FDO yang ada di ruang kerja atau di jalur absolut yang ditentukan. Contoh:

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

fdo_profile(
  name = "fdo_abs",
  absolute_path_profile = "/absolute/path/profile.zip",
)

Argumen

Atribut
name

Name; required

Nama unik untuk target ini.

absolute_path_profile

String; optional

Jalur absolut ke profil FDO. File FDO mungkin hanya memiliki ekstensi .afdo.
profile

Label; optional

Label profil FDO atau aturan yang menghasilkannya. File FDO dapat memiliki salah satu ekstensi berikut: .profraw untuk profil LLVM yang tidak terindeks, .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; optional

Label profil protobuf.

propeller_optimize

Lihat sumber aturan
propeller_optimize(name, compatible_with, deprecation, distribs, features, ld_profile, licenses, restricted_to, tags, target_compatible_with, testonly, 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"
)

propeller_optimize(
    name = "layout_absolute",
    absolute_cc_profile = "/absolute/cc_profile.txt",
    absolute_ld_profile = "/absolute/ld_profile.txt"
)

Argumen

Atribut
name

Name; required

Nama unik untuk target ini.

ld_profile

Label; optional

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

uji_cc

Lihat sumber aturan
cc_test(name, deps, srcs, data, additional_linker_inputs, args, compatible_with, copts, defines, deprecation, distribs, env, env_inherit, exec_compatible_with, exec_properties, features, flaky, includes, licenses, linkopts, linkstatic, local, local_defines, malloc, nocopts, restricted_to, shard_count, size, stamp, tags, target_compatible_with, testonly, timeout, toolchains, visibility, win_def_file)

Argumen

Atribut
name

Name; required

Nama unik untuk target ini.

deps

List of labels; optional

Daftar library lain yang akan ditautkan ke target biner.

Ini bisa berupa target cc_library atau objc_library.

srcs

List of labels; optional

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

Semua file .cc, .c, dan .cpp akan dikompilasi. Ini mungkin adalah file yang dihasilkan: jika file bernama berada di outs dari beberapa aturan lain, aturan ini akan otomatis bergantung pada aturan lain tersebut.

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

Semua file #include harus disebutkan dalam atribut srcs aturan ini, atau dalam atribut hdrs dari cc_library() yang direferensikan. Gaya yang direkomendasikan adalah agar header yang terkait dengan library dicantumkan dalam atribut hdrs library tersebut, dan header lainnya yang terkait dengan sumber aturan ini akan dicantumkan dalam srcs. Lihat "Pemeriksaan penyertaan header" untuk deskripsi lebih mendetail.

Jika nama aturan ada di srcs, aturan ini akan otomatis bergantung pada aturan tersebut. Jika outs aturan bernama adalah file sumber C atau C++, file tersebut akan dikompilasi ke dalam aturan ini. Jika file tersebut adalah file library, aturan tersebut akan ditautkan.

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
  • Library "Selalu tautkan": .lo, .pic.lo
  • Library bersama, berversi atau tidak berversi: .so, .so.version
  • File objek: .o, .pic.o

...dan aturan apa pun yang membuat file tersebut. Ekstensi yang berbeda menunjukkan bahasa pemrograman yang berbeda sesuai dengan konvensi gcc.

additional_linker_inputs

List of labels; optional

Teruskan file ini ke perintah penaut C++.

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

copts

List of strings; optional

Tambahkan opsi ini ke perintah kompilasi C++. Tunduk pada substitusi "Make variabel" dan tokenisasi shell Shell.

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

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

defines

List of strings; optional

Daftar definisi yang akan ditambahkan ke baris kompilasi. Tunduk pada substitusi variabel"Make" dan token shell Shell. Setiap string, 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. Berhati-hatilah karena hal ini mungkin memiliki efek yang luas. Jika ragu, tambahkan nilai yang ditentukan ke local_defines.
includes

List of strings; optional

Daftar direktori penyertaan yang akan ditambahkan ke baris kompilasi.

Tunduk pada substitusi "Buat variabel". Setiap string diawali dengan -isystem dan ditambahkan ke COPTS. Tidak seperti COPTS, flag ini ditambahkan untuk aturan ini dan setiap aturan yang bergantung padanya. (Catatan: bukan aturan yang diandalkan) Berhati-hatilah, karena hal ini dapat menimbulkan efek yang luas. Jika ragu, tambahkan flag "-I" ke COPTS.

Header harus ditambahkan ke src atau hdr, jika tidak, header tersebut tidak akan tersedia untuk aturan dependen saat kompilasi di-sandbox (default).

linkopts

List of strings; optional

Tambahkan flag ini ke perintah penaut C++. Tunduk pada substitusi variabel"Make", tokenisasi shell Bourne dan perluasan label. Setiap string dalam atribut ini ditambahkan ke LINKOPTS sebelum menautkan target biner.

Setiap elemen daftar ini yang tidak dimulai dengan $ atau - diasumsikan sebagai label target dalam deps. Daftar file yang dihasilkan oleh target tersebut akan ditambahkan ke opsi penaut. Error akan dilaporkan jika label tidak valid atau tidak dideklarasikan dalam deps.

linkstatic

Boolean; optional; default is False

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

Secara default, opsi ini diaktifkan untuk cc_binary dan dinonaktifkan untuk sisanya.

Jika diaktifkan dan ini adalah biner atau pengujian, opsi ini akan memberi tahu alat build untuk menautkan ke .a, bukan .so untuk library pengguna, jika memungkinkan. Beberapa library sistem mungkin masih ditautkan secara dinamis, begitu juga library yang tidak memiliki library statis. Jadi, file yang dapat dieksekusi yang dihasilkan akan tetap ditautkan secara dinamis, sehingga sebagian besar hanya statis.

Ada tiga cara yang berbeda untuk menautkan file yang dapat dieksekusi:

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

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.

Jika linkstatic=False, alat build akan membuat symlink ke library bersama yang bergantung pada area *.runfiles.

local_defines

List of strings; optional

Daftar definisi yang akan ditambahkan ke baris kompilasi. Tunduk pada substitusi variabel"Make" dan token shell 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 ke turunannya.
malloc

Label; optional; default is @bazel_tools//tools/cpp:malloc

Mengganti dependensi default di Malloc.

Secara default, biner C++ ditautkan ke //tools/cpp:malloc, yang merupakan library kosong sehingga biner akhirnya menggunakan libc maloc. 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.

nocopts

String; optional

Hapus opsi yang cocok dari perintah kompilasi C++. Tunduk pada substitusi variabel"Make". Nilai atribut ini ditafsirkan sebagai regular expression. Setiap COPTS yang sudah ada yang cocok dengan ekspresi reguler ini (termasuk nilai yang secara eksplisit ditentukan dalam atribut copts aturan) akan dihapus dari COPTS untuk tujuan mengompilasi aturan ini. Atribut ini jarang diperlukan.
stamp

Integer; optional; default is 0

Apakah mengenkode informasi build ke dalam biner. Nilai yang memungkinkan:
  • stamp = 1: Selalu cap informasi informasi ke biner, bahkan dalam build --nostamp. Setelan ini harus dihindari, karena berpotensi menghentikan caching jarak jauh untuk biner dan tindakan downstream yang bergantung padanya.
  • stamp = 0: Selalu mengganti informasi build dengan nilai konstanta. Ini memberikan penyimpanan hasil build yang baik ke dalam cache.
  • stamp = -1: Penyematan informasi build dikontrol oleh tanda --[no]stamp.

Biner yang distempel tidak dibuat ulang kecuali jika dependensinya berubah.

win_def_file

Label; optional

File DEF Windows yang akan diteruskan ke penaut.

Atribut ini hanya boleh digunakan jika Windows adalah platform targetnya. API ini dapat digunakan untuk mengekspor simbol selama menautkan library bersama.

cc_jaringan

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

Mewakili toolchain C++.

Aturan ini bertanggung jawab atas:

  • 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). Jenis file ini paling sering digunakan untuk mengelompokkan semua file yang diperlukan.
  • Menghasilkan 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 konfigurasi toolchain C++ yang rumit dan dokumentasi pemilihan toolchain.

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

Argumen

Atribut
name

Name; required

Nama unik untuk target ini.

all_files

Label; required

Koleksi semua artefak cc_funnel. Artefak ini akan ditambahkan sebagai input untuk semua tindakan terkait Rules_cc (dengan pengecualian tindakan yang menggunakan kumpulan artefak yang lebih akurat dari atribut di bawah). Bazel mengasumsikan bahwa all_files adalah superset dari semua atribut lain yang menyediakan artefak (misalnya, kompilasi linktamp memerlukan file kompilasi dan link, sehingga diperlukan all_files).

Ini adalah isi dari cc_toolchain.files, dan ini digunakan oleh semua aturan Starlark menggunakan toolchain C++.

ar_files

Label; optional

Koleksi semua artefak cc_ toolchain yang diperlukan untuk tindakan pengarsipan.

as_files

Label; optional

Koleksi semua artefak cc_ toolchain yang diperlukan untuk tindakan perakitan.

compiler

String; optional; nonconfigurable

Tidak digunakan lagi. Sebagai gantinya, gunakan atribut toolchain_identifier. Penginstalan ini akan menjadi no setelah migrasi CROSSTOOL ke Starlark , dan akan dihapus pada #7075.

Jika ditetapkan, kebijakan ini akan digunakan untuk melakukan pemilihan crosstool_config.Toolchain. Versi ini akan lebih diprioritaskan daripada opsi --cpu Bazel.

compiler_files

Label; required

Koleksi semua artefak cc_ toolchain yang diperlukan untuk tindakan kompilasi.
compiler_files_without_includes

Label; optional

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

Label; optional

Koleksi semua artefak cc_ toolchain yang diperlukan untuk tindakan cakupan. Jika tidak ditentukan, all_files akan digunakan.
cpu

String; optional; nonconfigurable

Tidak digunakan lagi. Sebagai gantinya, gunakan atribut toolchain_identifier. Ini akan menjadi noop setelah migrasi CROSSTOOL ke Starlark , dan akan dihapus oleh #7075.

Jika ditetapkan, kebijakan ini akan digunakan untuk melakukan pemilihan crosstool_config.Toolchain. Versi ini akan lebih diprioritaskan daripada opsi --cpu Bazel.

dwp_files

Label; required

Koleksi semua artefak cc_ toolchain yang diperlukan untuk tindakan dwp.
dynamic_runtime_lib

Label; optional

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

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

exec_transition_for_inputs

Boolean; optional; default is True

Tetapkan ke True untuk membuat semua input file ke cc_ toolchain untuk platform exec, bukan memiliki transisi (yaitu platform target secara default).
libc_top

Label; optional

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

Label; required

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

Label; optional

Artefak peta modul yang akan digunakan untuk build modular.
objcopy_files

Label; required

Koleksi semua artefak cc_ toolchain yang diperlukan untuk tindakan objcopy.
static_runtime_lib

Label; optional

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

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

strip_files

Label; required

Koleksi semua artefak cc_ toolchain yang diperlukan untuk tindakan penghapusan.
supports_header_parsing

Boolean; optional; default is False

Tetapkan ke True jika cc_ toolchain mendukung tindakan penguraian header.
supports_param_files

Boolean; optional; default is True

Tetapkan ke True jika cc_funnel mendukung penggunaan file parameter untuk tindakan penautan.
toolchain_config

Label; required

Label aturan yang menyediakan cc_toolchain_config_info.
toolchain_identifier

String; optional; nonconfigurable

ID yang digunakan untuk mencocokkan cc_chain ini dengan crosstool_config.ada yang sesuai.

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

rangkaian_suite_cc

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

Merepresentasikan kumpulan toolchain C++.

Aturan ini bertanggung jawab atas:

  • Mengumpulkan semua toolchain C++ yang relevan.
  • Memilih satu toolchain bergantung pada opsi --cpu dan --compiler yang diteruskan ke Bazel.

Lihat juga halaman ini untuk mengetahui konfigurasi toolchain C++ yang rumit dan dokumentasi pemilihan toolchain.

Argumen

Atribut
name

Name; required

Nama unik untuk target ini.

toolchains

Dictionary mapping strings to labels; required; nonconfigurable

Peta dari string "<cpu>" atau "<cpu>|<compiler>" ke label cc_toolchain. "<cpu>" akan digunakan saat hanya --cpu yang diteruskan ke Bazel, dan "<cpu>|<compiler>" akan digunakan saat --cpu dan --compiler diteruskan ke Bazel. Contoh:

          cc_toolchain_suite(
            name = "toolchain",
            toolchains = {
              "piii|gcc": ":my_cc_toolchain_for_piii_using_gcc",
              "piii": ":my_cc_toolchain_for_piii_using_default_compiler",
            },
          )