Definisi umum

Bagian ini mendefinisikan berbagai istilah dan konsep yang umum untuk banyak fungsi atau aturan build.

Daftar Isi

Tokenisasi shell Bourne

Atribut string tertentu dari beberapa aturan dibagi menjadi beberapa kata sesuai dengan aturan tokenisasi {i>shell Bourne<i}: spasi tanpa tanda kutip membatasi kata terpisah, dan tanda petik tunggal karakter tanda kutip ganda dan garis miring terbalik digunakan untuk mencegah tokenisasi.

Atribut yang tunduk pada tokenisasi ini secara eksplisit dinyatakan seperti itu dalam definisinya dalam dokumen ini.

Atribut yang tunduk pada "Merek" ekspansi variabel dan {i>shell Bourne<i} tokenisasi biasanya digunakan untuk meneruskan opsi arbitrer ke compiler dan alat lainnya. Contoh dari atribut tersebut adalah cc_library.copts dan java_library.javacopts. Bersama-sama, substitusi ini memungkinkan variabel string tunggal untuk diperluas ke daftar khusus konfigurasi kata opsi.

Perluasan label

Beberapa atribut string dari sangat sedikit aturan tunduk pada label perluasan: jika {i>string<i} tersebut berisi label yang valid sebagai substring, seperti //mypkg:target, dan label tersebut adalah yang dinyatakan sebagai prasyarat dari aturan saat ini, hal itu diperluas ke dalam nama jalur dari file yang direpresentasikan oleh target //mypkg:target.

Atribut contoh mencakup genrule.cmd dan cc_binary.linkopts. Detailnya bisa sangat bervariasi dalam setiap kasus, terhadap masalah seperti: apakah label relatif diperluas; bagaimana label yang diperluas ke beberapa file diperlakukan, dll. Baca dokumentasi atribut aturan untuk secara spesifik.

Atribut umum yang ditentukan oleh sebagian besar aturan build

Bagian ini menjelaskan atribut yang ditentukan oleh banyak aturan build, tetapi tidak semua.

Atribut Deskripsi
data

List of labels ; optional

File yang diperlukan oleh aturan ini saat runtime. Dapat mencantumkan target file atau aturan. Umumnya memungkinkan semua target.

Output dan runfile default target dalam atribut data harus muncul di area *.runfiles dari file apa pun yang dapat dieksekusi yang yang dihasilkan oleh atau memiliki dependensi runtime pada target ini. Hal ini dapat mencakup data atau biner yang digunakan saat srcs dieksekusi. Lihat dependensi data untuk informasi lebih lanjut tentang cara bergantung pada dan menggunakan file data.

Aturan baru harus menentukan atribut data jika diproses yang mungkin menggunakan input lain pada runtime. Aturan fungsi implementasi juga harus mengisi runfiles dari output dan runfile atribut data apa pun, serta {i>runfile<i} dari atribut dependensi apa pun yang menyediakan kode sumber atau dependensi runtime.

deps

List of labels ; optional

Dependensi untuk target ini. Umumnya hanya boleh mencantumkan target aturan. (Meskipun beberapa aturan mengizinkan file dicantumkan langsung di deps, sebaiknya dihindari sebisa mungkin.)

Aturan khusus bahasa umumnya membatasi target yang tercantum pada target dengan penyedia tertentu.

Semantik yang tepat tentang maksud target untuk bergantung pada yang lain menggunakan deps bersifat spesifik untuk jenis aturan dan spesifik per aturan dokumentasi tersebut menjelaskan lebih detail. Untuk aturan yang memproses kode sumber, deps umumnya menentukan dependensi kode yang digunakan oleh kode di srcs.

Paling sering, dependensi deps digunakan untuk mengizinkan penggunaan satu modul simbol yang didefinisikan dalam modul lain yang ditulis dalam bahasa pemrograman yang sama dan dikompilasi secara terpisah. Dependensi lintas bahasa juga diizinkan di banyak kasus: Misalnya, target java_library mungkin bergantung pada kode C++ dalam target cc_library, dengan mencantumkan yang terakhir di Atribut deps. Lihat definisi dependensi untuk informasi selengkapnya.

licenses

List of strings; optional; nonconfigurable

Daftar string jenis lisensi yang akan digunakan untuk target khusus ini. Ini adalah bagian dari API pemberian lisensi yang sudah tidak digunakan lagi dan tidak lagi digunakan Bazel. Larangan gunakan ini.

srcs

List of labels ; optional

File yang diproses atau disertakan oleh aturan ini. Biasanya mencantumkan file secara langsung, tetapi dapat mencantumkan target aturan (seperti filegroup atau genrule) untuk menyertakan output defaultnya.

Aturan spesifik bahasa sering kali mengharuskan file yang tercantum memiliki ekstensi file.

Atribut yang umum untuk semua aturan build

Bagian ini menjelaskan atribut yang secara implisit ditambahkan ke semua build aturan.

Atribut Deskripsi
compatible_with

List of labels ; optional; nonconfigurable

Daftar lingkungan yang dapat dibuat target ini, selain yang didukung secara default.

Ini adalah bagian dari sistem pembatas Bazel, yang memungkinkan pengguna mendeklarasikan target dapat dan tidak dapat saling bergantung. Misalnya, yang dapat di-deploy secara eksternal biner tidak boleh bergantung pada {i>library <i}dengan kode rahasia perusahaan. Lihat ConstraintSemantics untuk mengetahui detailnya.

deprecation

String; optional; nonconfigurable

Pesan peringatan penjelasan yang terkait dengan target ini. Biasanya, ini digunakan untuk memberi tahu pengguna bahwa target sudah tidak berlaku, atau telah digantikan oleh aturan lain, bersifat pribadi untuk suatu paket, atau mungkin dianggap berbahaya karena alasan tertentu. Ada baiknya untuk menyertakan beberapa referensi (seperti laman web, nomor {i>bug<i} atau contoh CL migrasi) jadi orang dapat dengan mudah mengetahui perubahan apa yang diperlukan untuk menghindari pesan tersebut. Jika ada target baru yang dapat digunakan sebagai penurunan penggantian, itu adalah ide yang bagus untuk memigrasikan semua pengguna dari target lama.

Atribut ini tidak berpengaruh pada cara objek dibuat, tetapi dapat memengaruhi output diagnostik alat build. Alat build mengeluarkan peringatan saat aturan dengan atribut deprecation bergantung pada target dalam paket lain.

Dependensi intra-paket dikecualikan dari peringatan ini, sehingga, misalnya, membangun pengujian aturan yang sudah tidak digunakan lagi mendapatkan peringatan.

Jika target yang tidak digunakan lagi bergantung pada target lain yang tidak digunakan lagi, tidak ada peringatan pesan diterbitkan.

Setelah pengguna berhenti menggunakannya, target dapat dihapus.

distribs

List of strings; optional; nonconfigurable

Daftar string metode distribusi yang akan digunakan untuk target khusus ini. Ini adalah bagian dari API pemberian lisensi yang sudah tidak digunakan lagi dan tidak lagi digunakan Bazel. Larangan gunakan ini.

exec_compatible_with

List of labels ; optional; nonconfigurable

Daftar constraint_values yang harus ada di platform eksekusi untuk target ini. Hal ini dalam selain batasan yang telah ditetapkan oleh jenis aturan. Batasan digunakan untuk membatasi daftar platform eksekusi yang tersedia. Untuk detail selengkapnya, lihat deskripsi dari resolusi toolchain.

exec_properties

Dictionary of strings; optional

Kamus string yang akan ditambahkan ke exec_properties platform yang dipilih untuk target ini. Lihat exec_properties dari aturan platform.

Jika kunci ada di properti level target dan platform, nilai akan diambil dari target.

features

List of feature strings; optional

Fitur adalah tag string yang dapat diaktifkan atau dinonaktifkan pada target. Tujuan arti fitur tergantung pada aturan itu sendiri.

Atribut features ini dikombinasikan dengan paket level features. Misalnya, jika fitur ["a", "b"] diaktifkan di level paket, dan Atribut features berisi ["-a", "c"], fitur yang diaktifkan untuk aturannya adalah "b" dan "c". Lihat contoh.

restricted_to

List of labels ; optional; nonconfigurable

Daftar lingkungan yang dapat di-build untuk target ini, bukan yang didukung secara default.

Ini adalah bagian dari sistem pembatas Bazel. Lihat compatible_with untuk mengetahui detailnya.

tags

List of strings; optional; nonconfigurable

Tag dapat digunakan di aturan apa pun. Tag pada pengujian dan Aturan test_suite berguna untuk mengategorikan pengujian. Tag pada target non-pengujian digunakan untuk mengontrol eksekusi dalam sandbox genrule dan Starlark tindakan, dan untuk penguraian oleh manusia dan/atau alat eksternal.

Bazel memodifikasi perilaku kode {i>sandbox<i}-nya jika menemukan hal berikut kata kunci dalam atribut tags dari pengujian apa pun atau genrule target, atau kunci execution_requirements untuk Starlark mana pun tindakan.

  • Kata kunci no-sandbox menghasilkan tindakan atau pengujian, tidak pernah di-sandbox; aplikasi masih dapat di-cache atau dijalankan dari jarak jauh - gunakan no-cache atau no-remote untuk mencegah salah satu atau keduanya.
  • Kata kunci no-cache menghasilkan tindakan atau pengujian, tidak pernah di-cache (dari jarak jauh atau lokal)
  • Kata kunci no-remote-cache menghasilkan tindakan atau pengujian, tidak pernah di-cache dari jarak jauh (tetapi dapat di-cache secara lokal; juga dapat dijalankan dari jarak jauh). Catatan: untuk tujuan tag ini, cache disk dianggap sebagai cache lokal, sedangkan cache http dan gRPC dianggap jarak jauh. Jika cache gabungan ditentukan (yaitu cache dengan komponen lokal dan jarak jauh), Metode ini diperlakukan sebagai cache jarak jauh dan dinonaktifkan sepenuhnya, kecuali jika --incompatible_remote_results_ignore_disk diatur dalam hal ini komponen lokal akan digunakan.
  • Kata kunci no-remote-exec menghasilkan tindakan atau pengujian, tidak pernah dijalankan dari jarak jauh (tetapi dapat {i>cache<i} dari jarak jauh).
  • Kata kunci no-remote mencegah tindakan atau pengujian dijalankan dari jarak jauh atau yang di-cache dari jarak jauh. Ini sama seperti menggunakan no-remote-cache dan no-remote-exec.
  • Kata kunci no-remote-cache-upload menonaktifkan bagian upload dari cache jarak jauh untuk spawn. proses ini tidak menonaktifkan eksekusi jarak jauh.
  • Kata kunci local mencegah tindakan atau pengujian di-cache dari jarak jauh, dijalankan dari jarak jauh, atau dijalankan di dalam {i>sandbox<i}. Untuk genrules dan pengujian, menandai aturan dengan local = True memiliki efek yang sama.
  • Kata kunci requires-network memungkinkan akses ke jaringan dari dalam sandbox. Tag ini hanya berpengaruh jika sandbox diaktifkan.
  • block-network kata kunci memblokir akses ke aplikasi eksternal jaringan dari dalam sandbox. Dalam hal ini, hanya komunikasi dengan {i>localhost<i} diizinkan. Tag ini hanya berpengaruh jika sandboxing mengaktifkan pembuatan versi.
  • requires-fakeroot menjalankan pengujian atau tindakan sebagai uid dan gid 0 (yaitu, root tertentu). Ini hanya didukung di Linux. Tag ini lebih diprioritaskan daripada Opsi command line --sandbox_fake_username.

Tag pada pengujian umumnya digunakan untuk menganotasi peran pengujian di proses debug dan perilisan. Biasanya, tag paling berguna untuk C++ dan Python yang tidak memiliki kemampuan anotasi runtime. Penggunaan {i>tag<i} dan ukuran memberikan fleksibilitas dalam menyusun rangkaian pengujian berdasarkan codebase {i>check-in<i}.

Bazel memodifikasi perilaku uji coba jika menemukan kata kunci berikut pada Atribut tags dari aturan pengujian:

  • exclusive akan memaksa pengujian untuk dijalankan di "eksklusif" mode, memastikan bahwa tidak ada pengujian lain yang berjalan pada perangkat lain di waktu yang sama. Pengujian tersebut akan dijalankan secara serial setelah semua build aktivitas dan pengujian non-eksklusif telah selesai. Eksekusi jarak jauh adalah dinonaktifkan untuk pengujian seperti itu karena Bazel tidak memiliki kendali atas apa yang yang berjalan pada komputer jarak jauh.
  • exclusive-if-local akan memaksa pengujian untuk dijalankan di "eksklusif" jika dijalankan secara lokal, tetapi akan menjalankan pengujian secara paralel jika yang dijalankan dari jarak jauh.
  • manual kata kunci akan mengecualikan target dari perluasan karakter pengganti pola target (..., :*, :all, dll.) dan test_suite aturan yang tidak mencantumkan pengujian secara eksplisit saat menghitung kumpulan target tingkat atas untuk di-build/menjalankan untuk perintah build, test, dan coverage. Tidak memengaruhi karakter pengganti target atau ekspansi rangkaian pengujian dalam konteks lain, termasuk Perintah query. Perhatikan bahwa manual tidak menyiratkan bahwa target harus tidak dibangun/dijalankan secara otomatis oleh sistem build/pengujian berkelanjutan. Misalnya, mungkin ingin mengecualikan target dari bazel test ... karena memerlukan Tanda Bazel, tetapi tetap disertakan dalam pra-pengiriman atau pengujian berkelanjutan yang dikonfigurasi dengan benar yang dijalankan.
  • Kata kunci external akan memaksa pengujian tanpa syarat dieksekusi (terlepas dari --cache_test_results nilai).
Lihat Konvensi Tag di Test Encyclopedia untuk mengetahui konvensi lainnya tentang tag yang dilampirkan pada target pengujian.
target_compatible_with

List of labels ; optional

Daftar constraint_value dtk yang harus ada di platform target agar target ini dapat dipertimbangkan kompatibel. Hal ini merupakan tambahan untuk batasan yang telah ditetapkan oleh jenis aturan. Jika platform target tidak memenuhi semua batasan yang tercantum, maka target dianggap tidak kompatibel. Target yang tidak kompatibel adalah dilewati untuk pembuatan dan pengujian saat pola target diperluas (misalnya, //..., :all). Bila ditetapkan secara eksplisit pada baris perintah, target yang tidak kompatibel akan menyebabkan Bazel mencetak {i>error<i} dan menyebabkan kegagalan build atau pengujian.

Target yang secara transitif bergantung pada target yang tidak kompatibel adalah target itu sendiri dianggap tidak kompatibel. Pengujian ini juga dilewati untuk proses build dan pengujian.

Daftar kosong (yang merupakan default) menandakan bahwa target kompatibel dengan semua platform.

Semua aturan selain Aturan Workspace mendukung fitur ini . Untuk beberapa aturan, atribut ini tidak memiliki pengaruh. Misalnya, menentukan target_compatible_with untuk cc_toolchain tidak berguna.

Lihat Platform untuk informasi selengkapnya tentang pengabaian target yang tidak kompatibel.

testonly

Boolean; optional; default False except for test and test suite targets; nonconfigurable

Jika Benar, hanya target hanya pengujian (seperti pengujian) yang dapat bergantung pada target ini.

Setara dengan itu, aturan yang bukan testonly tidak diizinkan untuk bergantung pada aturan apa pun yaitu testonly.

Pengujian (*_test aturan) dan suite pengujian (aturan test_suite) testonly secara default.

Atribut ini dimaksudkan untuk menunjukkan bahwa target tidak boleh yang terkandung dalam biner yang dirilis ke produksi.

Karena testonly diterapkan pada waktu build, bukan runtime, dan menyebar secara viral melalui pohon dependensi, maka harus diterapkan secara bijaksana. Sebagai contoh, stub dan palsu berguna untuk pengujian unit juga mungkin berguna untuk pengujian integrasi yang melibatkan biner yang sama yang akan dirilis ke produksi, dan oleh karena itu mungkin tidak ditandai sebagai {i>testonly<i}. Sebaliknya, aturan yang berbahaya untuk ditautkan, mungkin karena mereka tanpa syarat mengabaikan perilaku normal, maka harus ditandai sebagai {i>testonly<i}.

toolchains

List of labels ; optional; nonconfigurable

Kumpulan target yang Jadikan variabel sebagai target ini yang diizinkan untuk diakses. Target ini merupakan contoh dari aturan yang menyediakan TemplateVariableInfo atau target khusus untuk jenis toolchain yang terintegrasi dalam Bazel. Ini termasuk:

  • @bazel_tools//tools/cpp:current_cc_toolchain
  • @bazel_tools//tools/jdk:current_java_runtime

Perhatikan bahwa ini berbeda dengan konsep resolusi toolchain yang digunakan oleh implementasi aturan untuk konfigurasi yang bergantung pada platform. Anda tidak dapat menggunakan ini untuk menentukan cc_toolchain atau java_toolchain spesifik mana gunakan.

visibility

List of labels ; optional; default default_visibility from package if specified, or //visibility:private otherwise; nonconfigurable

Atribut visibility pada target mengontrol apakah target tersebut dapat digunakan di paket lain. Lihat dokumentasi untuk visibilitas.

Atribut yang umum untuk semua aturan pengujian (*_test)

Bagian ini menjelaskan atribut yang bersifat umum untuk semua aturan pengujian.

Atribut Deskripsi
args

List of strings; optional; subject to $(location) and "Make variable" substitution, and Bourne shell tokenization

Argumen command line yang diteruskan Bazel ke target saat dieksekusi dengan bazel test.

Argumen ini diteruskan sebelum nilai --test_arg yang ditentukan pada command line bazel test.

env

Dictionary of strings; optional; values are subject to $(location) and "Make variable" substitution

Menentukan variabel lingkungan tambahan yang akan ditetapkan kapan pengujian dijalankan bazel test.

Atribut ini hanya berlaku untuk aturan native, seperti cc_test, py_test, dan sh_test. Kebijakan ini tidak berlaku untuk Aturan pengujian yang ditentukan Starlark. Untuk aturan Starlark sendiri, Anda dapat menambahkan "env" dan menggunakannya untuk mengisi TestEnvironment Penyedia.

env_inherit

List of strings; optional

Menentukan variabel lingkungan tambahan yang akan diwarisi dari lingkungan eksternal saat pengujian dijalankan oleh bazel test.

Atribut ini hanya berlaku untuk aturan native, seperti cc_test, py_test, dan sh_test. Ini tidak berlaku untuk aturan pengujian yang ditentukan Starlark.

size

String "enormous", "large" "medium" or "small", default is "medium"; optional; nonconfigurable

Menentukan "ketebalan" target pengujian: berapa banyak waktu/resource yang perlu dijalankan.

Pengujian unit dianggap "kecil", pengujian integrasi "sedang", dan pengujian menyeluruh "besar" atau "sangat besar". Bazel menggunakan ukuran untuk menentukan waktu tunggu {i>default<i}, yang dapat diganti menggunakan Atribut timeout. Waktu tunggu adalah untuk semua pengujian di target BUILD, bukan untuk setiap pengujian pengujian individual. Saat pengujian dijalankan secara lokal, size juga digunakan untuk tujuan penjadwalan: Bazel mencoba mematuhi --local_{ram,cpu}_resources dan tidak membebani komputer lokal dengan menjalankan banyak tes berat secara bersamaan.

Ukuran uji sesuai dengan waktu tunggu default berikut dan asumsi resource lokal puncak penggunaan:

Ukuran RAM (dalam MB) CPU (dalam inti CPU) Waktu tunggu default
small 20 1 singkat (1 menit)
sedang 100 1 sedang (5 menit)
large 300 1 lama (15 menit)
sangat besar 800 1 abadi (60 menit)

Variabel lingkungan TEST_SIZE akan ditetapkan ke atribut ini saat menghasilkan pengujian.

timeout

String "short", "moderate", "long", "eternal" (with the default derived from the test's size attribute); nonconfigurable

Perkiraan lama pengujian diperkirakan akan berjalan sebelum ditampilkan kembali.

Atribut ukuran pengujian mengontrol estimasi resource, sedangkan waktu tunggu dapat disetel secara terpisah. Jika tidak ditentukan secara eksplisit, waktu tunggu didasarkan pada ukuran pengujian. Tes waktu tunggu dapat diganti dengan tanda --test_timeout, misalnya untuk yang berjalan dalam kondisi tertentu yang diketahui sebagai lambat. Menguji nilai waktu tunggu sesuai dengan periode waktu berikut:

Nilai Waktu Tunggu Jangka Waktu
short 1 menit
sedang 5 menit
long 15 menit
abadi 60 menit

Untuk waktu selain yang disebutkan di atas, waktu tunggu pengujian dapat diganti dengan Bendera bazel --test_timeout, mis. untuk menjalankan secara manual di kondisi yang diketahui lambat. Nilai --test_timeout dalam hitungan detik. Misalnya, --test_timeout=120 akan menetapkan pengujian waktu tunggu hingga dua menit.

Variabel lingkungan TEST_TIMEOUT akan ditetapkan ke waktu tunggu pengujian (dalam detik) saat menghasilkan pengujian.

flaky

Boolean; optional; default False; nonconfigurable

Menandai pengujian sebagai tidak stabil.

Jika disetel, pengujian akan dijalankan hingga tiga kali, dan menandainya sebagai gagal hanya jika gagal setiap kali. Secara default, atribut ini disetel ke Salah (False) dan pengujian ditetapkan hanya dijalankan sekali. Perhatikan bahwa penggunaan atribut ini umumnya tidak disarankan - pengujian harus berhasil secara andal jika pernyataannya ditegakkan.

shard_count

Non-negative integer less than or equal to 50; optional

Menentukan jumlah shard paralel yang akan digunakan untuk menjalankan pengujian.

Nilai ini akan menggantikan heuristik apa pun yang digunakan untuk menentukan jumlah shard paralel yang akan digunakan untuk menjalankan pengujian. Perhatikan bahwa untuk beberapa pengujian, aturan, parameter ini mungkin diperlukan untuk mengaktifkan sharding sejak awal. Lihat juga: --test_sharding_strategy.

Jika sharding pengujian diaktifkan, variabel lingkungan TEST_TOTAL_SHARDS akan ditetapkan ke nilai ini saat menghasilkan pengujian.

Sharding memerlukan runner pengujian untuk mendukung protokol sharding pengujian. Jika tidak, kemungkinan besar ia akan menjalankan setiap pengujian di setiap shard, yang tidak sesuai dengan keinginan Anda.

Lihat Menguji Sharding di Test Encyclopedia untuk mengetahui detail tentang sharding.

local

Boolean; default False; nonconfigurable

Memaksa pengujian untuk dijalankan secara lokal, tanpa sandbox.

Menetapkan ini ke True sama dengan memberikan "local" sebagai tag (tags=["local"]).

Atribut yang umum untuk semua aturan biner (*_binary)

Bagian ini menjelaskan atribut yang bersifat umum untuk semua aturan biner.

Atribut Deskripsi
args

List of strings; optional; subject to $(location) and "Make variable" substitution, and Bourne shell tokenization; nonconfigurable

Argumen command line yang akan diteruskan Bazel ke target saat dieksekusi baik dengan perintah run atau sebagai pengujian. Argumen tersebut adalah diteruskan sebelum nilai yang ditentukan pada bazel run atau command line bazel test.

CATATAN: Argumen tidak diteruskan saat Anda menjalankan target di luar Bazel (misalnya, dengan menjalankan biner secara manual di bazel-bin/).

env

Dictionary of strings; optional; values are subject to $(location) and "Make variable" substitution

Menentukan variabel lingkungan tambahan yang akan ditetapkan saat target dijalankan oleh bazel run.

Atribut ini hanya berlaku untuk aturan native, seperti cc_binary, py_binary, dan sh_binary. Ini tidak berlaku untuk aturan yang dapat dieksekusi yang ditentukan Starlark.

CATATAN: Variabel lingkungan tidak ditetapkan saat Anda menjalankan target di luar Bazel (misalnya, dengan menjalankan biner secara manual di bazel-bin/).

output_licenses

List of strings; optional

Lisensi file output yang dihasilkan oleh biner ini. Ini adalah bagian dari API pemberian lisensi yang sudah tidak digunakan lagi dan tidak lagi digunakan Bazel. Larangan gunakan ini.

Atribut yang dapat dikonfigurasi

Sebagian besar atribut dapat "dikonfigurasi", artinya nilainya dapat berubah saat target dibangun dengan cara yang berbeda. Secara khusus, atribut yang dapat dikonfigurasi dapat bervariasi berdasarkan penanda yang diteruskan ke baris perintah Bazel, atau apa dependensi downstream meminta target. Ini dapat digunakan, untuk instance, untuk menyesuaikan target untuk beberapa platform atau mode kompilasi.

Contoh berikut mendeklarasikan berbagai sumber untuk berbagai target terkait arsitektur. Menjalankan bazel build :multiplatform_lib --cpu x86 akan membuat target menggunakan x86_impl.cc, sekaligus mengganti Sebagai gantinya, --cpu arm akan membuatnya menggunakan arm_impl.cc.

cc_library(
    name = "multiplatform_lib",
    srcs = select({
        ":x86_mode": ["x86_impl.cc"],
        ":arm_mode": ["arm_impl.cc"]
    })
)
config_setting(
    name = "x86_mode",
    values = { "cpu": "x86" }
)
config_setting(
    name = "arm_mode",
    values = { "cpu": "arm" }
)

Fungsi select() memilih di antara berbagai nilai alternatif untuk atribut yang dapat dikonfigurasi di mana config_setting atau constraint_value yang dipenuhi oleh konfigurasi target.

Bazel mengevaluasi atribut yang dapat dikonfigurasi setelah memproses makro dan sebelum aturan pemrosesan (secara teknis, di antara pemuatan dan analisis). Setiap pemrosesan sebelum evaluasi select() tidak mengetahui yang dipilih oleh select(). Makro, misalnya, tidak dapat berubah perilakunya berdasarkan cabang yang dipilih, dan bazel query dapat hanya membuat perkiraan konservatif tentang dependensi yang dapat dikonfigurasi milik target. Lihat FAQ ini untuk informasi selengkapnya tentang penggunaan select() dengan aturan dan makro.

Atribut yang ditandai nonconfigurable dalam dokumentasinya tidak dapat menggunakan fitur ini. Biasanya atribut tidak dapat dikonfigurasi karena Bazel secara internal perlu mengetahui nilainya sebelum dapat menentukan cara menyelesaikan select().

Lihat Atribut Build yang Dapat Dikonfigurasi untuk mengetahui ringkasan mendetail.

Target output implisit

Output implisit dalam C++ tidak digunakan lagi. Harap jangan menggunakannya dalam bahasa lain jika memungkinkan. Kami belum memiliki jalur penghentian penggunaan tetapi pada akhirnya fitur tersebut juga tidak akan digunakan lagi.

Saat mendefinisikan aturan build dalam file BUILD, Anda secara eksplisit mendeklarasikan target aturan baru yang bernama dalam sebuah paket. Banyak aturan build fungsi juga secara implisit memerlukan satu atau beberapa file output target, yang konten dan maknanya spesifik per aturan. Misalnya, ketika Anda secara eksplisit mendeklarasikan sebuah java_binary(name='foo', ...), Anda juga secara implisit mendeklarasikan file output menargetkan foo_deploy.jar sebagai anggota paket yang sama. (Target khusus ini adalah arsip Java mandiri yang cocok untuk deployment.)

Target output implisit adalah anggota kelas satu dari target grafik. Sama seperti target lainnya, target dibuat sesuai permintaan, baik ketika ditentukan dalam perintah {i>build<i} tingkat atas, atau ketika adalah prasyarat yang diperlukan untuk target build lainnya. Dapat berupa yang direferensikan sebagai dependensi dalam file BUILD, output alat analisis seperti bazel query.

Untuk setiap jenis aturan build, dokumentasi aturan berisi sebuah elemen bagian khusus yang merinci nama dan isi dari output yang dicakup oleh deklarasi aturan semacam itu.

Perbedaan yang penting namun agak mirip antara dua namespace yang digunakan oleh sistem build: label mengidentifikasi target, yang dapat berupa aturan atau file, dan target file dapat dibagi menjadi target file sumber (atau input) dan file turunan (atau output) target. Berikut adalah hal-hal yang dapat Anda sebutkan di file BUILD, membangun dari command line, atau memeriksa menggunakan bazel query; ini adalah namespace target. Setiap target file sesuai ke satu file sebenarnya di disk ("namespace sistem file"); setiap aturan target mungkin sesuai dengan nol, satu atau beberapa file aktual pada {i>disk<i}. Mungkin ada file di disk yang tidak memiliki target yang sesuai; untuk contoh, file objek .o yang dihasilkan selama kompilasi C++ tidak dapat dirujuk dari dalam file BUILD atau dari baris perintah. Dengan cara ini, alat pembangunan dapat menyembunyikan detail implementasi tertentu dari bagaimana ia melakukan tugasnya. Hal ini dijelaskan lebih lengkap dalam Referensi Konsep BUILD.