- Penggunaan
- Variabel yang telah ditetapkan
- Variabel genrule yang telah ditetapkan
- Variabel jalur sumber/output yang telah ditetapkan
- Variabel kustom
Variabel "Make" adalah class khusus variabel string yang dapat diperluas dan tersedia untuk atribut yang ditandai sebagai "Subject to 'Make variable' substitution".
Variabel ini dapat digunakan, misalnya, untuk menyisipkan jalur toolchain tertentu ke dalam tindakan build yang dibuat pengguna.
Bazel menyediakan variabel yang telah ditetapkan, 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" adalah historis: sintaksis dan semantik dari variabel ini awalnya dimaksudkan agar cocok dengan GNU Make.
Penggunaan
Atribut yang ditandai sebagai "Subject to 'Make variable' substitution" dapat
mereferensikan variabel "Make" FOO sebagai berikut:
my_attr = "prefix $(FOO) suffix"
Dengan kata lain, setiap substring yang cocok dengan $(FOO) akan diperluas
ke FOO's value. Jika nilai tersebut adalah "bar", string akhir
akan menjadi:
my_attr = "prefix bar suffix"
Jika FOO tidak sesuai dengan variabel yang diketahui oleh target yang menggunakan, Bazel akan gagal dengan error.
Variabel "Make" yang namanya adalah simbol non-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 $$.
Predefined variables
Predefined "Make" variables can be referenced by any attribute marked as "Subject to 'Make variable' substitution" on any target.
To see the list of these variables and their values for a given set of build options, run
bazel info --show_make_env [build options]
and look at the top output lines with capital letters.
See an example of predefined variables.
Toolchain option variables
COMPILATION_MODE:fastbuild,dbg, oropt. (more details)
Path variables
-
BINDIR: The base of the generated binary tree for the target architecture.Note that a different tree may be used for programs that run during the build on the host architecture, to support cross-compiling.
If you want to run a tool from within a
genrule, the recommended way to get its path is$(execpath toolname), where toolname must be listed in thegenrule'stoolsattribute. GENDIR: The base of the generated code tree for the target architecture.
Machine architecture variables
-
TARGET_CPU: The target architecture's CPU, e.g.k8.
Predefined genrule variables
The following are specially available to genrule's
cmd attribute and are
generally important for making that attribute work.
See an example of predefined genrule variables.
OUTS: Thegenrule'soutslist. If you have only one output file, you can also use$@.-
SRCS: Thegenrule'ssrcslist (or more precisely: the path names of the files corresponding to labels in thesrcslist). If you have only one source file, you can also use$<. -
<:SRCS, if it is a single file. Else triggers a build error. -
@:OUTS, if it is a single file. Else triggers a build error. -
RULEDIR: The output directory of the target, that is, the directory corresponding to the name of the package containing the target under thegenfilesorbintree. For//my/pkg:my_genrulethis always ends inmy/pkg, even if//my/pkg:my_genrule's outputs are in subdirectories. -
@D: The output directory. If outs has one entry, this expands to the directory containing that file. If it has multiple entries, this expands to the package's root directory in thegenfilestree, even if all output files are in the same subdirectory!Note: Use
RULEDIRover@DbecauseRULEDIRhas simpler semantics and behaves the same way regardless of the number of output files.If the genrule needs to generate temporary intermediate files (perhaps as a result of using some other tool like a compiler), it should attempt to write them to
@D(although/tmpwill also be writable) and remove them before finishing.Especially avoid writing to directories containing inputs. They may be on read-only filesystems. Even if not, doing so would trash the source tree.
Note: If the filenames corresponding to the input labels or the output
filenames contain spaces, ', or other special characters (or your
genrule is part of a Starlark macro which downstream users may invoke on such
files), then $(SRCS) and $(OUTS) are not suitable
for interpolation into a command line, as they do not have the semantics that
"${@}" would in Bash.
One workaround is to convert to a Bash array, with
mapfile SRCS <<< "$$(sed -e 's/ /\\n/g' <<'genrule_srcs_expansion' $(SRC) genrule_srcs_expansion )lalu gunakan"$$\{SRCS[@]}"di baris perintah berikutnya, bukan$(SRCS). Opsi yang lebih kuat adalah menulis aturan Starlark.Variabel jalur sumber/output yang telah ditetapkan
Variabel yang telah ditetapkan
execpath,execpaths,rootpath,rootpaths,location, danlocationsmenggunakan parameter label (misalnya,$(execpath //foo:bar)) dan mengganti jalur file yang ditandai dengan label tersebut.Untuk file sumber, ini adalah jalur relatif terhadap root ruang kerja Anda. Untuk file yang merupakan output aturan, ini adalah jalur output (lihat penjelasan file output di bawah).
-
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
bazel-myprojectsymlink di root ruang kerja Anda. File sumberempty.sourceditautkan di jalurbazel-myproject/testapp/empty.source. Jadi, jalur exec-nya (yang adalah subjalur di bawah root) adalahtestapp/empty.source. Ini adalah jalur yang dapat digunakan tindakan build untuk menemukan file.File output di-stage dengan cara yang sama, tetapi juga diberi awalan dengan subjalur
bazel-out/cpu-compilation_mode/bin(atau untuk output alat:bazel-out/cpu-opt-exec-hash/bin). Pada contoh di atas,//testapp:appadalah alat karena muncul di atributtoolsshow_app_output. Jadi, file outputappditulis kebazel-myproject/bazel-out/cpu-opt-exec-hash/bin/testapp/app. Dengan demikian, jalur exec adalahbazel-out/cpu-opt-exec-hash/bin/testapp/app. Awalan tambahan ini memungkinkan Anda membuat target yang sama untuk, misalnya, dua CPU yang berbeda dalam build yang sama tanpa hasil yang saling menimpa.Label yang diteruskan ke variabel ini harus mewakili tepat satu file. Untuk label yang mewakili file sumber, hal ini otomatis benar. Untuk label yang mewakili aturan, aturan harus menghasilkan tepat satu output. Jika hal ini salah atau label salah format, build akan gagal dengan error.
-
rootpath: Menunjukkan jalur yang dapat digunakan oleh biner yang dibuat untuk menemukan dependensi saat runtime relatif terhadap subdirektori direktori runfiles yang sesuai dengan repositori utama. Catatan: Hal ini hanya berfungsi jika--enable_runfilesdiaktifkan, yang secara default tidak berlaku di Windows. Gunakanrlocationpathsebagai gantinya untuk dukungan lintas platform.Hal ini mirip dengan
execpathtetapi menghapus awalan konfigurasi yang dijelaskan di atas. Dalam contoh di atas, ini berartiempty.sourcedanappmenggunakan jalur relatif ruang kerja murni:testapp/empty.sourcedantestapp/app.rootpathfile di repositori eksternalrepoakan dimulai dengan../repo/, diikuti dengan jalur relatif repositori.Hal ini memiliki persyaratan "hanya satu output" yang sama dengan
execpath. -
rlocationpath: Jalur yang dapat diteruskan oleh biner yang dibuat ke fungsiRlocationdari library runfiles untuk menemukan dependensi saat runtime, baik di direktori runfiles (jika tersedia) atau menggunakan manifes runfiles.Hal ini mirip dengan
rootpathkarena tidak berisi awalan konfigurasi, tetapi berbeda karena selalu dimulai dengan nama repositori. Dalam contoh di atas, ini berartiempty.sourcedanappmenghasilkan jalur berikut:myproject/testapp/empty.sourcedanmyproject/testapp/app.rlocationpathfile di repositori eksternalrepoakan 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, hal ini memiliki keunggulan karena berfungsi di semua platform dan bahkan jika direktori runfiles tidak tersedia.Hal ini memiliki persyaratan "hanya satu output" yang sama dengan
execpath. -
location: Sinonim untukexecpathataurootpath, bergantung pada atribut yang diperluas. Ini adalah perilaku lama sebelum Starlark dan tidak direkomendasikan kecuali jika Anda benar-benar tahu apa yang dilakukannya untuk aturan tertentu. Lihat #2475 untuk mengetahui detailnya.
execpaths, rootpaths, rlocationpaths,
dan locations adalah variasi jamak dari execpath,
rootpath, rlocationpath, dan location,
masing-masing. Variabel ini mendukung label yang menghasilkan beberapa output, yang dalam hal ini
setiap output akan dicantumkan dan dipisahkan dengan spasi. Aturan tanpa output dan label yang salah format
akan menghasilkan error build.
Semua label yang direferensikan harus muncul di srcs,
file output, atau deps. Jika tidak, build akan gagal. Target C++ juga dapat mereferensikan label di data.
Label tidak harus dalam bentuk kanonis: foo, :foo
dan //somepkg:foo semuanya valid.
Variabel kustom
Variabel "Make" kustom dapat direferensikan oleh atribut apa pun yang ditandai sebagai "Subject to 'Make variable' substitution", tetapi hanya pada target yang bergantung pada target lain yang menentukan variabel ini.
Sebagai praktik terbaik, semua variabel harus kustom kecuali jika ada alasan yang sangat baik untuk memasukkannya ke dalam Bazel inti. Hal ini mencegah Bazel memuat dependensi yang berpotensi mahal untuk menyediakan variabel yang mungkin tidak diperhatikan oleh target yang menggunakan.
Variabel toolchain C++
Berikut ini ditentukan dalam aturan toolchain C++ dan tersedia untuk aturan apa pun
yang menetapkan toolchains =
["@bazel_tools//tools/cpp:toolchain_type"]
Beberapa aturan, seperti java_binary, secara implisit
menyertakan toolchain C++ dalam definisi aturannya. Aturan tersebut mewarisi variabel ini
secara otomatis.
Aturan C++ bawaan jauh lebih canggih daripada "jalankan compiler di dalamnya". Untuk mendukung mode kompilasi yang beragam seperti *SAN, ThinLTO, dengan/tanpa modul, dan biner yang dioptimalkan dengan cermat pada 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 menghasilkan beberapa tindakan internal.
Variabel ini adalah mekanisme penggantian yang akan digunakan oleh pakar bahasa dalam kasus yang jarang terjadi. Jika Anda ingin menggunakannya, silakan 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_FLAGSbersama denganCC. Jika tidak, Anda akan menanggung risikonya sendiri. CC_FLAGS: Kumpulan flag minimal untuk compiler C/C++ agar dapat digunakan oleh genrule. Secara khusus, hal ini berisi flag untuk memilih arsitektur yang benar jikaCCmendukung beberapa arsitektur.-
DUMPBIN: Microsoft COFF Binary File Dumper (dumpbin.exe) dari dari Microsoft Visual Studio. -
NM: Perintah "nm" dari crosstool. -
OBJCOPY: Perintah objcopy dari rangkaian yang sama dengan compiler C/C++. -
STRIP: Perintah strip dari rangkaian yang sama dengan compiler C/C++ compiler.
Variabel toolchain Java
Berikut ini ditentukan dalam aturan toolchain Java dan tersedia untuk aturan apa pun
yang menetapkan toolchains =
["@rules_java//toolchains:current_java_runtime"] (atau
"@rules_java//toolchains: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 diekspresikan oleh alat upstream, seperti Jar antarmuka, Jar antarmuka header, dan implementasi pengemasan dan penggabungan Jar yang sangat dioptimalkan.
Variabel ini adalah mekanisme penggantian yang akan digunakan oleh pakar bahasa dalam kasus yang jarang terjadi. Jika Anda ingin menggunakannya, silakan hubungi developer Bazel terlebih dahulu.
-
JAVA: Perintah "java" (virtual machine Java ) Hindari hal ini, dan gunakan aturanjava_binaryjika memungkinkan. Mungkin merupakan jalur relatif. Jika Anda harus mengubah direktori sebelum memanggiljava, Anda harus mengambil direktori kerja sebelum mengubahnya. JAVABASE: Direktori dasar yang berisi utilitas Java. Mungkin merupakan jalur relatif. Direktori ini akan memiliki subdirektori "bin" .
Variabel yang ditentukan Starlark
Penulis aturan dan toolchain dapat menentukan
variabel yang sepenuhnya kustom dengan menampilkan
TemplateVariableInfo. Aturan apa pun yang bergantung pada variabel ini melalui atribut
toolchains kemudian dapat membaca nilainya: