- Gunakan
- Variabel yang telah ditetapkan
- Variabel genrule yang telah ditetapkan
- Variabel jalur sumber/output standar
- Variabel khusus
Variabel "Membuat" adalah class khusus dari variabel string yang dapat diperluas yang tersedia untuk atribut yang ditandai sebagai "Tunduk pada substitusi 'Buat variabel'".
Ini dapat digunakan, misalnya, untuk memasukkan jalur toolchain tertentu ke dalam tindakan build yang dibuat pengguna.
Bazel menyediakan variabel yang telah ditentukan sebelumnya, 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 dari variabel ini awalnya dimaksudkan agar cocok dengan GNU Make.
Penggunaan
Atribut yang ditandai sebagai "Substitusi pada substitusi "Buat variabel"" dapat
mereferensikan variabel "Make" 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 akan menjadi:
my_attr = "prefix bar suffix"
Jika FOO
tidak sesuai dengan variabel yang diketahui oleh target pemakaian, Bazel akan gagal dengan menampilkan 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 "Membuat" yang telah ditentukan dapat direferensikan oleh atribut apa pun yang ditandai sebagai "Tunduk pada substitusi 'Buat variabel'" pada target apa pun.
Untuk melihat daftar variabel ini dan nilainya untuk kumpulan opsi build tertentu, jalankan
bazel info --show_make_env [build options]
dan lihat baris output teratas dengan huruf kapital.
Lihat contoh variabel yang telah ditetapkan.
Variabel opsi toolchain
COMPILATION_MODE
:fastbuild
,dbg
, atauopt
. (detail selengkapnya)
Variabel jalur
-
BINDIR
: Basis pohon biner yang dihasilkan untuk arsitektur target.Perhatikan bahwa struktur 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
: Dasar pohon kode yang dihasilkan untuk arsitektur target.
Variabel arsitektur mesin
-
TARGET_CPU
: CPU arsitektur target, misalnya,k8
.
Variabel genrule yang telah ditetapkan
Hal berikut secara khusus tersedia untuk atribut cmd
dari genrule
dan umumnya 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 itu adalah satu file. Jika tidak, ini akan memicu error build. -
@
:OUTS
, jika itu adalah satu file. Jika tidak, ini akan memicu error build. -
RULEDIR
: Direktori output target, yaitu direktori yang sesuai dengan nama paket yang berisi target dalam hierarkigenfiles
ataubin
. Untuk//my/pkg:my_genrule
, parameter ini selalu berakhiranmy/pkg
, meskipun output//my/pkg:my_genrule
berada di subdirektori. -
@D
: Direktori output. Jika out memiliki satu entri, entri ini akan diperluas ke direktori yang berisi file tersebut. Jika memiliki beberapa entri, entri ini akan diperluas ke direktori utama paket di hierarkigenfiles
, meskipun semua file output berada di subdirektori yang sama.Catatan: Gunakan
RULEDIR
daripada@D
karenaRULEDIR
memiliki semantik yang lebih sederhana dan berperilaku dengan cara yang sama terlepas dari jumlah file output-nya.Jika genrule perlu membuat file perantara sementara (mungkin karena menggunakan beberapa alat lain seperti compiler), alat ini harus mencoba menulisnya ke
@D
(meskipun/tmp
juga akan dapat ditulis) dan menghapusnya sebelum selesai.Terutama hindari penulisan ke direktori yang berisi input. ID tersebut mungkin berada pada sistem file hanya baca. Meskipun tidak, melakukan hal tersebut akan membuang pohon sumber.
Variabel jalur sumber/output yang telah ditentukan sebelumnya
Variabel yang telah ditetapkan execpath
, execpaths
,
rootpath
, rootpaths
, location
, dan
locations
menggunakan parameter label (misalnya $(execpath
//foo:bar)
) dan menggantikan jalur file yang ditandai dengan label tersebut.
Untuk file sumber, ini adalah jalur relatif ke 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 eksekutor tempat Bazel menjalankan tindakan build.Dalam 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 eksekutifnya (yang merupakan subjalur di bawah root) adalahtestapp/empty.source
. Ini adalah tindakan build jalur yang dapat digunakan untuk menemukan file.File output di-staging dengan cara yang sama, tetapi juga diawali dengan
bazel-out/cpu-compilation_mode/bin
subjalur (atau untuk output alat:bazel-out/cpu-opt-exec-hash/bin
). Pada contoh di atas,//testapp:app
adalah alat karena muncul di atributtools
show_app_output
. Jadi, file outputapp
-nya ditulis kebazel-myproject/bazel-out/cpu-opt-exec-hash/bin/testapp/app
. Jalur exe adalahbazel-out/cpu-opt-exec-hash/bin/testapp/app
. Awalan tambahan ini memungkinkan build target yang sama untuk, misalnya, dua CPU berbeda dalam build yang sama tanpa hasil yang saling bertentangan.Label yang diteruskan ke variabel ini harus mewakili satu file. Untuk label yang mewakili file sumber, hal ini otomatis berlaku. Untuk label yang mewakili aturan, aturan tersebut harus menghasilkan satu output. Jika label ini salah atau label salah, build akan gagal dengan error.
-
rootpath
: Menunjukkan jalur yang dapat digunakan oleh biner yang dibuat untuk menemukan dependensi pada runtime yang relatif terhadap subdirektori dari direktori runfile yang sesuai dengan repositori utama. Catatan: Ini hanya berfungsi jika--enable_runfiles
diaktifkan, dan hal ini tidak berlaku di Windows secara default. Gunakanrlocationpath
sebagai gantinya untuk dukungan lintas platform.Kode ini mirip dengan
execpath
tetapi menghapus awalan konfigurasi yang dijelaskan di atas. Pada 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.Proses ini memiliki persyaratan "satu output saja" yang sama seperti
execpath
. -
rlocationpath
: Jalur yang dibuat oleh biner build ke fungsiRlocation
library runfile untuk menemukan dependensi pada runtime, baik di direktori runfiles (jika tersedia) atau menggunakan manifes runfile.Ini serupa dengan
rootpath
karena tidak berisi awalan konfigurasi, tetapi berbeda karena selalu dimulai dengan nama repositori. Dalam contoh di atas, ini berartiempty.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 runfile adalah pendekatan yang direkomendasikan untuk menemukan dependensi pada runtime. Dibandingkan dengan
rootpath
, versi ini memiliki keuntungan bahwa aplikasi berfungsi di semua platform dan meskipun direktori runfile tidak tersedia.Proses ini memiliki persyaratan "satu output saja" yang sama seperti
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 fungsi aturan tersebut untuk aturan tertentu. Lihat #2475 untuk detailnya.
execpaths
, rootpaths
, rlocationpaths
,
dan locations
adalah variasi jamak dari execpath
,
rootpath
, rlocationpaths
, dan
location
. Label tersebut mendukung label yang menghasilkan beberapa output, dengan setiap
output tercantum dipisahkan oleh spasi. Aturan output nol dan label
yang salah format akan menghasilkan error build.
Semua label yang direferensikan harus muncul di srcs
, file output, atau deps
target yang menggunakan target. Jika tidak, build akan gagal. Target C++ juga dapat mereferensikan label di data
.
Label tidak harus dalam bentuk kanonis: foo
, :foo
,
dan //somepkg:foo
dapat digunakan.
Variabel kustom
Variabel "Make" kustom dapat direferensikan oleh atribut apa pun yang ditandai sebagai "Sub tunduk pada substitusi 'Buat variabel'", tetapi hanya pada target yang bergantung pada target lain yang menentukan variabel tersebut.
Sebagai praktik terbaik, semua variabel harus dibuat kustom kecuali ada alasan yang sangat baik untuk memasukkannya ke Bazel inti. Dengan demikian, Bazel tidak perlu memuat dependensi yang berpotensi mahal untuk memasok variabel yang memakai taret yang tidak penting bagi mereka.
Variabel toolchain C++
Hal-hal berikut ditentukan 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 yang setara dengan host host). Beberapa aturan, seperti java_binary
, secara implisit
menyertakan toolchain C++ dalam definisi aturannya. Variabel ini otomatis mewarisi variabel tersebut.
Aturan C++ bawaan jauh lebih canggih daripada "menjalankan compiler di dalamnya". Untuk mendukung mode kompilasi yang beragam seperti *SAN, ThinLTO, dengan/tanpa modul, dan biner yang dioptimalkan dengan cermat secara bersamaan dengan pengujian yang berjalan cepat di beberapa platform, aturan bawaan akan diterapkan dengan sangat baik untuk memastikan input, output, dan tanda command line yang benar ditetapkan pada setiap dari beberapa tindakan yang 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 ABI C++.-
AR
: Perintah "ar" dari crosstool. -
C_COMPILER
: ID compiler C/C++, misalnyallvm
. -
CC
: Perintah compiler C dan C++.Sebaiknya selalu gunakan
CC_FLAGS
yang dikombinasikan denganCC
. Anda tidak dapat melakukannya jika menanggung sendiri risikonya. CC_FLAGS
: Kumpulan tanda minimal untuk compiler C/C++ agar dapat digunakan oleh genrules. Secara khusus, ini berisi tanda 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
Hal-hal berikut ini ditentukan 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 yang setara dengan host host).
Sebagian besar alat di JDK tidak boleh digunakan secara langsung. Aturan Java bawaan menggunakan pendekatan yang lebih canggih pada kompilasi dan pemaketan Java dibandingkan yang dapat dinyatakan oleh alat upstream, seperti Jar antarmuka, Jar antarmuka header, serta pemaketan Jar dan penerapan penggabungan 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. Dapat berupa jalur relatif. Jika Anda harus mengubah direktori sebelum memanggiljava
, Anda harus mengambil direktori kerja sebelum mengubahnya. JAVABASE
: Direktori dasar yang berisi utilitas Java. Dapat berupa jalur relatif. Ini 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 atribut ini melalui
atribut toolchains
kemudian dapat membaca nilainya: