Buat Variabel

Laporkan masalah Lihat sumber Malam · 7,4 kami. 7,3 · 7,2 · 7,1 · 7,0 · 6,5

"Buat" variabel adalah kelas khusus dari variabel string yang dapat diperluas yang tersedia ke atribut yang ditandai sebagai "Subjek 'Buat variabel' substitusi".

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 penggunaan istilah "Make" adalah historis: sintaksis dan semantik variabel ini awalnya dimaksudkan untuk cocok dengan GNU Make.

Gunakan

Atribut yang ditandai sebagai "Tunduk pada penggantian 'Variabel pembuatan'" dapat mereferensikan variabel "Pembuatan" FOO sebagai berikut:

my_attr = "prefix $(FOO) suffix"

Dengan kata lain, setiap substring yang cocok dengan $(FOO) akan diperluas ke nilai FOO. Jika nilainya "bar", string akhir menjadi:

my_attr = "prefix bar suffix"

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

"Buat" variabel yang namanya berupa simbol bukan 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 variabel ekspansi), tulis $$.

Variabel yang telah ditetapkan

Variabel "Make" standar dapat direferensikan oleh atribut apa pun yang ditandai sebagai "Tunduk pada penggantian 'Variabel make'" pada target mana 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 besar.

Lihat contoh variabel yang telah ditetapkan.

Variabel opsi Toolchain

Variabel jalur

  • BINDIR: Dasar hierarki biner yang dihasilkan untuk target tentang arsitektur ini.

    Perhatikan bahwa pohon yang berbeda dapat digunakan untuk program yang berjalan selama membangun arsitektur {i>host<i}, untuk mendukung kompilasi silang.

    Jika Anda ingin menjalankan alat dari dalam genrule, metode cara yang disarankan untuk mendapatkan jalurnya adalah $(execpath toolname), tempat toolname harus dicantumkan di kolom genrule tools.

  • 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 khusus untuk genrule cmd dan merupakan penting untuk membuat atribut itu berfungsi.

Lihat contoh variabel genrule standar.

  • 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 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 informasi di bawah pohon genfiles atau bin. Sebagai //my/pkg:my_genrule ini selalu berakhir dengan my/pkg, meskipun output //my/pkg:my_genrule ada di subdirektori.

  • @D: Direktori output. Jika outs memiliki satu entri, ini akan diperluas ke direktori yang berisi file tersebut. Jika terdapat beberapa entri, ini akan meluas ke direktori {i>root<i} paket di Hierarki genfiles, meskipun semua file output berada di lokasi yang sama subdirektori.

    Catatan: Gunakan RULEDIR, bukan @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 akibat menggunakan beberapa alat lain seperti kompiler), alat itu harus mencoba tuliskan ke @D (meskipun /tmp juga akan dapat ditulis) dan menghapusnya sebelum selesai.

    Hindari penulisan ke direktori yang berisi input. File tersebut mungkin berada di sistem file hanya baca. Bahkan jika tidak, melakukan hal itu akan membuang pohon sumber.

Variabel jalur sumber/output yang telah ditetapkan

Variabel standar execpath, execpaths, rootpath, rootpaths, location, dan locations menggunakan parameter label (misalnya $(execpath //foo:bar)) dan mengganti jalur file yang ditunjukkan oleh label tersebut.

Untuk file sumber, ini adalah jalur yang relatif terhadap 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 standar.

  • 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 symlink bazel-myproject di root ruang kerja Anda. Tujuan file sumber empty.source ditautkan di jalur bazel-myproject/testapp/empty.source. Jadi, jalur eksekusi (yang merupakan subjalur di bawah root) adalah testapp/empty.source. Ini adalah jalur yang dapat digunakan tindakan build 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 di Atribut tools show_app_output. Jadi, file output-nya, app, ditulis ke bazel-myproject/bazel-out/cpu-opt-exec-hash/bin/testapp/app. Dengan demikian, jalur eksekusi adalah bazel-out/cpu-opt-exec-hash/bin/testapp/app. Awalan ekstra ini memungkinkan untuk membangun target yang sama untuk, katakanlah, dua CPU berbeda di {i>build<i} yang sama tanpa hasilnya mengacaukan satu sama lain.

    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 ini adalah false 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 runfile-nya yang sesuai dengan repositori utama. Catatan: Ini hanya berfungsi jika --enable_runfiles diaktifkan, tetapi hal ini tidak berlaku di Windows secara {i>default<i}. Sebagai gantinya, gunakan rlocationpath untuk dukungan lintas platform.

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

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

    Kode ini memiliki "satu output saja" yang sama persyaratannya sebagai execpath.

  • rlocationpath: Jalur yang dapat diteruskan biner build ke fungsi Rlocation library runfiles untuk menemukan dependensi di runtime, baik di direktori runfiles (jika tersedia) atau menggunakan manifes {i>runfiles<i}.

    Ini mirip dengan rootpath karena tidak berisi awalan konfigurasi, tetapi berbeda karena selalu dimulai dengan dari nama repositori. Dalam contoh di 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 diawali dengan repo/, diikuti dengan repositori-relatif.

    Meneruskan jalur ini ke biner dan me-resolve-nya ke jalur sistem file menggunakan library runfile adalah pendekatan yang lebih disukai untuk menemukan dependensi pada runtime. Dibandingkan dengan rootpath, memiliki keunggulan bahwa dapat berfungsi di semua platform dan meskipun direktori runfile tidak tersedia.

    Kode ini memiliki "satu output saja" yang sama persyaratannya sebagai execpath.

  • location: Sinonim untuk execpath atau rootpath, bergantung pada atribut yang diperluas. Ini adalah perilaku pra-Starlark lama dan tidak direkomendasikan kecuali 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, rlocationpaths, danlocation, secara berurutan. Mereka mendukung label untuk menghasilkan banyak {i>output<i}, dalam hal ini setiap {i>output<i} tercantum dan dipisahkan oleh spasi. Aturan output nol dan label yang salah formatnya akan menghasilkan error build.

Semua label yang direferensikan harus muncul di srcs target yang memakai, 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 baik-baik saja.

Variabel kustom

Variabel "Make" kustom dapat dirujuk oleh atribut apa pun yang ditandai sebagai "Tunduk pada penggantian 'Make variable'", tetapi hanya pada target yang bergantung pada target lain yang menentukan variabel ini.

Sebagai praktik terbaik, semua variabel harus disesuaikan kecuali jika ada untuk memasukkannya ke dalam inti Bazel. Hal ini membuat Bazel tidak perlu memuat dependensi yang berpotensi mahal untuk menyediakan variabel yang mungkin tidak diperhatikan oleh target.

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. Class ini mewarisi variabel ini secara otomatis.

Aturan C++ bawaan jauh lebih canggih daripada "menjalankan compiler di dalamnya". Untuk mendukung mode kompilasi beragam seperti *SAN, ThinLTO, dengan/tanpa modul, serta biner yang dioptimalkan dengan cermat pada waktu yang sama dengan pengujian cepat di banyak platform, aturan bawaan berguna untuk memastikan input, output, dan tanda command line yang benar telah ditetapkan pada setiap kemungkinan 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: "ar" dari {i>crosstool<i}.
  • C_COMPILER: ID compiler C/C++, misalnya, llvm.
  • CC: Perintah compiler C dan C++.

    Kami sangat menyarankan agar selalu menggunakan CC_FLAGS di kombinasi dengan CC. Jika tidak, risikonya merupakan tanggung jawab Anda sendiri.

  • CC_FLAGS: Kumpulan flag minimum agar compiler C/C++ dapat digunakan oleh genrules. Secara khusus, file ini berisi penanda untuk pilih arsitektur yang benar jika CC mendukung beberapa terkait 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 diekspresikan oleh alat upstream, seperti Jar antarmuka, Jar antarmuka header, dan pengemasan Jar yang sangat dioptimalkan serta implementasi penggabungan.

Variabel ini adalah mekanisme penggantian yang akan 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 aturan java_binary jika memungkinkan. Mungkin jalur relatif. Jika Anda harus mengubah direktori sebelum memanggil java, Anda harus menangkap pada direktori kerja sebelum mengubahnya.
  • JAVABASE: Direktori dasar yang berisi direktori Utilitas Java. Mungkin jalur relatif. Properti tersebut akan memiliki "tempat sampah" subdirektori.

Variabel yang ditentukan Starlark

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

Lihat contoh variabel yang ditentukan Starlark.