Buat Variabel

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 untuk istilah "Make" adalah historis: sintaksis dan semantik dari variabel ini awalnya dimaksudkan untuk 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 $$.

Variabel yang telah ditetapkan

Variabel "Make" yang telah ditetapkan dapat direferensikan oleh atribut apa pun yang ditandai sebagai "Subject to 'Make variable' substitution" 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

Variabel jalur

  • BINDIR: Dasar dari 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 tercantum dalam atribut tools genrule.

  • GENDIR: Dasar dari pohon kode yang dihasilkan untuk arsitektur target.

Variabel arsitektur mesin

  • TARGET_CPU: CPU arsitektur target, misalnya k8.

Variabel genrule yang telah ditetapkan

Berikut ini tersedia khusus untuk atribut genrule's cmd 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. Jika tidak, akan memicu a build error.
  • RULEDIR: Direktori output target, yaitu direktori yang sesuai dengan nama paket yang berisi target di bawah pohon genfiles atau bin. Untuk //my/pkg:my_genrule ini selalu diakhiri dengan my/pkg, meskipun output //my/pkg:my_genrule's berada di subdirektori.

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

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

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

    Terutama hindari menulis ke direktori yang berisi input. Direktori tersebut mungkin berada di sistem file hanya baca. Meskipun tidak, tindakan tersebut akan merusak 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 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).

Lihat contoh variabel jalur yang telah ditetapkan.

  • execpath: Menunjukkan jalur di bawah execroot tempat Bazel menjalankan tindakan build.

    Dalam contoh di atas, Bazel menjalankan semua tindakan build di direktori yang ditautkan oleh bazel-myproject symlink di root ruang kerja Anda. File sumber empty.source ditautkan di jalur bazel-myproject/testapp/empty.source. Jadi, jalur exec-nya (yang adalah subjalur di bawah root) adalah testapp/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). Dalam contoh di atas, //testapp:app adalah alat karena muncul di show_app_output's atribut tools. Jadi, file output app ditulis ke bazel-myproject/bazel-out/cpu-opt-exec-hash/bin/testapp/app. Dengan demikian, jalur exec adalah bazel-out/cpu-opt-exec-hash/bin/testapp/app. Awalan tambahan ini memungkinkan untuk membuat target yang sama, 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 salah atau label salah format, build akan gagal dengan error.

  • rootpath: Menunjukkan jalur yang dapat digunakan 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_runfiles diaktifkan, yang tidak berlaku di Windows secara default. Gunakan rlocationpath sebagai gantinya untuk dukungan lintas platform.

    Hal ini mirip dengan execpath tetapi menghapus awalan konfigurasi yang dijelaskan di atas. Dalam contoh dari atas, ini berarti empty.source dan app menggunakan jalur relatif ruang kerja murni paths: testapp/empty.source dan testapp/app.

    rootpath file di repositori eksternal repo akan dimulai dengan ../repo/, diikuti dengan jalur relatif repositori.

    Hal ini memiliki persyaratan "hanya satu output" yang sama dengan execpath.

  • rlocationpath: Jalur yang dapat diteruskan biner yang dibuat ke fungsi Rlocation library runfiles untuk menemukan dependensi saat runtime, baik di direktori runfiles (jika tersedia) atau menggunakan manifes runfiles.

    Hal ini mirip dengan rootpath karena tidak berisi awalan konfigurasi, tetapi berbeda karena selalu dimulai dengan nama repositori. Dalam contoh dari atas, ini berarti empty.source dan app menghasilkan jalur berikut: myproject/testapp/empty.source dan myproject/testapp/app.

    rlocationpath file di repositori eksternal repo akan dimulai dengan repo/, 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, jalur 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 untuk execpath atau rootpath, bergantung pada atribut yang diperluas. Ini adalah perilaku pra-Starlark lama 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 dicantumkan dan dipisahkan dengan spasi. Aturan tanpa output dan label yang salah format 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:current_cc_toolchain"] 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 dibuat secara 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++, misalnya llvm.
  • CC: Perintah compiler C dan C++.

    Sebaiknya selalu gunakan CC_FLAGS bersama dengan CC. Jika tidak, Anda akan menanggung sendiri risikonya.

  • CC_FLAGS: Kumpulan flag minimal untuk compiler C/C++ agar dapat digunakan oleh genrule. Secara khusus, ini berisi flag untuk memilih arsitektur yang benar jika CC mendukung 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 aturan java_binary jika memungkinkan. Mungkin jalur relatif. Jika Anda harus mengubah direktori sebelum memanggil java, Anda harus mengambil direktori kerja sebelum mengubahnya.
  • JAVABASE: Direktori dasar yang berisi utilitas Java. Mungkin 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:

Lihat contoh variabel yang ditentukan Starlark.