Peraturan Umum

Aturan

alias

alias(name, actual, compatible_with, deprecation, features, restricted_to, tags, target_compatible_with, testonly, visibility)

Aturan alias membuat nama lain yang dapat menjadi rujukan aturan.

Alias hanya berfungsi untuk target "reguler". Secara khusus, package_group dan test_suite tidak dapat diberi alias.

Aturan alias memiliki deklarasi visibilitas sendiri. Dalam semua hal lainnya, kode ini berperilaku seperti aturan yang direferensikannya (misalnya, hanya pengujian pada alias diabaikan; nilai khusus pengujian dari aturan yang dirujuk yang digunakan) dengan beberapa pengecualian kecil:

  • Pengujian tidak akan dijalankan jika aliasnya disebutkan pada command line. Untuk menentukan alias yang menjalankan pengujian yang direferensikan, gunakan aturan test_suite dengan satu target dalam atribut tests-nya.
  • Saat menentukan grup lingkungan, alias untuk aturan environment tidak didukung. Metode tersebut juga tidak didukung dalam opsi command line --target_environment.

Contoh

filegroup(
    name = "data",
    srcs = ["data.txt"],
)

alias(
    name = "other",
    actual = ":data",
)

Argumen

Atribut
name

Name; required

Nama unik untuk target ini.

actual

Label; required

Target yang dirujuk alias ini. Tidak harus berupa aturan, nilainya juga dapat berupa file input.

config_setting

config_setting(name, constraint_values, define_values, deprecation, distribs, features, flag_values, licenses, tags, testonly, values, visibility)

Mencocokkan status konfigurasi yang diharapkan (dinyatakan sebagai flag build atau batasan platform) untuk tujuan memicu atribut yang dapat dikonfigurasi. Lihat bagian select untuk mengetahui cara menggunakan aturan ini dan Atribut yang dapat dikonfigurasi untuk mengetahui ringkasan fitur umum.

Contoh

Baris berikut cocok dengan build apa pun yang menetapkan --compilation_mode=opt atau -c opt (baik secara eksplisit pada command line maupun secara implisit dari file .bazelrc):

  config_setting(
      name = "simple",
      values = {"compilation_mode": "opt"}
  )
  

Baris berikut cocok dengan build apa pun yang menargetkan ARM dan menerapkan FOO=bar definisi kustom (misalnya, bazel build --cpu=arm --define FOO=bar ...):

  config_setting(
      name = "two_conditions",
      values = {
          "cpu": "arm",
          "define": "FOO=bar"
      }
  )
  

Parameter berikut cocok dengan build apa pun yang menetapkan flag yang ditentukan pengguna --//custom_flags:foo=1 (baik secara eksplisit pada command line maupun secara implisit dari file .bazelrc):

  config_setting(
      name = "my_custom_flag_is_set",
      flag_values = { "//custom_flags:foo": "1" },
  )
  

Yang berikut ini cocok dengan build apa pun yang menargetkan platform dengan arsitektur x86_64 dan glibc versi 2.25, dengan asumsi adanya constraint_value dengan label //example:glibc_2_25. Perhatikan bahwa platform tetap cocok jika menentukan nilai batasan tambahan di luar keduanya.

  config_setting(
      name = "64bit_glibc_2_25",
      constraint_values = [
          "@platforms//cpu:x86_64",
          "//example:glibc_2_25",
      ]
  )
  
Dalam semua kasus ini, konfigurasi dapat berubah di dalam build, misalnya jika target perlu dibuat untuk platform yang berbeda dengan dependensinya. Artinya, meskipun config_setting tidak cocok dengan tanda command line level atas, konfigurasi tersebut mungkin masih cocok dengan beberapa target build.

Catatan

  • Lihat bagian select untuk mengetahui apa yang terjadi jika beberapa config_setting cocok dengan status konfigurasi saat ini.
  • Untuk tanda yang mendukung formulir singkat (misalnya --compilation_mode vs. -c), definisi values harus menggunakan bentuk lengkap. Keduanya secara otomatis mencocokkan pemanggilan menggunakan salah satu formulir.
  • Jika flag mengambil beberapa nilai (seperti --copt=-Da --copt=-Db atau flag Starlark yang berjenis daftar), values = { "flag": "a" } cocok jika "a" ada di mana pun dalam daftar sebenarnya.

    values = { "myflag": "a,b" } berfungsi dengan cara yang sama: ini cocok dengan --myflag=a --myflag=b, --myflag=a --myflag=b --myflag=c, --myflag=a,b, dan --myflag=c,b,a. Semantik yang tepat bervariasi antar-flag. Misalnya, --copt tidak mendukung banyak nilai dalam instance yang sama: --copt=a,b menghasilkan ["a,b"], sedangkan --copt=a --copt=b menghasilkan ["a", "b"] (jadi values = { "copt": "a,b" } cocok dengan nilai sebelumnya, tetapi tidak dengan yang kedua). Namun, --ios_multi_cpus (untuk aturan Apple) memang: -ios_multi_cpus=a,b dan ios_multi_cpus=a --ios_multi_cpus=b menghasilkan ["a", "b"]. Periksa definisi flag dan uji kondisi Anda dengan cermat untuk memverifikasi ekspektasi yang tepat.

  • Jika Anda perlu menentukan kondisi yang tidak dimodelkan oleh flag build bawaan, gunakan flag yang ditentukan Starlark. Anda juga dapat menggunakan --define, tetapi cara ini menawarkan dukungan yang lebih lemah dan tidak direkomendasikan. Lihat di sini untuk diskusi selengkapnya.
  • Hindari pengulangan definisi config_setting yang identik dalam paket berbeda. Sebagai gantinya, referensikan config_setting umum yang ditentukan dalam paket kanonis.
  • values, define_values, dan constraint_values dapat digunakan dalam kombinasi apa pun dalam config_setting yang sama, tetapi setidaknya salah satunya harus ditetapkan untuk config_setting tertentu.

Argumen

Atribut
name

Name; required

Nama unik untuk target ini.

constraint_values

List of labels; optional; nonconfigurable

Kumpulan minimum constraint_values yang harus ditentukan platform target agar cocok dengan config_setting ini. (Platform eksekusi tidak dipertimbangkan di sini.) Nilai batasan tambahan apa pun yang telah diabaikan oleh platform. Lihat Atribut Build yang Dapat Dikonfigurasi untuk mengetahui detailnya.

Jika dua config_setting cocok dalam select yang sama, atribut ini tidak dipertimbangkan untuk tujuan menentukan apakah salah satu config_setting merupakan spesialisasi dari yang lainnya. Dengan kata lain, satu config_setting tidak boleh lebih cocok dengan platform lainnya.

define_values

Dictionary: String -> String; optional; nonconfigurable

Sama seperti values tetapi khusus untuk flag --define.

--define bersifat spesial karena sintaksisnya (--define KEY=VAL) berarti KEY=VAL adalah nilai dari perspektif flag Bazel.

Artinya:

            config_setting(
                name = "a_and_b",
                values = {
                    "define": "a=1",
                    "define": "b=2",
                })
          

tidak berfungsi karena tombol yang sama (define) muncul dua kali dalam kamus. Atribut ini mengatasi masalah tersebut:

            config_setting(
                name = "a_and_b",
                define_values = {
                    "a": "1",
                    "b": "2",
                })
          

cocok dengan bazel build //foo --define a=1 --define b=2.

--define masih dapat muncul di values dengan sintaksis flag normal, dan dapat bebas dicampur dengan atribut ini selama kunci kamus tetap berbeda.

flag_values

Dictionary: label -> String; optional; nonconfigurable

Sama seperti values, tetapi untuk flag build yang ditentukan pengguna.

Ini adalah atribut yang berbeda karena tanda yang ditentukan pengguna direferensikan sebagai label sementara tanda bawaan direferensikan sebagai string arbitrer.

values

Dictionary: String -> String; optional; nonconfigurable

Set nilai konfigurasi yang cocok dengan aturan ini (dinyatakan sebagai flag build)

Aturan ini mewarisi konfigurasi target yang dikonfigurasi dan mereferensikannya dalam pernyataan select. Hal ini dianggap "cocok" dengan pemanggilan Bazel jika, untuk setiap entri dalam kamus, konfigurasinya cocok dengan nilai entri yang diharapkan. Misalnya, values = {"compilation_mode": "opt"} cocok dengan pemanggilan bazel build --compilation_mode=opt ... dan bazel build -c opt ... pada aturan yang dikonfigurasi target.

Untuk memudahkan, nilai konfigurasi ditetapkan sebagai flag build (tanpa "--" sebelumnya). Namun, perlu diingat bahwa keduanya tidak sama. Hal ini karena target bisa dibuat dalam beberapa konfigurasi dalam build yang sama. Misalnya, "cpu" konfigurasi host cocok dengan nilai --host_cpu, bukan --cpu. Jadi, instance yang berbeda dari config_setting yang sama mungkin cocok dengan pemanggilan yang sama secara berbeda bergantung pada konfigurasi aturan yang menggunakannya.

Jika tanda tidak ditetapkan secara eksplisit pada command line, nilai defaultnya akan digunakan. Jika kunci muncul beberapa kali dalam kamus, hanya instance terakhir yang akan digunakan. Jika kunci mereferensikan tanda yang dapat ditetapkan beberapa kali pada command line (misalnya, bazel build --copt=foo --copt=bar --copt=baz ...), kecocokan akan terjadi jika salah satu setelan tersebut cocok.

grup file

filegroup(name, srcs, data, compatible_with, deprecation, distribs, features, licenses, output_group, restricted_to, tags, target_compatible_with, testonly, visibility)

Gunakan filegroup untuk memberikan nama yang mudah bagi kumpulan target. Aturan ini kemudian bisa dirujuk dari aturan lain.

Sebaiknya gunakan filegroup daripada mereferensikan direktori secara langsung. Situasi ini tidaklah baik karena sistem build tidak memiliki pengetahuan penuh tentang semua file di bawah direktori, sehingga sistem mungkin tidak akan mem-build ulang saat file ini berubah. Jika dikombinasikan dengan glob, filegroup dapat memastikan bahwa semua file secara eksplisit diketahui oleh sistem build.

Contoh

Untuk membuat filegroup yang terdiri dari dua file sumber, lakukan

filegroup(
    name = "mygroup",
    srcs = [
        "a_file.txt",
        "some/subdirectory/another_file.txt",
    ],
)

Atau, gunakan glob untuk menjelajahi direktori testdata:

filegroup(
    name = "exported_testdata",
    srcs = glob([
        "testdata/*.dat",
        "testdata/logs/**/*.log",
    ]),
)

Untuk menggunakan definisi ini, referensikan filegroup dengan label dari aturan apa pun:

cc_library(
    name = "my_library",
    srcs = ["foo.cc"],
    data = [
        "//my_package:exported_testdata",
        "//my_package:mygroup",
    ],
)

Argumen

Atribut
name

Name; required

Nama unik untuk target ini.

srcs

List of labels; optional

Daftar target yang merupakan anggota grup file.

Sangatlah umum untuk menggunakan hasil ekspresi glob untuk nilai atribut srcs.

data

List of labels; optional

Daftar file yang diperlukan oleh aturan ini pada runtime.

Target yang disebutkan dalam atribut data akan ditambahkan ke runfiles dari aturan filegroup ini. Saat filegroup direferensikan dalam atribut data aturan lain, runfiles-nya akan ditambahkan ke runfiles aturan yang bergantung. Lihat bagian dependensi data dan dokumentasi umum data untuk mengetahui informasi selengkapnya tentang cara bergantung pada dan menggunakan file data.

output_group

String; optional

Grup output tempat mengumpulkan artefak dari sumber. Jika atribut ini ditentukan, artefak dari grup output dependensi yang ditentukan akan diekspor, bukan grup output default.

"Grup output" adalah kategori artefak output target, yang ditetapkan dalam penerapan aturan tersebut.

kueri

genquery(name, deps, data, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, expression, features, licenses, opts, restricted_to, scope, strict, tags, target_compatible_with, testonly, visibility)

genquery() menjalankan kueri yang ditentukan dalam bahasa kueri Blaze dan memasukkan hasilnya ke dalam file.

Agar build tetap konsisten, kueri hanya diizinkan untuk mengunjungi penutupan transitif target yang ditentukan dalam atribut scope. Kueri yang melanggar aturan ini akan gagal selama eksekusi jika strict tidak ditentukan atau true (jika strict bernilai salah, target di luar cakupan akan dilewati dengan peringatan). Cara termudah untuk memastikan hal ini tidak terjadi adalah dengan menyebutkan label yang sama dalam cakupan seperti dalam ekspresi kueri.

Satu-satunya perbedaan antara kueri yang diizinkan di sini dan di command line adalah kueri yang berisi spesifikasi target karakter pengganti (misalnya //pkg:* atau //pkg:all) tidak diizinkan di sini. Alasannya ada dua kemungkinan: pertama, karena genquery harus menentukan cakupan untuk mencegah target di luar penutupan transitif kueri untuk memengaruhi output-nya; dan, kedua, karena file BUILD tidak mendukung dependensi karakter pengganti (misalnya, deps=["//a/..."] tidak diizinkan).

Output genquery diurutkan menggunakan --order_output=full untuk menerapkan output deterministik.

Nama file output adalah nama aturan.

Contoh

Contoh ini menulis daftar label dalam penutupan transitif target yang ditentukan ke file.

genquery(
    name = "kiwi-deps",
    expression = "deps(//kiwi:kiwi_lib)",
    scope = ["//kiwi:kiwi_lib"],
)

Argumen

Atribut
name

Name; required

Nama unik untuk target ini.

expression

String; required

Kueri yang akan dieksekusi. Berbeda dengan command line dan tempat lain di file BUILD, label di sini diselesaikan secara relatif terhadap direktori utama ruang kerja. Misalnya, label :b dalam atribut ini dalam file a/BUILD akan merujuk ke //:b target.
opts

List of strings; optional

Opsi yang diteruskan ke mesin kueri. Ini berkaitan dengan opsi command line yang dapat diteruskan ke bazel query. Beberapa opsi kueri tidak diizinkan di sini: --keep_going, --query_file, --universe_scope, --order_results, dan --order_output. Opsi yang tidak ditentukan di sini akan memiliki nilai defaultnya seperti pada command line bazel query.
scope

null; required

Cakupan kueri. Kueri tidak diizinkan untuk menyentuh target di luar penutupan transitif target tersebut.
strict

Boolean; optional; default is True

Jika true (benar), target yang kuerinya tidak ditutupi transitif cakupannya akan gagal di-build. Jika false, Bazel akan mencetak peringatan dan melewati jalur kueri apa pun yang membawanya ke luar cakupan, sambil menyelesaikan kueri lainnya.

Genrule

genrule(name, srcs, outs, cmd, cmd_bash, cmd_bat, cmd_ps, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, exec_tools, executable, features, licenses, local, message, output_licenses, output_to_bindir, restricted_to, tags, target_compatible_with, testonly, toolchains, tools, visibility)

genrule menghasilkan satu atau beberapa file menggunakan perintah Bash yang ditentukan pengguna.

Genrules adalah aturan build generik yang bisa Anda gunakan jika tidak ada aturan spesifik untuk tugas tersebut. Misalnya, Anda dapat menjalankan Bash satu baris. Namun, jika Anda perlu mengompilasi file C++, tetap ikuti aturan cc_* yang ada, karena semua tugas berat telah dilakukan untuk Anda.

Jangan gunakan genrule untuk menjalankan pengujian. Ada dispensasi khusus untuk pengujian dan hasil pengujian, termasuk kebijakan caching dan variabel lingkungan. Pengujian umumnya harus dijalankan setelah build selesai dan berada pada arsitektur target, sedangkan genrules dijalankan selama build dan pada arsitektur host (keduanya mungkin berbeda). Jika Anda memerlukan aturan pengujian tujuan umum, gunakan sh_test.

Pertimbangan Lintas Kompilasi

Lihat panduan pengguna untuk mengetahui info selengkapnya tentang kompilasi silang.

Meskipun genrules berjalan selama build, output-nya sering digunakan setelah build, untuk deployment atau pengujian. Pertimbangkan contoh kompilasi kode C untuk mikrokontroler: compiler menerima file sumber C dan menghasilkan kode yang berjalan pada mikrokontroler. Kode yang dihasilkan jelas tidak dapat dijalankan pada CPU yang digunakan untuk mem-build-nya, tetapi compiler C (jika dikompilasi dari sumber) sendiri harus melakukannya.

Sistem build menggunakan konfigurasi host untuk mendeskripsikan mesin tempat build berjalan, dan konfigurasi target untuk mendeskripsikan mesin tempat output build seharusnya dijalankan. API ini menyediakan opsi untuk mengonfigurasi setiap hal tersebut dan memisahkan file terkait ke dalam direktori terpisah untuk menghindari konflik.

Untuk genrules, sistem build memastikan bahwa dependensi dibuat dengan tepat: srcs dibuat (jika perlu) untuk konfigurasi target, tools dibuat untuk konfigurasi host, dan output dianggap untuk konfigurasi target. Class ini juga menyediakan variabel "Make" yang dapat diteruskan oleh perintah genrule ke alat terkait.

genrule dimaksudkan untuk tidak menentukan atribut deps: aturan bawaan lainnya menggunakan informasi meta yang bergantung pada bahasa yang diteruskan di antara aturan untuk otomatis menentukan cara menangani aturan dependen, tetapi tingkat otomatisasi ini tidak memungkinkan untuk genrules. Genrules hanya berfungsi di level file dan runfile.

Kasus Khusus

Kompilasi host-host: dalam beberapa kasus, sistem build perlu menjalankan genrules sehingga output juga dapat dijalankan selama proses build. Misalnya, jika genrule mem-build beberapa compiler kustom yang kemudian digunakan oleh genrule lain, yang pertama harus menghasilkan output-nya untuk konfigurasi host, karena di situlah compiler akan berjalan dalam genrule lainnya. Dalam hal ini, sistem build melakukan hal yang benar secara otomatis: sistem mem-build srcs dan outs dari genrule pertama untuk konfigurasi host, bukan konfigurasi target. Lihat panduan pengguna untuk info selengkapnya.

Tooling JDK & C++: untuk menggunakan alat dari JDK atau compiler C++, sistem build menyediakan satu set variabel untuk digunakan. Lihat variabel"Membuat" untuk mengetahui detailnya.

Lingkungan Genrule

Perintah genrule dijalankan oleh shell Bash yang dikonfigurasi agar gagal jika perintah atau pipeline gagal menggunakan set -e -o pipefail.

Alat build menjalankan perintah Bash di lingkungan proses yang bersih yang hanya menentukan variabel inti seperti PATH, PWD, TMPDIR, dan beberapa variabel lainnya. Untuk memastikan bahwa build dapat direproduksi, sebagian besar variabel yang ditentukan dalam lingkungan shell pengguna tidak diteruskan ke perintah genrule. Namun, Bazel (tetapi tidak Blaze) akan meneruskan nilai variabel lingkungan PATH pengguna. Setiap perubahan pada nilai PATH akan menyebabkan Bazel menjalankan kembali perintah pada build berikutnya.

Perintah genrule tidak boleh mengakses jaringan kecuali untuk menghubungkan proses yang merupakan turunan dari perintah itu sendiri, meskipun hal ini saat ini tidak diberlakukan.

Sistem build akan otomatis menghapus file output yang ada, tetapi membuat direktori induk yang diperlukan sebelum menjalankan genrule. Juga menghapus file {i>output<i} jika terjadi kegagalan.

Saran Umum

  • Pastikan bahwa alat yang dijalankan oleh genrule bersifat deterministik dan hermetis. Anotasi tidak boleh menulis stempel waktu ke output, dan harus menggunakan pengurutan yang stabil untuk set dan peta, serta hanya menulis jalur file relatif ke output, tanpa jalur absolut. Tidak mengikuti aturan ini akan menyebabkan perilaku build yang tidak terduga (Bazel tidak mem-build kembali genrule yang Anda kira akan) dan menurunkan performa cache.
  • Gunakan $(location) secara ekstensif, untuk output, alat, dan sumber. Karena pemisahan file output untuk konfigurasi yang berbeda, genrules tidak dapat mengandalkan jalur hard code dan/atau absolut.
  • Tulis makro Starlark umum jika genrules yang sama atau sangat mirip digunakan di beberapa tempat. Jika genrule-nya rumit, pertimbangkan untuk menerapkannya dalam skrip atau sebagai aturan Starlark. Hal ini meningkatkan keterbacaan serta kemudahan pengujian.
  • Pastikan bahwa kode keluar menunjukkan keberhasilan atau kegagalan genrule dengan benar.
  • Jangan menulis pesan informasi ke stdout atau stderr. Meskipun berguna untuk proses debug, genrule yang berhasil harus disenyapkan dengan mudah. Di sisi lain, genaturan yang gagal akan memunculkan pesan error yang baik.
  • $$ evaluates to a $, a literal dollar-sign, so in order to invoke a shell command containing dollar-signs such as ls $(dirname $x), one must escape it thus: ls $$(dirname $$x).
  • Hindari membuat symlink dan direktori. Bazel tidak menyalin struktur direktori/symlink yang dibuat oleh genrules, dan pemeriksaan dependensinya terhadap direktori tidak berjalan lancar.
  • Saat mereferensikan genrule di aturan lain, Anda dapat menggunakan label genrule atau label setiap file output. Terkadang pendekatan yang satu lebih mudah dibaca, terkadang pendekatan yang lain: mereferensikan output berdasarkan nama dalam srcs aturan yang menggunakan akan mencegah pengambilan output lain dari genrule secara tidak sengaja, tetapi dapat merepotkan jika genrule menghasilkan banyak output.

Contoh

Contoh ini menghasilkan foo.h. Tidak ada sumber, karena perintah ini tidak mengambil input apa pun. "Biner" yang dijalankan oleh perintah adalah skrip perl dalam paket yang sama dengan genrule.

genrule(
    name = "foo",
    srcs = [],
    outs = ["foo.h"],
    cmd = "./$(location create_foo.pl) > \"$@\"",
    tools = ["create_foo.pl"],
)

Contoh berikut menunjukkan cara menggunakan filegroup dan output genrule lain. Perhatikan bahwa penggunaan $(SRCS), bukan perintah $(location) eksplisit, juga akan berfungsi; contoh ini menggunakan perintah terakhir untuk demonstrasi.

genrule(
    name = "concat_all_files",
    srcs = [
        "//some:files",  # a filegroup with multiple files in it ==> $(locations)
        "//other:gen",   # a genrule with a single output ==> $(location)
    ],
    outs = ["concatenated.txt"],
    cmd = "cat $(locations //some:files) $(location //other:gen) > $@",
)

Argumen

Atribut
name

Name; required

Nama unik untuk target ini.


Anda dapat merujuk ke aturan ini berdasarkan namanya di bagian srcs atau deps pada aturan BUILD lainnya. Jika aturan menghasilkan file sumber, Anda harus menggunakan atribut srcs.
srcs

List of labels; optional

Daftar input untuk aturan ini, seperti file sumber yang akan diproses.

Atribut ini tidak cocok untuk mencantumkan alat yang dijalankan oleh cmd; sebagai gantinya, gunakan atribut tools untuk alat tersebut.

Sistem build memastikan prasyarat ini dibangun sebelum menjalankan perintah genrule; prasyarat tersebut dibangun menggunakan konfigurasi yang sama dengan permintaan build asli. Nama file prasyarat ini tersedia untuk perintah sebagai daftar yang dipisahkan spasi di $(SRCS); atau, jalur individu srcs target //x:y dapat diperoleh menggunakan $(location //x:y), atau menggunakan $< asalkan itu adalah satu-satunya entri di srcs.

outs

List of filenames; required; nonconfigurable

Daftar file yang dibuat oleh aturan ini.

File output tidak boleh melewati batas paket. Nama file output ditafsirkan sebagai relatif terhadap paket.

Jika flag executable ditetapkan, outs harus berisi tepat satu label.

Perintah genrule diharapkan akan membuat setiap file output di lokasi yang telah ditentukan. Lokasi tersedia di cmd menggunakan variabel "Make" khusus genrule ($@, $(OUTS), $(@D), atau $(RULEDIR)) atau menggunakan substitusi $(location).

cmd

String; optional

Perintah untuk dijalankan. Tunduk pada penggantian $(location) dan variabel"Buat".
  1. Penggantian $(location) pertama diterapkan, yang menggantikan semua kemunculan $(location label) dan $(locations label) (dan konstruksi serupa menggunakan variabel terkait execpath, execpaths, rootpath, dan rootpaths).
  2. Selanjutnya, Variabel"Make" diperluas. Perhatikan bahwa variabel yang telah ditetapkan $(JAVA), $(JAVAC), dan $(JAVABASE) akan diperluas dalam konfigurasi host, sehingga pemanggilan Java yang berjalan sebagai bagian dari langkah build dapat memuat library bersama dan dependensi lainnya dengan benar.
  3. Terakhir, perintah yang dihasilkan dijalankan menggunakan {i>shell Bash<i}. Jika kode keluarnya bukan nol, perintah tersebut dianggap gagal.
Ini adalah penggantian dari cmd_bash, cmd_ps, dan cmd_bat, jika tidak ada yang berlaku.

Jika panjang command line melebihi batas platform (64K di Linux/macOS, 8K di Windows), genrule akan menulis perintah ke skrip dan menjalankan skrip tersebut untuk mengatasi masalah. Ini berlaku untuk semua atribut cmd (cmd, cmd_bash, cmd_ps, cmd_bat).

cmd_bash

String; optional

Perintah{i> Bash<i} untuk dijalankan.

Atribut ini memiliki prioritas lebih tinggi daripada cmd. Perintah ini diperluas dan berjalan dengan cara yang sama persis seperti atribut cmd.

cmd_bat

String; optional

Perintah Batch untuk dijalankan di Windows.

Atribut ini memiliki prioritas lebih tinggi daripada cmd dan cmd_bash. Perintah berjalan dengan cara yang mirip dengan atribut cmd, dengan perbedaan berikut:

  • Atribut ini hanya berlaku di Windows.
  • Perintah ini dijalankan dengan cmd.exe /c dengan argumen default berikut:
    • /S - hapus tanda kutip pertama dan terakhir lalu jalankan yang lainnya sebagaimana adanya.
    • /E:ON - mengaktifkan set perintah yang diperluas.
    • /V:ON - mengaktifkan perluasan variabel tertunda
    • /D - mengabaikan entri registry AutoRun.
  • Setelah penggantian $(location) dan variabel"Make", jalur akan diperluas ke jalur gaya Windows (dengan garis miring terbalik).
cmd_ps

String; optional

Perintah Powershell untuk dijalankan di Windows.

Atribut ini memiliki prioritas lebih tinggi daripada cmd, cmd_bash, dan cmd_bat. Perintah berjalan dengan cara yang sama seperti atribut cmd, dengan perbedaan berikut:

  • Atribut ini hanya berlaku di Windows.
  • Perintah dijalankan dengan powershell.exe /c.

Agar Powershell lebih mudah digunakan dan tidak rentan terhadap error, kami menjalankan perintah berikut untuk menyiapkan lingkungan sebelum menjalankan perintah Powershell dalam genrule.

  • Set-ExecutionPolicy -Scope CurrentUser RemoteSigned - memungkinkan menjalankan skrip yang tidak ditandatangani.
  • $errorActionPreference='Stop' - Jika ada beberapa perintah yang dipisahkan oleh ;, tindakan akan langsung keluar jika CmdLet Powershell gagal, tetapi hal ini TIDAK berfungsi untuk perintah eksternal.
  • $PSDefaultParameterValues['*:Encoding'] = 'utf8' - ubah encoding default dari utf-16 menjadi utf-8.
exec_tools

List of labels; optional

Daftar dependensi tool untuk aturan ini. Perilaku ini sama persis dengan atribut tools, hanya saja dependensi ini akan dikonfigurasi untuk platform eksekusi aturan, bukan konfigurasi host. Ini berarti dependensi dalam exec_tools tidak tunduk pada batasan yang sama dengan dependensi dalam tools. Secara khusus, klien tidak diharuskan menggunakan konfigurasi host untuk dependensi transitifnya sendiri. Lihat tools untuk detail selengkapnya.

Tim Blaze memigrasikan semua penggunaan tools untuk menggunakan semantik exec_tools. Pengguna sebaiknya memilih exec_tools daripada tools jika hal ini tidak menimbulkan masalah apa pun. Setelah migrasi fungsional selesai, kami dapat mengganti nama exec_tools menjadi tools. Anda akan menerima peringatan penghentian penggunaan dan petunjuk migrasi sebelum hal ini terjadi.

executable

Boolean; optional; nonconfigurable; default is False

Mendeklarasikan output agar dapat dieksekusi.

Jika tanda ini disetel ke Benar (True), output-nya adalah file yang dapat dieksekusi dan dapat dijalankan menggunakan perintah run. Dalam kasus ini, genrule harus menghasilkan tepat satu output. Jika atribut ini ditetapkan, run akan mencoba mengeksekusi file, apa pun kontennya.

Mendeklarasikan dependensi data untuk file yang dapat dieksekusi yang dihasilkan tidak didukung.

local

Boolean; optional; default is False

Jika disetel ke Benar (True), opsi ini akan memaksa genrule ini berjalan menggunakan strategi "lokal", yang berarti tidak ada eksekusi jarak jauh, tidak ada sandbox, dan tidak ada pekerja persisten.

Hal ini sama dengan memberikan 'local' sebagai tag (tags=["local"]).

message

String; optional

Pesan progres.

Pesan progres yang akan dicetak saat langkah build ini dieksekusi. Secara default, pesannya adalah "Menghasilkan output" (atau sesuatu yang sama hampa) tetapi Anda dapat memberikan yang lebih spesifik. Gunakan atribut ini sebagai ganti echo atau pernyataan cetak lainnya dalam perintah cmd Anda, karena hal ini memungkinkan alat build mengontrol apakah pesan progres tersebut akan dicetak atau tidak.

output_licenses

Licence type; optional

Lihat common attributes
output_to_bindir

Boolean; optional; nonconfigurable; default is False

Jika disetel ke Benar (True), opsi ini akan menyebabkan file output ditulis ke direktori bin, bukan direktori genfiles.

tools

List of labels; optional

Daftar dependensi tool untuk aturan ini. Lihat definisi dependensi untuk informasi selengkapnya.

Sistem build memastikan prasyarat ini dibangun sebelum menjalankan perintah genrule; prasyarat tersebut dibuat menggunakan konfigurasi host, karena alat ini dijalankan sebagai bagian dari build. Jalur //x:y target tools individual dapat diperoleh menggunakan $(location //x:y).

Setiap *_binary atau alat yang akan dijalankan oleh cmd harus muncul dalam daftar ini, bukan di srcs, untuk memastikan keduanya di-build dalam konfigurasi yang benar.

test_suite

test_suite(name, compatible_with, deprecation, distribs, features, licenses, restricted_to, tags, target_compatible_with, testonly, tests, visibility)

test_suite menentukan serangkaian pengujian yang dianggap "berguna" bagi manusia. Hal ini memungkinkan project menentukan rangkaian pengujian, seperti "pengujian yang harus Anda jalankan sebelum checkin", "pengujian stress project kami", atau "semua pengujian kecil". Perintah blaze test mengikuti organisasi semacam ini: Untuk pemanggilan seperti blaze test //some/test:suite, Blaze akan terlebih dahulu menghitung semua target pengujian yang disertakan secara transitif yang disertakan oleh target //some/test:suite (kami menyebut ini "test_suite development"), lalu Blaze mem-build dan menguji target tersebut.

Contoh

Test suite untuk menjalankan semua pengujian kecil dalam paket saat ini.

test_suite(
    name = "small_tests",
    tags = ["small"],
)

Test suite yang menjalankan serangkaian pengujian tertentu:

test_suite(
    name = "smoke_tests",
    tests = [
        "system_unittest",
        "public_api_unittest",
    ],
)

Test suite untuk menjalankan semua pengujian dalam paket saat ini yang tidak tidak stabil.

test_suite(
    name = "non_flaky_test",
    tags = ["-flaky"],
)

Argumen

Atribut
name

Name; required

Nama unik untuk target ini.

tags

List of strings; optional; nonconfigurable

Daftar tag teks seperti "small" atau "database" atau "-flaky". Tag dapat berupa string yang valid.

Tag yang diawali dengan karakter "-" dianggap sebagai tag negatif. Karakter "-" sebelumnya tidak dianggap sebagai bagian dari tag, sehingga tag suite "-small" cocok dengan ukuran "small" pengujian. Semua tag lainnya dianggap sebagai tag positif.

Secara opsional, untuk menjadikan tag positif lebih eksplisit, tag juga dapat diawali dengan karakter "+", yang tidak akan dievaluasi sebagai bagian dari teks tag. Pola ini hanya membuat perbedaan positif dan negatif lebih mudah dibaca.

Hanya aturan pengujian yang cocok dengan semua tag positif dan tidak ada tag negatif yang akan disertakan dalam rangkaian pengujian. Perlu diperhatikan bahwa ini tidak berarti error saat memeriksa dependensi pada pengujian yang difilter akan dilewatkan; dependensi pada pengujian yang dilewati masih harus sah (misalnya, tidak diblokir oleh batasan visibilitas).

Kata kunci tag manual diperlakukan secara berbeda dengan yang di atas oleh "ekspansi test_suite" yang dilakukan oleh perintah blaze test pada pemanggilan yang melibatkan pola target karakter pengganti. Di sana, target test_suite yang diberi tag "manual" difilter (sehingga tidak diperluas). Perilaku ini konsisten dengan cara blaze build dan blaze test menangani pola target karakter pengganti secara umum. Perhatikan bahwa hal ini secara eksplisit berbeda dengan perilaku blaze query 'tests(E)', karena suite selalu diperluas oleh fungsi kueri tests, terlepas dari tag manual.

Perhatikan bahwa size pengujian dianggap sebagai tag untuk tujuan pemfilteran.

Jika Anda memerlukan test_suite yang berisi pengujian dengan tag yang sama-sama eksklusif (misalnya semua pengujian kecil dan menengah), Anda harus membuat tiga aturan test_suite: satu untuk semua pengujian kecil, satu untuk semua pengujian sedang, dan satu yang menyertakan dua pengujian sebelumnya.

tests

List of labels; optional; nonconfigurable

Daftar rangkaian pengujian dan target pengujian untuk bahasa apa pun.

Semua *_test diterima di sini, apa pun bahasanya. Namun, tidak ada target *_binary yang diterima, meskipun target tersebut menjalankan pengujian. Pemfilteran berdasarkan tags yang ditentukan hanya dilakukan untuk pengujian yang tercantum secara langsung dalam atribut ini. Jika atribut ini berisi test_suite, pengujian di dalamnya tidak akan difilter oleh test_suite ini (pengujian tersebut dianggap sudah difilter).

Jika atribut tests tidak ditentukan atau kosong, secara default aturan akan menyertakan semua aturan pengujian dalam file BUILD saat ini yang tidak diberi tag sebagai manual. Aturan tersebut tetap tunduk kepada pemfilteran tag.