- Penggunaan
- Variabel standar
- Variabel genrule yang telah ditetapkan
- Variabel jalur sumber/output yang telah ditentukan
- Variabel kustom
Variabel "Buat" adalah class khusus variabel string yang dapat diperluas dan tersedia untuk atribut yang ditandai sebagai "Bergantung pada substitusi 'Membuat variabel'".
Keduanya dapat digunakan, misalnya, untuk memasukkan jalur toolchain tertentu ke dalam tindakan build yang dibuat pengguna.
Bazel menyediakan variabel telah ditetapkan, yang tersedia untuk semua target, dan variabel kustom, yang ditentukan dalam target dependensi dan hanya tersedia untuk target yang bergantung padanya.
Alasan istilah "Make" bersifat historis: sintaksis dan semantik variabel ini awalnya dimaksudkan untuk cocok dengan GNU Make.
Gunakan
Atribut yang ditandai sebagai "Tunduk pada substitusi 'Buat variabel'" dapat
mereferensikan variabel "Buat" FOO
sebagai berikut:
my_attr = "prefix $(FOO) suffix"
Dengan kata lain, setiap substring yang cocok dengan $(FOO)
akan diperluas
ke nilai FOO
. Jika nilainya adalah "bar"
, string akhir akan menjadi:
my_attr = "prefix bar suffix"
Jika FOO
tidak sesuai dengan variabel yang diketahui oleh target pengguna, Bazel akan gagal dengan error.
Variabel "Make" yang namanya bukan simbol huruf, seperti
@
, juga dapat direferensikan hanya menggunakan tanda dolar, tanpa
tanda kurung. Contoh:
my_attr = "prefix $@ suffix"
Untuk menulis $
sebagai literal string (yaitu untuk mencegah perluasan variabel), tulis $$
.
Variabel yang telah ditetapkan
Variabel "Pembuatan" yang telah ditentukan dapat direferensikan oleh atribut apa pun yang ditandai sebagai "Tunduk pada substitusi 'Buat variabel'" pada target mana pun.
Untuk melihat daftar variabel ini dan nilainya untuk serangkaian opsi build tertentu, jalankan
bazel info --show_make_env [build options]
dan lihat baris {i>output<i} teratas dengan huruf besar.
Lihat contoh variabel yang telah ditetapkan.
Variabel opsi Toolchain
COMPILATION_MODE
:fastbuild
,dbg
, atauopt
. (detail selengkapnya)
Variabel jalur
-
BINDIR
: Dasar dari hierarki biner yang dihasilkan untuk arsitektur target.Perhatikan, pohon yang berbeda dapat digunakan untuk program yang berjalan selama build di arsitektur host, untuk mendukung kompilasi silang.
Jika Anda ingin menjalankan alat dari dalam
genrule
, cara yang direkomendasikan untuk mendapatkan jalurnya adalah$(execpath toolname)
, dengan toolname harus dicantumkan dalam atributtools
genrule
. GENDIR
: Dasar hierarki kode yang dihasilkan untuk arsitektur target.
Variabel arsitektur mesin
-
TARGET_CPU
: CPU arsitektur target, misalnya,k8
.
Variabel genrule yang telah ditentukan
Berikut ini tersedia secara khusus untuk atribut
cmd
genrule
dan
secara umum penting untuk membuat atribut tersebut berfungsi.
Lihat contoh variabel genrule yang telah ditetapkan.
OUTS
: Daftarouts
darigenrule
. Jika hanya memiliki satu file output, Anda juga dapat menggunakan$@
.-
SRCS
: Daftarsrcs
darigenrule
(atau lebih tepatnya: nama jalur file yang terkait dengan label dalam daftarsrcs
). Jika hanya memiliki satu file sumber, Anda juga dapat menggunakan$<
. -
<
:SRCS
, jika berupa file tunggal. Jika tidak, error build akan terpicu. -
@
:OUTS
, jika berupa file tunggal. Selain itu, error build akan terpicu. -
RULEDIR
: Direktori output target, yaitu direktori yang sesuai dengan nama paket yang berisi target pada hierarkigenfiles
ataubin
. Untuk//my/pkg:my_genrule
, hal ini selalu berakhir dimy/pkg
, meskipun output//my/pkg:my_genrule
berada di subdirektori. -
@D
: Direktori output. Jika out memiliki satu entri, ini akan memperluas direktori yang berisi file tersebut. Jika memiliki beberapa entri, file ini akan memperluas direktori utama paket di hierarkigenfiles
, meskipun semua file output berada di subdirektori yang sama.Catatan: Gunakan
RULEDIR
di atas@D
karenaRULEDIR
memiliki semantik yang lebih sederhana dan berperilaku dengan cara yang sama berapa pun jumlah file output-nya.Jika genrule perlu menghasilkan file perantara sementara (mungkin karena penggunaan beberapa alat lain seperti compiler), genrule harus mencoba menulisnya ke
@D
(meskipun/tmp
juga akan dapat ditulis) dan menghapusnya sebelum selesai.Terutama hindari penulisan ke direktori yang berisi input. File tersebut mungkin ada di sistem file hanya-baca. Bahkan jika tidak, melakukan hal tersebut akan membuang hierarki sumber.
Variabel jalur sumber/output yang telah ditentukan
Variabel standar execpath
, execpaths
, rootpath
, rootpaths
, location
, dan locations
mengambil parameter label (misalnya $(execpath
//foo:bar)
) dan menggantikan jalur file yang ditunjukkan oleh label tersebut.
Untuk file sumber, jalur ini relatif ke root Workspace Anda. Untuk file yang merupakan output aturan, ini adalah jalur output file (lihat penjelasan file output di bawah).
Lihat contoh variabel jalur yang telah ditetapkan.
-
execpath
: Menunjukkan jalur di bawah execroot tempat Bazel menjalankan tindakan build.Pada contoh di atas, Bazel menjalankan semua tindakan build di direktori yang ditautkan oleh symlink
bazel-myproject
di root ruang kerja Anda. File sumberempty.source
ditautkan di jalurbazel-myproject/testapp/empty.source
. Jadi, jalur eksekusinya (yang merupakan subjalur di bawah root) adalahtestapp/empty.source
. Ini adalah tindakan build jalur yang dapat digunakan untuk menemukan file.File output di-stage dengan cara yang sama, tetapi juga diawali dengan subjalur
bazel-out/cpu-compilation_mode/bin
(atau untuk output alat:bazel-out/cpu-opt-exec-hash/bin
). Pada contoh di atas,//testapp:app
adalah sebuah alat karena muncul dalam atributtools
show_app_output
. Jadi, file outputapp
-nya ditulis kebazel-myproject/bazel-out/cpu-opt-exec-hash/bin/testapp/app
. Dengan demikian, jalur eksekusinya adalahbazel-out/cpu-opt-exec-hash/bin/testapp/app
. Awalan tambahan ini memungkinkan pembuatan target yang sama untuk, misalnya, dua CPU berbeda dalam build yang sama tanpa hasilnya saling mengganggu.Label yang diteruskan ke variabel ini harus mewakili satu file. Untuk label yang merepresentasikan file sumber, ini secara otomatis bernilai benar (true). Untuk label yang merepresentasikan aturan, aturan tersebut harus menghasilkan satu output. Jika nilai ini salah atau label salah format, build akan gagal dengan menampilkan error.
-
rootpath
: Menunjukkan jalur yang dapat digunakan biner yang di-build untuk menemukan dependensi pada runtime yang relatif terhadap subdirektori direktori runfile-nya yang sesuai dengan repositori utama. Catatan: Ini hanya berfungsi jika--enable_runfiles
diaktifkan, yang tidak terjadi di Windows secara default. Sebagai gantinya, gunakanrlocationpath
untuk dukungan lintas platform.Ini mirip dengan
execpath
, tetapi menghilangkan awalan konfigurasi yang dijelaskan di atas. Dalam contoh di atas, ini berartiempty.source
danapp
menggunakan jalur relatif ruang kerja murni:testapp/empty.source
dantestapp/app
.rootpath
file dalam repositori eksternalrepo
akan dimulai dengan../repo/
, diikuti dengan jalur relatif repositori.Class ini memiliki persyaratan "satu output saja" yang sama dengan
execpath
. -
rlocationpath
: Jalur yang dapat diteruskan oleh biner yang dibuat ke fungsiRlocation
dari library runfiles untuk menemukan dependensi pada runtime, baik di direktori runfiles (jika tersedia) atau menggunakan manifes runfile.Ini mirip dengan
rootpath
karena tidak berisi awalan konfigurasi, tetapi berbeda karena selalu diawali dengan nama repositori. Dalam contoh di atas, ini berarti bahwaempty.source
danapp
menghasilkan jalur berikut:myproject/testapp/empty.source
danmyproject/testapp/app
.rlocationpath
file dalam repositori eksternalrepo
akan dimulai denganrepo/
, diikuti dengan jalur relatif repositori.Meneruskan jalur ini ke biner dan menyelesaikannya ke jalur sistem file menggunakan library runfiles adalah pendekatan yang lebih disukai untuk menemukan dependensi saat runtime. Dibandingkan dengan
rootpath
, API ini memiliki keuntungan karena dapat berfungsi di semua platform dan meskipun direktori runfiles tidak tersedia.Class ini memiliki persyaratan "satu output saja" yang sama dengan
execpath
. -
location
: Sinonim untukexecpath
ataurootpath
, bergantung pada atribut yang diperluas. Ini adalah perilaku pra-Starlark lama dan tidak direkomendasikan, kecuali jika Anda benar-benar mengetahui fungsinya untuk aturan tertentu. Lihat #2475 untuk mengetahui detailnya.
execpaths
, rootpaths
, rlocationpaths
, dan locations
masing-masing adalah variasi jamak dari execpath
, rootpath
, rlocationpaths
, danlocation
. Fungsi ini mendukung label yang menghasilkan beberapa output, yang dalam hal ini
setiap output dicantumkan dipisahkan oleh spasi. Aturan nol output dan label yang salah format menghasilkan error build.
Semua label yang direferensikan harus muncul di srcs
,
file output, atau deps
target yang menggunakan. Jika tidak, build akan gagal. Target C++ juga dapat mereferensikan label di data
.
Label tidak harus dalam bentuk kanonis: foo
, :foo
,
dan //somepkg:foo
tidak masalah.
Variabel kustom
Variabel "Make" kustom dapat direferensikan oleh atribut apa pun yang ditandai sebagai "Tunduk pada substitusi 'Membuat variabel'", tetapi hanya pada target yang bergantung pada target lain yang menentukan variabel tersebut.
Sebagai praktik terbaik, semua variabel harus dibuat khusus kecuali ada alasan yang cukup kuat untuk memasukkannya ke dalam Bazel inti. Dengan cara ini, Bazel tidak perlu lagi memuat dependensi yang berpotensi mahal untuk menyediakan variabel yang menggunakan taret yang mungkin tidak penting baginya.
Variabel toolchain C++
Berikut ini ditetapkan dalam aturan toolchain C++ dan tersedia untuk setiap aturan yang menetapkan toolchains =
["@bazel_tools//tools/cpp:current_cc_toolchain"]
(atau "@bazel_tools//tools/cpp:current_cc_host_toolchain"
untuk toolchain host yang setara). Beberapa aturan, seperti java_binary
, secara implisit menyertakan toolchain C++ dalam definisi aturannya. Model mewarisi variabel ini secara otomatis.
Aturan C++ bawaan jauh lebih canggih daripada "jalankan compiler di atasnya". Untuk mendukung mode kompilasi beragam, seperti *SAN, ThinLTO, dengan/tanpa modul, dan biner yang dioptimalkan dengan hati-hati di saat yang sama dengan pengujian yang berjalan cepat di beberapa platform, aturan bawaan berusaha keras untuk memastikan input, output, dan flag command line yang benar ditetapkan pada setiap tindakan yang berpotensi dihasilkan secara internal.
Variabel ini adalah mekanisme penggantian yang akan digunakan oleh pakar bahasa, dalam kasus yang jarang terjadi. Jika Anda tergoda untuk menggunakannya, hubungi developer Bazel terlebih dahulu.
ABI
: Versi C++ ABI.-
AR
: Perintah "ar" dari crosstool. -
C_COMPILER
: ID compiler C/C++, misalnya,llvm
. -
CC
: Perintah compiler C dan C++.Kami sangat menyarankan untuk selalu menggunakan
CC_FLAGS
bersama denganCC
. Anda tidak dapat melakukannya dengan risiko Anda sendiri. CC_FLAGS
: Kumpulan tanda minimal untuk compiler C/C++ agar dapat digunakan oleh genrules. Secara khusus, terdapat flag untuk memilih arsitektur yang tepat jikaCC
mendukung beberapa arsitektur.-
NM
: Perintah "nm" dari crosstool. -
OBJCOPY
: Perintah objcopy dari suite yang sama dengan compiler C/C++. -
STRIP
: Perintah strip dari suite yang sama dengan compiler C/C++.
Variabel toolchain Java
Berikut ini ditetapkan dalam aturan toolchain Java dan tersedia untuk setiap aturan yang menetapkan toolchains =
["@bazel_tools//tools/jdk:current_java_runtime"]
(atau "@bazel_tools//tools/jdk:current_host_java_runtime"
untuk toolchain host yang setara).
Sebagian besar alat di JDK tidak boleh digunakan secara langsung. Aturan Java bawaan menggunakan pendekatan yang jauh lebih canggih untuk kompilasi dan pengemasan Java daripada yang dapat diungkapkan oleh alat upstream, seperti Jar antarmuka, Jar antarmuka header, serta penggabungan implementasi dan pemaketan Jar yang sangat dioptimalkan.
Variabel ini adalah mekanisme penggantian yang akan digunakan oleh pakar bahasa, dalam kasus yang jarang terjadi. Jika Anda tergoda untuk menggunakannya, hubungi developer Bazel terlebih dahulu.
-
JAVA
: Perintah "java" (mesin virtual Java). Hindari hal ini, dan gunakan aturanjava_binary
jika memungkinkan. Mungkin berupa jalur relatif. Jika Anda harus mengubah direktori sebelum memanggiljava
, Anda harus merekam direktori kerja sebelum mengubahnya. JAVABASE
: Direktori dasar yang berisi utilitas Java. Mungkin berupa jalur relatif. Folder tersebut akan memiliki subdirektori "bin".
Variabel yang ditentukan Starlark
Penulis aturan dan toolchain dapat menentukan variabel kustom sepenuhnya dengan menampilkan penyedia TemplateVariableInfo. Setiap aturan yang bergantung pada atribut ini melalui atribut toolchains
dapat membaca nilainya: