Aturan Umum

Laporkan masalah Lihat sumber Nightly · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

Aturan

alias

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

Aturan alias membuat nama lain yang dapat digunakan untuk merujuk ke suatu aturan.

Pembuatan alias hanya berfungsi untuk target "reguler". Khususnya, package_group dan test_suite tidak dapat diberi alias.

Pembuatan alias dapat membantu di repositori besar tempat penggantian nama target akan memerlukan perubahan pada banyak file. Anda juga dapat menggunakan aturan alias untuk menyimpan panggilan fungsi select jika ingin menggunakan kembali logika tersebut untuk beberapa target.

Aturan alias memiliki deklarasi visibilitasnya sendiri. Dalam semua hal lainnya, alias ini berperilaku seperti aturan yang dirujuknya (misalnya, testonly di alias diabaikan; testonly dari aturan yang dirujuk digunakan sebagai gantinya) dengan beberapa pengecualian kecil:

  • Pengujian tidak dijalankan jika aliasnya disebutkan di command line. Untuk menentukan alias yang menjalankan pengujian yang dirujuk, gunakan aturan test_suite dengan satu target dalam atribut tests-nya.
  • Saat menentukan grup lingkungan, alias ke aturan environment tidak didukung. Opsi ini juga tidak didukung di opsi command line --target_environment.

Contoh

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

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

Argumen

Atribut
name

Nama; wajib

Nama unik untuk target ini.

actual

Label; wajib

Target yang dirujuk oleh alias ini. Tidak harus berupa aturan, tetapi juga bisa berupa file input.

config_setting

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

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

Contoh

Berikut adalah build yang cocok dengan build apa pun yang menyetel --compilation_mode=opt atau -c opt (baik secara eksplisit di command line atau secara implisit dari file .bazelrc):

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

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

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

Berikut ini cocok dengan build apa pun yang menetapkan flag yang ditentukan pengguna --//custom_flags:foo=1 (baik secara eksplisit di command line atau secara implisit dari file .bazelrc):

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

Berikut 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 kedua nilai ini.

  config_setting(
      name = "64bit_glibc_2_25",
      constraint_values = [
          "@platforms//cpu:x86_64",
          "//example:glibc_2_25",
      ]
  )
  
Dalam semua kasus ini, konfigurasi dapat berubah dalam build, misalnya jika target perlu dibangun untuk platform yang berbeda dengan dep-nya. Artinya, meskipun config_setting tidak cocok dengan flag command line tingkat teratas, config_setting tersebut mungkin masih cocok dengan beberapa target build.

Catatan

  • Lihat select untuk mengetahui apa yang terjadi saat beberapa config_setting cocok dengan status konfigurasi saat ini.
  • Untuk tanda yang mendukung bentuk singkat (misalnya, --compilation_mode vs. -c), definisi values harus menggunakan bentuk lengkap. Panggilan ini secara otomatis cocok menggunakan salah satu bentuk.
  • Jika tanda memiliki beberapa nilai (seperti --copt=-Da --copt=-Db atau tanda Starlark berjenis daftar), values = { "flag": "a" } cocok jika "a" ada di mana saja 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 di antara flag. Misalnya, --copt tidak mendukung beberapa nilai dalam instance yang sama: --copt=a,b menghasilkan ["a,b"], sedangkan --copt=a --copt=b menghasilkan ["a", "b"] (sehingga values = { "copt": "a,b" } cocok dengan yang pertama, tetapi tidak dengan yang terakhir). Namun, --ios_multi_cpus (untuk aturan Apple) melakukannya: -ios_multi_cpus=a,b dan ios_multi_cpus=a --ios_multi_cpus=b menghasilkan ["a", "b"]. Periksa definisi tanda 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 dukungan yang ditawarkan lebih lemah dan tidak direkomendasikan. Lihat di sini untuk diskusi selengkapnya.
  • Hindari pengulangan definisi config_setting yang identik dalam paket yang berbeda. Sebagai gantinya, rujuk config_setting umum yang ditentukan dalam paket kanonis.
  • values, define_values, dan constraint_values dapat digunakan dalam kombinasi apa pun di config_setting yang sama, tetapi setidaknya satu harus ditetapkan untuk config_setting tertentu.

Argumen

Atribut
name

Nama; wajib

Nama unik untuk target ini.

constraint_values

Daftar label; tidak dapat dikonfigurasi; defaultnya adalah []

Kumpulan minimum constraint_values yang harus ditentukan oleh platform target agar cocok dengan config_setting ini. (Platform eksekusi tidak dipertimbangkan di sini.) Nilai batasan tambahan yang dimiliki platform akan diabaikan. 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 adalah spesialisasi dari config_setting lainnya. Dengan kata lain, satu config_setting tidak dapat mencocokkan platform lebih kuat daripada yang lain.

define_values

Dictionary: String -> String; nonconfigurable; default adalah {}

Sama seperti values, tetapi khusus untuk tanda --define.

--define bersifat khusus 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 kunci 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 benar bazel build //foo --define a=1 --define b=2.

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

flag_values

Kamus: label -> String; nonconfigurable; default adalah {}

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

Ini adalah atribut yang berbeda karena tanda yang ditentukan pengguna dirujuk sebagai label, sedangkan tanda bawaan dirujuk sebagai string arbitrer.

values

Dictionary: String -> String; nonconfigurable; default adalah {}

Kumpulan nilai konfigurasi yang cocok dengan aturan ini (dinyatakan sebagai tanda build)

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

Untuk mempermudah, nilai konfigurasi ditentukan sebagai tanda build (tanpa "--" di depannya). Namun, perlu diingat bahwa keduanya tidak sama. Hal ini karena target dapat dibuat dalam beberapa konfigurasi dalam build yang sama. Misalnya, "cpu" konfigurasi exec cocok dengan nilai --host_cpu, bukan --cpu. Jadi, berbagai instance config_setting yang sama dapat mencocokkan pemanggilan yang sama secara berbeda bergantung pada konfigurasi aturan yang menggunakannya.

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

filegroup

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

Gunakan filegroup untuk memberi nama yang mudah diingat pada kumpulan target. Kemudian, hal ini dapat dirujuk dari aturan lain.

Sebaiknya gunakan filegroup, bukan mereferensikan direktori secara langsung. Yang terakhir tidak valid karena sistem build tidak memiliki pengetahuan lengkap tentang semua file di bawah direktori, sehingga mungkin tidak membangun ulang saat file ini berubah. Jika digabungkan dengan glob, filegroup dapat memastikan bahwa semua file diketahui secara eksplisit 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 mencari direktori testdata:

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

Untuk menggunakan definisi ini, lihat 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

Nama; wajib

Nama unik untuk target ini.

srcs

Daftar label; defaultnya adalah []

Daftar target yang merupakan anggota grup file.

Umumnya, hasil ekspresi glob digunakan untuk nilai atribut srcs.

data

Daftar label; defaultnya adalah []

Daftar file yang diperlukan oleh aturan ini saat runtime.

Target yang disebutkan dalam atribut data akan ditambahkan ke runfiles aturan filegroup ini. Jika filegroup dirujuk dalam atribut data dari 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; default-nya adalah ""

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

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

genquery

Lihat sumber aturan
genquery(name, deps, data, compatible_with, compressed_output, 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 mengekspor hasilnya ke dalam file.

Untuk menjaga konsistensi build, 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 benar (jika strict salah (false), target di luar cakupan hanya 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. Ada dua alasan untuk hal ini: pertama, karena genquery harus menentukan cakupan untuk mencegah target di luar penutupan transitif kueri memengaruhi outputnya; dan, kedua, karena file BUILD tidak mendukung dependensi karakter pengganti (misalnya, deps=["//a/..."] tidak diizinkan).

Output genquery diurutkan secara leksikografis untuk memastikan output yang deterministik, kecuali --output=graph|minrank|maxrank atau saat somepath digunakan sebagai fungsi tingkat teratas.

Nama file output adalah nama aturan.

Contoh

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

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

Argumen

Atribut
name

Nama; wajib

Nama unik untuk target ini.

compressed_output

Boolean; defaultnya adalah False

Jika True, output kueri ditulis dalam format file GZIP. Setelan ini dapat digunakan untuk menghindari lonjakan penggunaan memori Bazel saat output kueri diperkirakan berukuran besar. Bazel sudah secara internal mengompresi output kueri yang lebih besar dari 220 byte, terlepas dari nilai setelan ini, sehingga menyetelnya ke True mungkin tidak mengurangi heap yang dipertahankan. Namun, hal ini memungkinkan Bazel melewati dekompresi saat menulis file output, yang dapat menggunakan banyak memori.
expression

String; wajib

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

Daftar string; defaultnya adalah []

Opsi yang diteruskan ke mesin kueri. Opsi ini sesuai 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 default seperti pada command line bazel query.
scope

Daftar label; wajib diisi

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

Boolean; defaultnya adalah True

Jika benar, target yang kuerinya keluar dari penutupan transitif cakupannya akan gagal dibuat. Jika salah (false), Bazel akan mencetak peringatan dan melewati jalur kueri apa pun yang membawanya ke luar cakupan, sekaligus menyelesaikan kueri lainnya.

genrule

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

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

Genrule adalah aturan build generik yang dapat Anda gunakan jika tidak ada aturan khusus untuk tugas tersebut. Misalnya, Anda dapat menjalankan perintah Bash satu baris. Namun, jika Anda perlu mengompilasi file C++, tetaplah menggunakan aturan cc_* yang ada, karena semua pekerjaan berat telah dilakukan untuk Anda.

Perhatikan bahwa genrule memerlukan shell untuk menafsirkan argumen perintah. Program arbitrer yang tersedia di PATH juga mudah dirujuk, tetapi hal ini membuat perintah tidak hermetik dan mungkin tidak dapat direproduksi. Jika Anda hanya perlu menjalankan satu alat, sebaiknya gunakan run_binary saja.

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

Pertimbangan Kompilasi Silang

Lihat panduan pengguna untuk mengetahui info selengkapnya tentang kompilasi silang.

Meskipun genrule berjalan selama build, outputnya sering digunakan setelah build, untuk deployment atau pengujian. Pertimbangkan contoh mengompilasi kode C untuk pengontrol mikro: compiler menerima file sumber C dan menghasilkan kode yang berjalan di pengontrol mikro. Kode yang dihasilkan jelas tidak dapat berjalan di CPU yang digunakan untuk membangunnya, tetapi compiler C (jika dikompilasi dari sumber) itu sendiri harus dapat berjalan.

Sistem build menggunakan konfigurasi exec untuk mendeskripsikan mesin tempat build berjalan dan konfigurasi target untuk mendeskripsikan mesin tempat output build seharusnya berjalan. Plugin ini menyediakan opsi untuk mengonfigurasi setiap file tersebut dan memisahkan file yang sesuai ke dalam direktori terpisah untuk menghindari konflik.

Untuk genrules, sistem build memastikan bahwa dependensi dibangun dengan tepat: srcs dibangun (jika perlu) untuk konfigurasi target, tools dibangun untuk konfigurasi exec, dan output dianggap untuk konfigurasi target. Selain itu, alat ini menyediakan variabel "Make" yang dapat diteruskan perintah genrule ke alat yang sesuai.

Genrule sengaja tidak menentukan atribut deps: aturan bawaan lainnya menggunakan informasi meta yang bergantung pada bahasa yang diteruskan antar-aturan untuk otomatis menentukan cara menangani aturan dependen, tetapi tingkat otomatisasi ini tidak mungkin dilakukan untuk genrule. Genrules bekerja murni di tingkat file dan runfiles.

Kasus Khusus

Kompilasi exec-exec: dalam beberapa kasus, sistem build perlu menjalankan genrule sehingga output juga dapat dieksekusi selama build. Misalnya, jika genrule membuat beberapa compiler kustom yang selanjutnya digunakan oleh genrule lain, genrule pertama harus menghasilkan outputnya untuk konfigurasi exec, karena di situlah compiler akan berjalan di genrule lain. Dalam hal ini, sistem build akan melakukan hal yang benar secara otomatis: sistem akan mem-build srcs dan outs genrule pertama untuk konfigurasi exec, bukan konfigurasi target. Lihat panduan pengguna untuk mengetahui info selengkapnya.

JDK & Alat C++: untuk menggunakan alat dari JDK atau rangkaian compiler C++, sistem build menyediakan serangkaian variabel yang dapat digunakan. Lihat variabel"Make" untuk mengetahui detailnya.

Lingkungan Genrule

Perintah genrule dieksekusi oleh shell Bash yang dikonfigurasi agar gagal saat perintah atau pipeline gagal, menggunakan set -e -o pipefail.

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

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

Sistem build akan otomatis menghapus file output yang ada, tetapi membuat direktori induk yang diperlukan sebelum menjalankan genrule. Tindakan ini juga menghapus semua file output jika terjadi kegagalan.

Saran Umum

  • Pastikan alat yang dijalankan oleh genrule bersifat deterministik dan hermetik. Mereka tidak boleh menulis stempel waktu ke output, dan mereka harus menggunakan pengurutan yang stabil untuk set dan peta, serta menulis hanya jalur file relatif ke output, bukan jalur absolut. Tidak mengikuti aturan ini akan menyebabkan perilaku build yang tidak terduga (Bazel tidak membangun ulang genrule yang Anda kira akan dibangun ulang) 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 absolut dan/atau yang di-hardcode.
  • Tulis makro Starlark umum jika genrule yang sama atau sangat mirip digunakan di beberapa tempat. Jika genrule kompleks, pertimbangkan untuk menerapkannya dalam skrip atau sebagai aturan Starlark. Hal ini meningkatkan keterbacaan serta kemudahan pengujian.
  • Pastikan kode keluar menunjukkan keberhasilan atau kegagalan genrule dengan benar.
  • Jangan menulis pesan informasi ke stdout atau stderr. Meskipun berguna untuk proses debug, hal ini dapat dengan mudah menjadi gangguan; genrule yang berhasil tidak akan menampilkan output. Di sisi lain, genrule yang gagal harus 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/link simbolis yang dibuat oleh genrules dan pemeriksaan dependensi direktorinya tidak valid.
  • Saat mereferensikan genrule dalam aturan lain, Anda dapat menggunakan label genrule atau label file output individual. Terkadang satu pendekatan lebih mudah dibaca, terkadang pendekatan lainnya: mereferensikan output berdasarkan nama dalam srcs aturan yang menggunakan akan menghindari output genrule lain yang tidak disengaja, tetapi bisa membosankan jika genrule menghasilkan banyak output.

Contoh

Contoh ini menghasilkan foo.h. Tidak ada sumber, karena perintah tidak menerima 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 lainnya. Perhatikan bahwa penggunaan $(SRCS), bukan direktif $(location) eksplisit juga akan berfungsi; contoh ini menggunakan direktif $(location) untuk tujuan 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

Nama; wajib

Nama unik untuk target ini.


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

Daftar label; defaultnya adalah []

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

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

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

outs

Daftar nama file; tidak dapat dikonfigurasi; wajib

Daftar file yang dihasilkan oleh aturan ini.

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

Jika tanda executable disetel, outs harus berisi tepat satu label.

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

cmd

String; default-nya adalah ""

Perintah yang akan dijalankan. Tunduk pada substitusi variabel $(location) dan "Make".
  1. Substitusi $(location) pertama diterapkan, menggantikan semua kemunculan $(location label) dan $(locations label) (serta konstruksi serupa menggunakan variabel terkait execpath, execpaths, rootpath, dan rootpaths).
  2. Selanjutnya, variabel"Make" diperluas. Perhatikan bahwa variabel yang telah ditentukan sebelumnya $(JAVA), $(JAVAC), dan $(JAVABASE) diperluas dalam konfigurasi exec, 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 shell Bash. Jika kode keluarnya bukan nol, perintah dianggap gagal.
Ini adalah penggantian cmd_bash, cmd_ps, dan cmd_bat, jika tidak ada yang berlaku.

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

cmd_bash

String; default-nya adalah ""

Perintah Bash yang akan dijalankan.

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

cmd_bat

String; default-nya adalah ""

Perintah Batch yang akan dijalankan di Windows.

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

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

String; default-nya adalah ""

Perintah Powershell yang akan dijalankan di Windows.

Atribut ini memiliki prioritas yang lebih tinggi daripada cmd, cmd_bash, dan cmd_bat. Perintah ini 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, kita menjalankan perintah berikut untuk menyiapkan lingkungan sebelum menjalankan perintah Powershell di genrule.

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

Boolean; tidak dapat dikonfigurasi; defaultnya adalah False

Nyatakan output dapat dieksekusi.

Menetapkan tanda ini ke True berarti outputnya 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 menjalankan file terlepas dari isinya.

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

local

Boolean; defaultnya adalah 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.

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

message

String; default-nya adalah ""

Pesan progres.

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

output_licenses

Jenis lisensi; defaultnya adalah ["none"]

Lihat common attributes
output_to_bindir

Boolean; tidak dapat dikonfigurasi; defaultnya adalah False

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

tools

Daftar label; defaultnya adalah []

Daftar dependensi alat untuk aturan ini. Lihat definisi dependensi untuk mengetahui informasi selengkapnya.

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

*_binary atau alat apa pun yang akan dieksekusi oleh cmd harus muncul dalam daftar ini, bukan di srcs, untuk memastikan alat tersebut dibangun dalam konfigurasi yang benar.

starlark_doc_extract

Lihat sumber aturan
starlark_doc_extract(name, deps, src, data, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, licenses, render_main_repo_name, restricted_to, symbol_names, tags, target_compatible_with, testonly, visibility)

starlark_doc_extract() mengekstrak dokumentasi untuk aturan, fungsi (termasuk makro), aspek, dan penyedia yang ditentukan atau diekspor ulang dalam file .bzl atau .scl tertentu. Output aturan ini adalah proto biner ModuleInfo seperti yang ditentukan dalam stardoc_output.proto di hierarki sumber Bazel.

Target output implisit

  • name.binaryproto (output default): A ModuleInfo binary proto.
  • name.textproto (hanya dibuat jika diminta secara eksplisit): versi proto teks name.binaryproto.

Peringatan: format output aturan ini tidak dijamin stabil. Terutama ditujukan untuk penggunaan internal oleh Stardoc.

Argumen

Atribut
name

Nama; wajib

Nama unik untuk target ini.

deps

Daftar label; defaultnya adalah []

Daftar target yang membungkus file Starlark yang di-load() oleh src. Target ini seharusnya dalam penggunaan normal menjadi target bzl_library, tetapi aturan starlark_doc_extract tidak menerapkannya, dan menerima target apa pun yang menyediakan file Starlark di DefaultInfo-nya.

Perhatikan bahwa file Starlark yang di-wrap harus berupa file di hierarki sumber; Bazel tidak dapat load() file yang dihasilkan.

src

Label; wajib

File Starlark yang akan diekstrak dokumentasinya.

Perhatikan bahwa ini harus berupa file di hierarki sumber; Bazel tidak dapat load() membuat file.

render_main_repo_name

Boolean; defaultnya adalah False

Jika benar (true), render label di repositori utama dalam dokumentasi yang dikeluarkan dengan komponen repo (dengan kata lain, //foo:bar.bzl akan dikeluarkan sebagai @main_repo_name//foo:bar.bzl).

Nama yang akan digunakan untuk repositori utama diperoleh dari module(name = ...) dalam file MODULE.bazel repositori utama (jika Bzlmod diaktifkan), atau dari workspace(name = ...) dalam file WORKSPACE repositori utama.

Atribut ini harus disetel ke False saat membuat dokumentasi untuk file Starlark yang hanya ditujukan untuk digunakan dalam repositori yang sama, dan ke True saat membuat dokumentasi untuk file Starlark yang ditujukan untuk digunakan dari repositori lain.

symbol_names

Daftar string; defaultnya adalah []

Daftar opsional nama yang memenuhi syarat dari fungsi, aturan, penyedia, atau aspek yang diekspor (atau struct tempat fungsi, aturan, penyedia, atau aspek tersebut disarangkan) yang dokumentasinya akan diekstrak. Di sini, nama yang memenuhi syarat (qualified name) berarti nama yang digunakan untuk menyediakan entitas kepada pengguna modul, termasuk struct apa pun tempat entitas disarangkan untuk penamaan.

starlark_doc_extract memancarkan dokumentasi untuk entity jika dan hanya jika

  1. setiap komponen nama lengkap entity bersifat publik (dengan kata lain, karakter pertama setiap komponen nama lengkap adalah huruf, bukan "_"); dan
    1. baik daftar symbol_names kosong (yang merupakan kasus default), atau
    2. nama lengkap entity, atau nama lengkap struct tempat entity disarangkan, ada dalam daftar symbol_names.

test_suite

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

test_suite mendefinisikan serangkaian pengujian yang dianggap "berguna" bagi manusia. Hal ini memungkinkan project menentukan serangkaian pengujian, seperti "pengujian yang harus Anda jalankan sebelum check-in", "pengujian beban project kami", atau "semua pengujian kecil". Perintah blaze test mematuhi organisasi semacam ini: Untuk pemanggilan seperti blaze test //some/test:suite, Blaze terlebih dahulu menghitung semua target pengujian yang disertakan secara transitif oleh target //some/test:suite (kami menyebutnya "perluasan test_suite"), lalu Blaze membangun dan menguji target tersebut.

Contoh

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

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

Rangkaian pengujian yang menjalankan serangkaian pengujian tertentu:

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

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

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

Argumen

Atribut
name

Nama; wajib

Nama unik untuk target ini.

tags

Daftar string; tidak dapat dikonfigurasi; defaultnya adalah []

Daftar tag teks seperti "kecil" atau "database" atau "-tidak stabil". 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 rangkaian "-small" cocok dengan ukuran "small" pengujian. Semua tag lainnya dianggap sebagai tag positif.

Secara opsional, agar tag positif lebih eksplisit, tag juga dapat diawali dengan karakter "+", yang tidak akan dievaluasi sebagai bagian dari teks tag. Hal 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. Perhatikan bahwa hal ini tidak berarti pemeriksaan error untuk dependensi pada pengujian yang dikesampingkan dilewati; dependensi pada pengujian yang dilewati tetap harus sah (misalnya, tidak diblokir oleh batasan visibilitas).

Kata kunci tag manual diperlakukan berbeda dengan di atas oleh "perluasan 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 (dan dengan demikian tidak diperluas). Perilaku ini konsisten dengan cara blaze build dan blaze test menangani pola target karakter pengganti secara umum. Perhatikan bahwa hal ini sangat berbeda dengan perilaku blaze query 'tests(E)', karena rangkaian 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 saling eksklusif (misalnya, semua pengujian kecil dan sedang), Anda harus membuat tiga aturan test_suite: satu untuk semua pengujian kecil, satu untuk semua pengujian sedang, dan satu yang mencakup dua aturan sebelumnya.

tests

Daftar label; tidak dapat dikonfigurasi; defaultnya adalah []

Daftar suite pengujian dan target pengujian dalam bahasa apa pun.

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

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