BazelCon 2022 akan hadir pada 16-17 November ke New York dan online.
Daftar sekarang.

"Buat" Variabel

Tetap teratur dengan koleksi Simpan dan kategorikan konten berdasarkan preferensi Anda.

"Menjadikan" variabel adalah class khusus variabel string yang dapat diperluas yang tersedia untuk atribut yang ditandai sebagai "Tunduk pada 'Buat variabel' substitusi".

Ini dapat digunakan, misalnya, untuk memasukkan jalur toolchain tertentu ke dalam tindakan build yang dibuat pengguna.

Bazel menyediakan variabel standar, 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 pada awalnya ditujukan untuk cocok dengan GNU Make.

Gunakan

Atribut yang ditandai sebagai "Tunduk pada 'Buat variabel' substitusi" 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 final akan menjadi:

my_attr = "prefix bar suffix"

Jika FOO tidak sesuai dengan variabel yang diketahui target konsumsi, Bazel akan gagal dengan error.

"Buatan variabel yang namanya bukan simbol huruf, seperti @, juga dapat direferensikan hanya menggunakan tanda dolar, tanpa tanda kurung. Misalnya:

my_attr = "prefix $@ suffix"

Untuk menulis $ sebagai literal string (yaitu untuk mencegah perluasan variabel), tulis $$.

Variabel yang telah ditetapkan

Variabel "Make" standar dapat direferensikan oleh atribut apa pun yang ditandai sebagai "Tunduk pada 'Menjadikan variabel' substitusi" pada target apa pun.

Untuk melihat daftar variabel ini dan nilainya untuk kumpulan opsi build yang diberikan, 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

Variabel jalur

  • BINDIR: Dasar pohon biner yang dihasilkan untuk arsitektur target.

    Perhatikan bahwa pohon 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 atribut tools genrule.

  • GENDIR: Pohon kode dasar yang dihasilkan untuk arsitektur target.

Variabel arsitektur mesin

  • TARGET_CPU: CPU target arsitektur, misalnya k8.

Variabel genrule yang telah ditetapkan

Berikut ini khususnya tersedia untuk atribut cmd genrule dan umumnya penting agar atribut tersebut berfungsi.

Lihat contoh variabel genrule yang telah ditetapkan.

  • OUTS: Daftar outs genrule. Jika hanya memiliki satu file output, Anda juga dapat menggunakan $@.
  • SRCS: Daftar srcs genrule (atau lebih tepatnya: nama jalur file yang sesuai dengan label dalam daftar srcs). Jika hanya memiliki satu file sumber, Anda juga dapat menggunakan $<.
  • <: SRCS, jika berupa satu file. Jika tidak, akan memicu error build.
  • @: OUTS, jika berupa satu file. Selain itu, akan memicu error build.
  • RULEDIR: Direktori output target, yaitu direktori yang sesuai dengan nama paket yang berisi target dalam hierarki genfiles atau bin. Untuk //my/pkg:my_genrule, hal ini selalu berakhir pada my/pkg, meskipun output //my/pkg:my_genrule berada dalam subdirektori.

  • @D: Direktori output. Jika out memiliki satu entri, ini akan diperluas ke direktori yang berisi file tersebut. Jika memiliki beberapa entri, ini akan diperluas ke direktori utama paket di hierarki genfiles, meskipun semua file output berada di subdirektori yang sama.

    Catatan: Gunakan RULEDIR daripada @D karena RULEDIR memiliki semantik yang lebih sederhana dan berperilaku dengan cara yang sama terlepas dari jumlah file output.

    Jika genrule perlu menghasilkan file perantara sementara (mungkin sebagai hasil dari penggunaan alat lain seperti compiler), genrule harus mencoba menulisnya ke @D (meskipun /tmp juga akan dapat ditulis) dan menghapusnya sebelum selesai.

    Terutama hindari menulis ke direktori yang berisi input. File tersebut mungkin menggunakan sistem file hanya baca. Meskipun tidak, tindakan tersebut akan membuang pohon sumber.

Variabel jalur sumber/output yang telah ditetapkan

Variabel yang telah ditetapkan execpath, execpaths, rootpath, rootpaths, location, dan locations menggunakan parameter label (misalnya $(execpath //foo:bar)) dan menggantikan jalur file yang ditunjukkan 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 file (lihat penjelasan tentang file output di bawah).

Lihat contoh variabel jalur standar.

  • 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 workspace Anda. File sumber empty.source ditautkan di jalur bazel-myproject/testapp/empty.source. Jadi, jalur exec-nya (yang merupakan subjalur di bawah root) adalah testapp/empty.source. Ini adalah tindakan build jalur yang dapat digunakan untuk menemukan file.

    File output disiapkan secara mirip, tetapi juga diawali dengan subjalur bazel-out/cpu-compilation_mode/bin (atau untuk output tertentu: bazel-out/cpu-compilation_mode/genfiles, atau untuk output alat host: bazel-out/host/bin). Pada contoh di atas, //testapp:app adalah alat host karena muncul dalam atribut tools show_app_output. Jadi, file output-nya app ditulis ke bazel-myproject/bazel-out/host/bin/testapp/app. Jalur exec adalah bazel-out/host/bin/testapp/app. Awalan tambahan ini memungkinkan pembuatan target yang sama untuk, misalnya, dua CPU berbeda dalam build yang sama tanpa hasil saling menyusup.

    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 harus menghasilkan satu output. Jika nilainya salah atau labelnya salah, build akan gagal dengan error.

  • rootpath: Menunjukkan jalur runfiles yang dapat digunakan oleh biner build untuk menemukan dependensinya pada runtime.

    Ini sama dengan execpath, tetapi menghapus awalan output yang dijelaskan di atas. Pada contoh di atas, ini berarti empty.source dan app menggunakan jalur relatif ruang kerja murni: testapp/empty.source dan testapp/app.

    Ini memiliki "satu output saja" persyaratan yang sama dengan execpath.

  • location: Sinonim untuk execpath atau rootpath, bergantung pada atribut yang diperluas. Hal ini merupakan perilaku pra-Starlark lama dan tidak direkomendasikan kecuali Anda benar-benar memahami fungsinya untuk aturan tertentu. Lihat #2475 untuk mengetahui detailnya.

execpaths, rootpaths, dan locations berturut-turut adalah bentuk jamak dari execpath, rootpath, dan location. Modul ini mendukung label yang menghasilkan beberapa output, yang dalam hal ini setiap output dicantumkan dengan dipisahkan spasi. Aturan output nol dan label yang salah format akan menghasilkan error build.

Semua label yang direferensikan harus muncul di srcs target, file output, atau deps yang memakainya. Jika tidak, build akan gagal. Target C++ juga dapat mereferensikan label dalam data.

Label tidak boleh dalam format kanonis: foo, :foo, dan //somepkg:foo tidak masalah.

Variabel kustom

Variabel khusus "Membuat" dapat direferensikan oleh atribut apa pun yang ditandai sebagai "Tunduk pada 'Membuat variabel' substitusi", tetapi hanya pada target yang bergantung pada target lain yang menentukan variabel ini.

Sebagai praktik terbaik, semua variabel harus dibuat kustom kecuali ada alasan yang sangat bagus untuk memasukkannya ke dalam Bazel inti. Dengan demikian, Bazel tidak perlu memuat dependensi yang berpotensi mahal jika disediakan untuk variabel yang menggunakan taret.

Variabel toolchain C++

Hal berikut ditentukan dalam aturan toolchain C++ dan tersedia untuk aturan apa pun yang menetapkan toolchains = ["@bazel_tools//tools/cpp:current_cc_toolchain"] (atau "@bazel_tools//tools/cpp:current_cc_host_toolchain" untuk kesetaraan toolchain host). Beberapa aturan, seperti java_binary, secara implisit menyertakan toolchain C++ dalam definisi aturannya. Variabel tersebut mewarisi variabel tersebut secara otomatis.

Aturan C++ bawaan jauh lebih canggih daripada "menjalankan compiler padanya". Untuk mendukung mode kompilasi yang beragam seperti *SAN, ThinLTO, dengan/tanpa modul, dan biner yang dioptimalkan dengan cermat pada waktu yang sama seperti pengujian yang berjalan cepat di beberapa platform, aturan bawaan berupaya semaksimal mungkin untuk memastikan input, output, dan tanda command line yang benar ditetapkan pada masing-masing tindakan yang berpotensi dihasilkan secara internal.

Variabel ini adalah mekanisme penggantian untuk digunakan oleh para pakar bahasa dalam kasus yang jarang terjadi. Jika Anda ingin menggunakannya, hubungi developer Bazel terlebih dahulu.

  • ABI: Versi ABI C++.
  • AR: Perintah "ar" dari alat silang.
  • C_COMPILER: ID compiler C/C++, misalnya llvm.
  • CC: Perintah compiler C dan C++.

    Kami sangat merekomendasikan agar selalu menggunakan CC_FLAGS yang dikombinasikan dengan CC. Tidak dapat melakukannya dengan risiko sendiri.

  • CC_FLAGS: Serangkaian flag minimal bagi compiler C/C++ untuk dapat digunakan oleh genrules. Secara khusus, mode ini berisi flag untuk memilih arsitektur yang tepat jika CC mendukung beberapa arsitektur.
  • NM: Perintah "nm" dari alat silang.
  • 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 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 kesetaraan toolchain host).

Sebagian besar alat di JDK tidak boleh digunakan secara langsung. Aturan Java bawaan menggunakan pendekatan yang lebih canggih terhadap kompilasi dan pengemasan Java daripada yang dapat dinyatakan oleh alat upstream, seperti Jar antarmuka, Jar antarmuka, serta implementasi penggabungan dan penggabungan Jar yang sangat dioptimalkan.

Variabel ini adalah mekanisme penggantian untuk digunakan oleh para pakar bahasa dalam kasus yang jarang terjadi. Jika Anda ingin menggunakannya, hubungi developer Bazel terlebih dahulu.

  • JAVA: Perintah "java" mesin virtual Java). Hindari hal ini, dan gunakan aturan java_binary sebagai gantinya. Dapat berupa jalur relatif. Jika harus mengubah direktori sebelum memanggil java, Anda harus mengambil direktori yang berfungsi sebelum mengubahnya.
  • JAVABASE: Direktori dasar yang berisi utilitas Java. Dapat berupa jalur relatif. Ini akan memiliki "bin" subdirektori.

Variabel yang ditentukan oleh Starlark

Penulis aturan dan toolchain dapat menentukan variabel yang sepenuhnya kustom dengan menampilkan penyedia TemplateVariableInfo. Setiap aturan yang bergantung pada aturan ini melalui atribut toolchains kemudian dapat membaca nilainya:

Lihat contoh variabel yang ditentukan Starlark.