- Penggunaan
- Variabel standar
- Variabel genrule yang telah ditetapkan
- Variabel jalur sumber/output yang telah ditentukan sebelumnya
- Variabel kustom
Variabel "Make" adalah kelas khusus dari variabel string yang dapat diperluas yang tersedia untuk atribut yang ditandai sebagai "Subject to 'Make variabel' substitution".
Fungsi ini dapat digunakan, misalnya, untuk memasukkan jalur toolchain tertentu ke dalam tindakan build yang dibuat pengguna.
Bazel menyediakan variabel bawaan, yang tersedia untuk semua target, dan variabel kustom, yang ditentukan dalam target dependensi dan hanya tersedia untuk target yang bergantung padanya.
Alasan penggunaan istilah "Make" bersifat historis: sintaksis dan semantik variabel ini awalnya dimaksudkan agar cocok dengan GNU Make.
Gunakan
Atribut yang ditandai sebagai "Subject to 'Make variabel' substitution" 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 nilai tersebut adalah "bar"
, string akhir menjadi:
my_attr = "prefix bar suffix"
Jika FOO
tidak sesuai dengan variabel yang diketahui oleh target yang memakai, Bazel akan gagal dengan error.
Variabel "Buat" yang namanya merupakan simbol non-huruf, seperti
@
, juga dapat direferensikan hanya menggunakan tanda dolar, tanpa
tanda kurung. Contoh:
my_attr = "prefix $@ suffix"
Untuk menulis $
sebagai literal string (misalnya untuk mencegah perluasan variabel), tulis $$
.
Variabel yang telah ditetapkan
Variabel "Buat" yang telah ditentukan sebelumnya dapat dirujuk oleh atribut apa pun yang ditandai sebagai "Subject to 'Make variabel' substitution" pada target apa pun.
Untuk melihat daftar variabel ini dan nilainya untuk sekumpulan opsi build tertentu, jalankan
bazel info --show_make_env [build options]
dan lihat garis {i>output<i} teratas dengan huruf kapital.
Lihat contoh variabel yang telah ditetapkan.
Variabel opsi Toolchain
COMPILATION_MODE
:fastbuild
,dbg
, atauopt
. (detail selengkapnya)
Variabel jalur
-
BINDIR
: Basis hierarki biner yang dihasilkan untuk arsitektur target.Perhatikan bahwa hierarki yang berbeda dapat digunakan untuk program yang berjalan selama build pada 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
: Basis hierarki kode yang dihasilkan untuk arsitektur target.
Variabel arsitektur mesin
-
TARGET_CPU
: CPU arsitektur target, misalnya,k8
.
Variabel genrule yang telah ditetapkan
Berikut ini tersedia secara khusus untuk atribut
cmd
genrule
dan umumnya
penting untuk membuat atribut tersebut berfungsi.
Lihat contoh variabel genrule yang telah ditetapkan.
OUTS
: Daftarouts
genrule
. Jika hanya memiliki satu file output, Anda juga dapat menggunakan$@
.-
SRCS
: Daftarsrcs
darigenrule
(atau lebih tepatnya: nama jalur file yang sesuai dengan label dalam daftarsrcs
). Jika hanya memiliki satu file sumber, Anda juga dapat menggunakan$<
. -
<
:SRCS
, jika berupa file tunggal. Else memicu error build. -
@
:OUTS
, jika berupa file tunggal. Else memicu error build. -
RULEDIR
: Direktori output target, yaitu direktori yang sesuai dengan nama paket yang berisi target pada hierarkigenfiles
ataubin
. Untuk//my/pkg:my_genrule
, parameter ini selalu diakhiri denganmy/pkg
, meskipun output//my/pkg:my_genrule
ada di subdirektori. -
@D
: Direktori output. Jika outs memiliki satu entri, tindakan ini akan memperluas ke direktori yang berisi file tersebut. Jika memiliki beberapa entri, tindakan ini akan diperluas ke direktori utama paket dalam hierarkigenfiles
, meskipun semua file output berada dalam subdirektori yang sama.Catatan: Gunakan
RULEDIR
daripada@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.Hindari penulisan ke direktori yang berisi input. Versi tersebut mungkin menggunakan sistem file hanya-baca. Bahkan jika tidak, melakukan hal itu akan membuang pohon sumber.
Variabel jalur sumber/output yang telah ditetapkan
Variabel yang telah ditetapkan execpath
, execpaths
, rootpath
, rootpaths
, location
, dan locations
mengambil parameter label (misalnya, $(execpath
//foo:bar)
) dan mengganti jalur file yang ditunjukkan oleh label tersebut.
Untuk file sumber, ini adalah jalur yang terkait dengan root ruang kerja 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 dalam direktori yang ditautkan oleh symlink
bazel-myproject
di root ruang kerja Anda. File sumberempty.source
ditautkan di jalurbazel-myproject/testapp/empty.source
. Jadi, jalur exec-nya (yang merupakan subjalur di bawah root) adalahtestapp/empty.source
. Ini adalah tindakan build jalur yang dapat digunakan untuk menemukan file.File output ditahapkan dengan cara serupa, tetapi juga diawali dengan subjalur
bazel-out/cpu-compilation_mode/bin
(atau untuk output alat:bazel-out/cpu-opt-exec-hash/bin
). Dalam contoh di atas,//testapp:app
adalah alat karena muncul dalam atributtools
show_app_output
. Jadi, file output-nyaapp
ditulis kebazel-myproject/bazel-out/cpu-opt-exec-hash/bin/testapp/app
. Jadi, jalur exec adalahbazel-out/cpu-opt-exec-hash/bin/testapp/app
. Awalan tambahan ini memungkinkan untuk mem-build target yang sama, misalnya, dua CPU berbeda dalam build yang sama tanpa hasilnya saling mengacaukan.Label yang diteruskan ke variabel ini harus merepresentasikan satu file. Untuk label yang mewakili file sumber, nilai ini otomatis berlaku. Untuk label yang mewakili aturan, aturan harus menghasilkan satu output. Jika nilai ini salah atau label salah format, build akan gagal dengan error.
-
rootpath
: Menunjukkan jalur yang dapat digunakan biner yang dibuat untuk menemukan dependensi pada runtime yang terkait dengan subdirektori dari 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 menghapus awalan konfigurasi yang dijelaskan di atas. Dalam contoh dari atas, hal ini berartiempty.source
danapp
menggunakan jalur relatif ruang kerja murni:testapp/empty.source
dantestapp/app
.rootpath
file dalam repositori eksternalrepo
akan diawali dengan../repo/
, diikuti dengan jalur relatif repositori.File ini memiliki persyaratan "satu output saja" yang sama dengan
execpath
. -
rlocationpath
: Jalur yang dapat diteruskan oleh biner yang dibuat ke fungsiRlocation
library runfiles untuk menemukan dependensi saat runtime, baik di direktori runfiles (jika tersedia) atau menggunakan manifes runfiles.Ini mirip dengan
rootpath
karena tidak berisi awalan konfigurasi, tetapi berbeda karena selalu dimulai dengan nama repositori. Pada contoh di atas, hal ini berartiempty.source
danapp
menghasilkan jalur berikut:myproject/testapp/empty.source
danmyproject/testapp/app
.rlocationpath
file dalam repositori eksternalrepo
akan diawali denganrepo/
, diikuti dengan jalur relatif repositori.Meneruskan jalur ini ke biner dan menyelesaikannya ke jalur sistem file menggunakan library runfile adalah pendekatan yang lebih disukai untuk menemukan dependensi pada waktu proses. Dibandingkan dengan
rootpath
, class ini memiliki keunggulan karena dapat berfungsi di semua platform dan meskipun direktori runfiles tidak tersedia.File 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
, dan location
. Fungsi ini mendukung label yang menghasilkan beberapa output, yang dalam hal ini
setiap output dicantumkan dan dipisahkan oleh spasi. Aturan output nol dan label dengan format yang salah menghasilkan error build.
Semua label yang direferensikan harus muncul di srcs
,
file output, atau deps
target yang memakai. Jika tidak, build akan gagal. Target C++ juga dapat mereferensikan label di data
.
Label tidak harus dalam bentuk kanonis: foo
, :foo
, dan //somepkg:foo
sudah cukup.
Variabel kustom
Variabel "Buat" kustom dapat direferensikan oleh atribut apa pun yang ditandai sebagai "Subject to 'Make variabel' substitution", tetapi hanya pada target yang bergantung pada target lain yang menentukan variabel tersebut.
Sebagai praktik terbaik, semua variabel harus bersifat kustom kecuali jika ada alasan yang sangat bagus untuk memasukkannya ke dalam inti Bazel. Dengan demikian, Bazel tidak perlu memuat dependensi yang mungkin mahal untuk menyediakan variabel yang memakai taret yang mungkin tidak penting.
Variabel toolchain C++
Berikut ini ditentukan dalam aturan toolchain C++ dan tersedia untuk aturan apa pun
yang menetapkan toolchains =
["@bazel_tools//tools/cpp:current_cc_toolchain"]
Beberapa aturan, seperti java_binary
, secara implisit
menyertakan toolchain C++ dalam definisi aturannya. Properti tersebut mewarisi variabel tersebut secara otomatis.
Aturan C++ bawaan jauh lebih canggih daripada "jalankan compiler di sana". Untuk mendukung mode kompilasi beragam seperti *SAN, ThinLTO, dengan/tanpa modul, dan biner yang dioptimalkan dengan hati-hati pada saat yang sama dengan pengujian yang berjalan cepat di berbagai platform, aturan bawaan berupaya keras untuk memastikan input, output, dan flag command line yang benar ditetapkan pada setiap kemungkinan beberapa tindakan yang dihasilkan secara internal.
Variabel ini merupakan mekanisme penggantian untuk digunakan oleh pakar bahasa dalam kasus yang jarang terjadi. Jika Anda tergoda untuk menggunakannya, harap hubungi developer Bazel terlebih dahulu.
ABI
: Versi ABI C++.-
AR
: Perintah "ar" dari crosstool. -
C_COMPILER
: ID compiler C/C++, misalnya,llvm
. -
CC
: Perintah compiler C dan C++.Kami sangat merekomendasikan agar selalu menggunakan
CC_FLAGS
bersama-sama denganCC
. Jika tidak melakukannya, risikonya Anda tanggung sendiri. CC_FLAGS
: Kumpulan tanda minimal untuk compiler C/C++ agar dapat digunakan oleh genrules. Secara khusus, error ini berisi flag untuk memilih arsitektur yang benar 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 ditentukan dalam aturan toolchain Java dan tersedia untuk aturan apa pun
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 dinyatakan oleh alat upstream, seperti Jar antarmuka, Jar antarmuka header, dan implementasi pengemasan dan penggabungan Jar yang sangat dioptimalkan.
Variabel ini merupakan mekanisme penggantian untuk digunakan oleh pakar bahasa dalam kasus yang jarang terjadi. Jika Anda tergoda untuk menggunakannya, harap hubungi developer Bazel terlebih dahulu.
-
JAVA
: Perintah "java" (virtual machine Java). Hindari hal ini, dan gunakan aturanjava_binary
sebagai gantinya jika memungkinkan. Mungkin jalur relatif. Jika harus mengubah direktori sebelum memanggiljava
, Anda harus mengambil direktori kerja sebelum mengubahnya. JAVABASE
: Direktori dasar yang berisi utilitas Java. Mungkin jalur relatif. Direktori tersebut akan memiliki subdirektori "bin".
Variabel yang ditentukan Starlark
Penulis aturan dan toolchain dapat menentukan variabel yang sepenuhnya kustom dengan menampilkan penyedia TemplateVariableInfo. Setiap aturan yang bergantung pada hal ini melalui atribut toolchains
kemudian dapat membaca nilainya: