Genel Kurallar

. Sorun bildir Kaynağı göster Gece · 7,3 · 7,2 · 7,1 · 7,0 · 6,5

Kurallar

takma ad

Kural kaynağını görüntüle
alias(name, actual, compatible_with, deprecation, features, restricted_to, tags, target_compatible_with, testonly, visibility)

alias kuralı, kurala ad verilebilecek başka bir ad oluşturur.

Takma ad yalnızca "normal" için çalışır belirler. Özellikle, package_group ve test_suite için diğer ad kullanılamaz.

Takma ad oluşturma, bir hedefin yeniden adlandırılmasının gerektiği büyük depolarda yardımcı olabilir. çok sayıda dosyada değişiklik yapabilir. Ayrıca, bir alan adında depolanan bir select işlev çağrısını görüntülemek için bu mantığı birden çok hedefe sahip olabilir.

Takma ad kuralının kendi görünürlük bildirimi vardır. Diğer tüm açılardan bakıldığında, bu kurala benzer (ör. testonly takma adda yok sayılır; yalnızca test amaçlı olma ( bunun yerine referans verilen kuralın kullanıldığı durumlar) kullanılır:

  • Komut satırında takma adından bahsedilirse testler çalıştırılmaz. Takma ad tanımlamak için referans verilen testi çalıştıran bir test_suite kullanın. tests içinde tek bir hedefi olan kural özelliğini gönderin.
  • Ortam grupları tanımlanırken environment kurallarının takma adları desteklenir. --target_environment komut satırında desteklenmez iki seçenekten birini seçebiliriz.

Örnekler

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

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

Bağımsız değişkenler

Özellikler
name

Ad; zorunlu

Bu hedef için benzersiz bir ad.

actual

Etiket; zorunlu

Bu takma adın belirttiği hedef. Kural olması gerekmez, giriş de olabilir dosyası olarak kaydedebilirsiniz.

config_setting

Kural kaynağını görüntüle
config_setting(name, constraint_values, define_values, deprecation, distribs, features, flag_values, licenses, tags, testonly, values, visibility)

Aşağıdakiler için beklenen bir yapılandırma durumuyla (derleme işaretleri veya platform kısıtlamaları olarak ifade edilir) eşleşir: amacına hizmet eder. Şu öğe için seçiminizi inceleyin: nasıl kullanılır? Yapılandırılabilir özellikler başlıklı makaleyi inceleyin.

Örnekler

Aşağıdakiler, --compilation_mode=opt veya -c opt (açık olarak komut satırında veya dolaylı olarak .bazelrc dosyalarından):

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

Aşağıdaki, ARM'yi hedefleyen ve özel tanımlamayı uygulayan herhangi bir derlemeyle eşleşir FOO=bar (örneğin, bazel build --cpu=arm --define FOO=bar ...):

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

Aşağıdakiler, kullanıcı tanımlı işaret --//custom_flags:foo=1 (açıkça komut satırında veya dolaylı olarak .bazelrc dosyaları):

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

Aşağıdakiler, x86_64 mimarisi ve glibc platformuna sahip bir platformu hedefleyen tüm derlemelerle eşleşir etiketli bir constraint_value olduğu varsayıldığında, sürüm 2.25 //example:glibc_2_25. Bir platformun, ek bir tanımlayıcı tanımlaması durumunda da eşleştiğini unutmayın. değeri için daha yüksek değer sunar.

  config_setting(
      name = "64bit_glibc_2_25",
      constraint_values = [
          "@platforms//cpu:x86_64",
          "//example:glibc_2_25",
      ]
  )
  
. Tüm bu durumlarda yapılandırmanın derleme içinde değişmesi mümkündür. Örneğin, farklı bir platform için bir hedef oluşturulmalıdır. Yani, bir kullanıcı config_setting üst düzey komut satırı işaretleriyle eşleşmiyor, yine de eşleşebilir bazılarını anlatacağım.

Notlar

  • Birden fazla öğe oluşturulduğunda ne olacağını görmek için seçime bakın. config_setting öğeleri mevcut yapılandırma durumuyla eşleşiyor.
  • Kısaltılmış biçimleri (ör. --compilation_mode - -c), values tanımlarının tamamı tam formu kullanmalıdır. Bunlar otomatik olarak iki formdan birini kullanarak çağrıları eşleştirin.
  • Bir işaret birden fazla değer alıyorsa (ör. --copt=-Da --copt=-Db veya liste türü) Starlark bayrağı), "a" ise values = { "flag": "a" } eşleşir listenin herhangi bir yerinde mevcut olmalıdır.

    values = { "myflag": "a,b" } aynı şekilde çalışır: Bu, --myflag=a --myflag=b --myflag=a --myflag=b --myflag=c, --myflag=a,b ve --myflag=c,b,a. Tam anlamlar işaretidir. Örneğin, --copt aynı öğede birden fazla değeri desteklemez. örnek: --copt=a,b ["a,b"] üretirken --copt=a --copt=b ["a", "b"] üretir (yani values = { "copt": "a,b" } ilki ile eşleşir ancak ikincisiyle eşleşmez). Ancak --ios_multi_cpus (Apple kuralları için) şur: -ios_multi_cpus=a,b ve ios_multi_cpus=a --ios_multi_cpus=b ["a", "b"] üretir. İşaret tanımlarını kontrol edin ve ve koşulları dikkatlice inceleyin.

  • Yerleşik derleme işaretleri tarafından modellenmeyen koşullar tanımlamanız gerekirse Starlark tarafından tanımlanan işaretler. --define de kullanabilirsiniz, ancak bu daha zayıf teklif verir desteği vardır ve önerilmez. Görüntüleyin burayı tıklayın.
  • Farklı paketlerde aynı config_setting tanımlarını tekrarlamaktan kaçının. Bunun yerine, standart pakette tanımlanan ortak bir config_setting öğesine başvurun.
  • values define_values ve constraint_values aynı config_setting içinde herhangi bir kombinasyonda kullanılabilir ancak en az bir kombinasyon olmalıdır belirli bir config_setting için ayarlanabilir.

Bağımsız değişkenler

Özellikler
name

Ad; zorunlu

Bu hedef için benzersiz bir ad.

constraint_values

Etiket listesi; nonyapılandırabilir; varsayılan değer []

Hedef platformun belirtmesi gereken minimum constraint_values kümesi (config_setting) ile eşleşecektir. (Yürütme platformu dikkate alınmalıdır.) Platformun sahip olduğu ek kısıtlama değerleri yoksayılır. Görüntüleyin Yapılandırılabilir Derleme Özellikleri'ni inceleyin.

İki config_setting aynı select içinde eşleşirse ve bir config_setting tamamen aynı flag'ler ve constraint_setting'ler, diğerleriyle birlikte daha fazla ayara sahip olan kullanıcı seçilir. Buna "uzmanlık" denir. Örneğin, x86 ve Linux ile eşleşen bir config_setting uzman x86 ile eşleşen bir config_setting.

İki config_setting eşleşiyor ve her ikisi de constraint_values yoksa bu bir hatadır.

define_values

Sözlük: Dize -> String; nonconfig; varsayılan değer {}

values ile aynı ancak özellikle de --define bayrağı için.

--define, söz dizimi (--define KEY=VAL) nedeniyle özeldir KEY=VAL'nin Bazel bayrağı açısından bir değer olduğu anlamına gelir.

Bunun anlamı şudur:

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

çalışmıyor, çünkü aynı anahtar (define) aynı tuşta iki kez sözlüğünüzden yararlanırsınız. Bu özellik şu sorunu çözer:

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

bazel build //foo --define a=1 --define b=2 ile doğru şekilde eşleşiyor.

--define hâlâ şuralarda görünebilir: Normal işaret söz dizimiyle values, ve sözlük anahtarları ayrı olduğu sürece bu özellikle serbestçe karıştırılabilir.

flag_values

Sözlük: label -> String; nonyapılandırabilir; varsayılan değer {}

values ile aynı ancak için kullanıcı tanımlı derleme işaretleri hakkında daha fazla bilgi edinin.

Bu, farklı bir özelliktir çünkü kullanıcı tanımlı işaretler, işlem yaparken etiket olarak yerleşik flag'lere rastgele dizeler referans verilir.

values

Sözlük: Dize -> String; nonconfig; varsayılan değer {}

Bu kuralla eşleşen yapılandırma değerleri grubu (derleme işaretleri olarak ifade edilir)

Bu kural, 2023'e kadarki sürümlerden birine sahip yapılandırılmış hedefin bunu bir select ifadesinde belirtir. Bu, "eşleşme" sözlükteki her giriş için bir Bazel çağrısı yapılandırması girişin beklenen değeriyle eşleşiyor. Örneğin: values = {"compilation_mode": "opt"}, çağrılarla eşleşiyor bazel build --compilation_mode=opt ... ve Hedefle yapılandırılmış kurallarda bazel build -c opt ....

Kolaylık sağlamak amacıyla, yapılandırma değerleri derleme işaretleri olarak ( önceki "--"). Ancak bu ikisinin aynı olmadığını unutmayın. Bu Çünkü hedeflerin aynı arayüzde birden çok yapılandırmada oluşturulabilmesidir seçeceğiz. Örneğin, bir yönetici yapılandırmasının "cpu" değeri şu değerle eşleşir: --host_cpu, --cpu değil. Bu nedenle, farklı aynı config_setting, aynı çağrıyla farklı şekilde eşleşebilir onları kullanan kuralın yapılandırmasına göre değişir.

Bir işaret, komut satırında açıkça ayarlanmazsa varsayılan değeri kullanılır. Bir anahtar sözlükte birden çok kez görünüyorsa yalnızca son örneği kullanılır. Bir anahtar, komut satırında birden fazla kez ayarlanabilen bir işarete (ör. bazel build --copt=foo --copt=bar --copt=baz ...), şu durumda eşleşme gerçekleşir: bu ayarlardan herhangi biri eşleşiyor.

dosya grubu

Kural kaynağını görüntüle
filegroup(name, srcs, data, compatible_with, deprecation, distribs, features, licenses, output_group, restricted_to, tags, target_compatible_with, testonly, visibility)

Bir dizi hedefin çıktılarını tek bir altında toplamak için filegroup kullanın etiket.

filegroup, komut satırında hedefleri listelemenin veya başka bir kuralın bir özelliğine bağlıdır. Çünkü hedefler, farklı çıkışlar da vardır. Bunlar aynı şekilde toplanmaz. Ancak bu, özellikle de Örneğin, bir genrule kelimesinin srcs özelliğinde ya da *_binary kuralının data özelliği.

Dizinlere doğrudan referans vermek yerine filegroup kullanılması önerilir. Derleme sistemi tüm dosyalar hakkında tam bilgiye sahip olmadığından ikincisi sessizdir olduğundan, bu dosyalar değiştiğinde yeniden oluşturulmayabilir. Şununla birleştirildiğinde: glob, filegroup tüm dosyaların açıkça bilinen URL'leri içerir.

Örnekler

İki kaynak dosyadan oluşan bir filegroup oluşturmak için

filegroup(
    name = "mygroup",
    srcs = [
        "a_file.txt",
        "//a/library:target",
        "//a/binary:target",
    ],
)

Veya bir test verisi dizini oluşturmak için bir glob kullanın:

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

Bu tanımlardan yararlanmak için filegroup öğesine herhangi bir kuraldan etiket ekleyin:

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

Bağımsız değişkenler

Özellikler
name

Ad; zorunlu

Bu hedef için benzersiz bir ad.

srcs

Etiket listesi; varsayılan değer []

Dosya grubunun üyesi olan hedeflerin listesi.

Bir glob ifadesinin sonucu genellikle srcs özelliğinin değeri.

data

Etiket listesi; varsayılan değer []

Çalışma zamanında bu kuralın ihtiyaç duyduğu dosyaların listesi.

data özelliğinde adlandırılan hedefler şuraya eklenir: Bu filegroup kuralından runfiles tanesi. filegroup değerine,data başka bir kural daha, runfiles öğesi runfiles öğesine eklenecek bağlı olarak ayarlar. Veri bağımlılıklarını inceleyin bölümü ve genel belgelerin data başlıklı makaleyi inceleyin.

output_group

String; varsayılan değer ""

Kaynaklardan yapıların toplanacağı çıkış grubu. Bu özellik belirtildiğinde, bağımlıların belirtilen çıkış grubundaki yapılar dışa aktarılır çıkış grubu kullanmanızı öneririz.

Bir "çıktı grubu" bir hedefin çıktı yapılarının kategorisidir; nasıl uygulayacağımızı göreceğiz.

Genquery

Kural kaynağını görüntüle
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(), Bazel sorgu dili ve sonucu dökümler bir dosyaya koyabilirsiniz.

Derlemenin tutarlılığını sağlamak için sorgunun yalnızca scope hükümlerinde belirtilen hedeflerin geçişli olarak kapatılması özelliğini gönderin. Bu kuralı ihlal eden sorgular yürütme sırasında şu durumlarda başarısız olur: strict belirtilmemiş veya doğru (strict yanlışsa, kapsam dışı hedefler bir uyarıyla atlanır). İlgili içeriği oluşturmak için kullanılan bunun olmamasını sağlamanın en kolay yolu, aynı etiketlerden bahsetmektir. sorgu ifadesinde olduğu gibidir.

Burada ve komutta izin verilen sorgular arasındaki tek fark satırı, joker karakter hedefleme özelliklerini içeren sorgular (ör. //pkg:* veya //pkg:all) burada kullanılamaz. Bunun iki nedeni vardır: Birincisi, çünkü genquery bir sorgu kullanabilirsiniz. ve ikinci olarak, BUILD dosya joker karakter bağımlılıklarını desteklemez (ör. deps=["//a/..."] izin verilmez).

Genquery'nin çıkışı, belirleyici çıktıyı uygulamak için sözlüksel olarak sıralanır. --output=graph|minrank|maxrank hariç veya somepath üst düzey işlev olarak kullanılır.

Çıkış dosyasının adı kuralın adıdır.

Örnekler

Bu örnekte, belirtilen hedefi bir dosyaya yükleyebilirsiniz.

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

Bağımsız değişkenler

Özellikler
name

Ad; zorunlu

Bu hedef için benzersiz bir ad.

compressed_output

Boole; varsayılan değer False

True ise sorgu çıkışı GZIP dosyası biçiminde yazılır. Bu ayar kullanılabilir sorgu çıktısının büyük olması bekleniyorken Bazel'ın bellek kullanımında ani artışlar olmaması için. Bazel 220 bayttan büyük sorgu çıkışlarını dahili olarak sıkıştırır. olduğundan, bu ayarın True olarak ayarlanması, uygulanan kullanır. Ancak, Bazel'ın çıkış dosyasını yazarken sıkıştırmayı atlamasını sağlar. Bu da bellek yoğun olabilir.
expression

String; zorunlu

Yürütülecek sorgu. Komut satırının ve BUILD dosyalarındaki diğer yerlerin aksine, buradaki etiketler, çalışma alanının kök dizinine göre çözümlenir. Örneğin, a/BUILD dosyasındaki bu özellikte bulunan :b etiketi, hedef //:b.
opts

Dize listesi; varsayılan değer []

Sorgu motoruna iletilen seçenekler. Bunlar, komut satırına bazel query öğesine geçirilebilecek seçenekler. Bazı sorgu seçeneklerine izin verilmiyor burada: --keep_going, --query_file, --universe_scope, --order_results ve --order_output. Burada belirtilmeyen seçenekler , bazel query komut satırındaki gibi varsayılan değerlerine sahip olur.
scope

Etiket listesi; zorunlu

Sorgunun kapsamı. Sorgunun, geçişli olmayan hedeflere dokunmasına izin verilmiyor söz konusu hedeflerin kapatılmasına yol açabilir.
strict

Boole; varsayılan değer True

Politika, Doğru değerine ayarlanırsa sorguları kapsamlarının geçişli kapanmasından kaçan hedefler seçeceğiz. False (yanlış) değerine ayarlanırsa Bazel bir uyarı yazdırır ve kapsam dışı kalırken sorgunun geri kalanını tamamlayın.

Genrule

Kural kaynağını görüntüle
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, kullanıcı tanımlı Bash komutunu kullanarak bir veya daha fazla dosya oluşturur.

Genrule, görev için belirli bir kural yoksa kullanabileceğiniz genel derleme kurallarıdır. Örneğin, Bash tek satırlık bir hazırlayabilirsiniz. Ancak C++ dosyalarını derlemeniz gerekiyorsa yerine mevcut cc_* kuralları uygulanır, çünkü sizin için.

Genrule öğesinin, komut bağımsız değişkenini yorumlamak için kabuk gerektirdiğini unutmayın. PATH üzerinde bulunan rastgele programlara referans vermek de kolaydır. Ancak bu, komutu hermetik olmayan ve tekrarlanabilir olmayabilir. Yalnızca tek bir aracı çalıştırmanız gerekiyorsa run_binary .

Diğer her eylem gibi, ustaların yarattıkları eylem de kendi özgeçmişleri hakkında hiçbir çalışma dizini; tüm Bazel garantileri, bildirilen girişlerinin $(location) etiketinin etiketi için döndürdüğü yol. Örneğin, işlem uzaktan yürütmeye tabiyseniz korumalı alanın veya uzaktan yürütmenin birlikte kullanılması çalışma dizinine ekleyin. Doğrudan çalıştırılırsa (standalone stratejisi kullanılarak), çalışan dizin yürütme kökü olur, yani bazel info execution_root işlevinin sonucu olur.

Testleri çalıştırmak için genrule kullanmayın. Test ve test için özel dağıtımlar vardır diğer sonuçları da alabilirsiniz. Genellikle testlerin çalıştırılması gerekir hedef mimari üzerinde çalışmaya devam eder. Genrule ise yürütülürken üzerine konuşacağız (ikisi farklı olabilir). Genel bir amaca ihtiyacınız varsa test kuralı için sh_test kullanın.

Çapraz derlemede dikkat edilmesi gereken noktalar

Aşağıdakilerle ilgili daha fazla bilgi için kullanıcı kılavuzuna bakın: bir video hazırladı.

Genrules derleme sırasında çalışırken, çıkışları genellikle derlemeden sonra, dağıtım veya teşvik etmek anlamına gelir. Mikrodenetleyici için C kodu derleme örneğini düşünün: Derleyici, C kodunu kabul eder kaynak dosyalarını kullanır ve mikrodenetleyicide çalışan kod oluşturur. Oluşturulan kod açık bir şekilde oluşturmak için kullanılan CPU'da, ancak C derleyicisinde (kaynaktan derlendiyse) çalıştırılamaz sahip olması gerekir.

Derleme sistemi, derlemenin çalıştığı makineleri tanımlamak için exec yapılandırmasını kullanır. ve derleme çıkışının oluşturulduğu makineleri açıklayan hedef yapılandırma çalışması gerekiyordu. Her birini yapılandırma seçenekleri sunar ve çakışmaları önlemek için ilgili dosyaları ayrı dizinlere yerleştirin.

Genrule'lar için derleme sistemi, bağımlılıkların uygun şekilde oluşturulmasını sağlar: srcs, (gerekirse) hedef yapılandırması için oluşturulur, tools, exec yapılandırması için oluşturulmuştur ve çıkış şu şekilde kabul edilir: target yapılandırması için olduğundan emin olun. Ayrıca "Yap" değişkenlerini ilgili araçlara geçirebilir.

Genrule, kasıtlı olarak hiçbir deps özelliği tanımlamaz: Diğer yerleşik kurallar, otomatik olarak nasıl yapılacağını belirlemek için kurallar arasında iletilen dile bağlı meta bilgiler ancak bu düzeyde otomasyon genel kurallar için mümkün değildir. Genrules çalışmaları tamamen dosya ve Runfiles düzeyinde olur.

Özel Durumlar

Exec-exec derlemesi: Bazı durumlarda derleme sisteminin, çıkışı da derleme sırasında yürütülebilir. Örneğin bir genrule, özel derleyici oluşturuyorsa sonra başka bir gen kural da kullanılırsa, ilkinin çıktısını exec yapılandırmasıdır. Çünkü derleyici, diğer genel kuralda bu konumda çalışır. Böyle durumlarda derleme sistemi doğru şeyi otomatik olarak yapar: srcs ve sonraki Hedef yerine, yönetici yapılandırması için ilk genel kuralın outs kadarı yapılandırma. Daha fazla bilgi için kullanım kılavuzuna bakın bilgisi.

JDK ve C++ Araçları: JDK'dan veya C++ derleyici paketinden bir araç kullanmak için derleme sistemi, kullanılacak bir değişken kümesi sağlar. "Marka" bölümüne bakın değişkeni bolca fırsat sunuyor.

Genel ortam

Genrule komutu, bir komut çalıştırıldığında başarısız olacak şekilde yapılandırılan bir Bash kabuğu tarafından yürütülür veya ardışık düzenin başarısız olması durumunda set -e -o pipefail.

Derleme aracı, Bash komutunu yalnızca PATH, PWD, TMPDIR ve birkaç tane daha. Derlemelerin tekrar oluşturulabilir olmasını sağlamak için kullanıcının kabuğunda tanımlanan çoğu değişken ortamın genrule komutuna geçirilmemesini sağlar. Ancak, Bazel ( Blaze), kullanıcının PATH ortam değişkeninin değerini geçirir. PATH değerinde yapılan herhangi bir değişiklik, Bazel'in komutu yeniden yürütmesine neden olur. yardımcı oluyorum.

Bir genrule komutu, şu işlemler dışında ağa erişmemelidir: komutun alt öğelerini içerir (ancak bu şu anda zorunlu değildir).

Derleme sistemi mevcut çıkış dosyalarını otomatik olarak siler, ancak gerekli üst öğeleri dizinleri kontrol eder. Ayrıca, hata durumunda çıkış dosyalarını da kaldırır.

Genel Tavsiye

  • Bir genel kural tarafından çalıştırılan araçların deterministik ve hermetik olduğundan emin olun. Proje yöneticisinin zaman damgaları kullanabilir ve kümeler ve haritalar için sabit bir sıralamanın yanı sıra, çıkışa yalnızca göreli dosya yollarını yazar, mutlak yollar içermez. Bu kurala uyulmaması, beklenmedik yapı davranışına yol açabilir (Bazel'in beklediğiniz bir kuralı yeniden oluşturmaması) ve önbellek performansını düşürür.
  • $(location) öğesini çıkışlar, araçlar ve kaynaklar için yoğun bir şekilde kullanın. Nedeni: çıkış dosyalarının farklı yapılandırmalar için ayrılması, genrule'lar sabit kodlu uygulamalara ve/veya mutlak yollardır.
  • Aynı veya çok benzer genelerlerin kullanılması ihtimaline karşı ortak bir Starlark makrosu yazın birden çok yer olduğunu görebilirsiniz. Genel kural karmaşıksa bir senaryoda veya bir Starlark kuralı. Bu sayede okunabilirliği ve test edilebilirliği iyileştirebilirsiniz.
  • Çıkış kodunun, kuralın başarılı veya başarısız olduğunu doğru şekilde gösterdiğinden emin olun.
  • stdout veya stderr'e bilgilendirme amaçlı iletiler yazmayın. Bu, hata ayıklama için kullanışlı olsa da kolayca gürültüye dönüşebilir. başarılı bir genel kuralın sessiz olması gerekir. Diğer yandan, başarısız bir genel iyi hata mesajları vermelidir.
  • $$ 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).
  • Sembol bağlantılar ve dizinler oluşturmaktan kaçının. Bazel, dizin/sembol bağlantıyı kopyalamaz genrules tarafından oluşturulan yapı ve dizinler için bağımlılık kontrolü sağlam değil.
  • Diğer kurallarda genel kurala referans verirken genel kuralın etiketini veya ayrı ayrı çıkış dosyalarının etiketlerini tanımlar. Bazen tek bir yaklaşım daha okunabilir, bazen other: Bir tüketici kuralının srcs öğesinde çıkışlara ada göre referansta bulunmak önlenir. istemeden genrule ilgili diğer çıkışları toplamak birçok çıktı üretir.

Örnekler

Bu örnek, foo.h oluşturur. Hiç kaynak yok çünkü komut, herhangi bir giriş. "İkili" tarafından çalıştırılan bir perl komut dosyası, genrule ile aynı pakettedir.

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

Aşağıdaki örnekte, filegroup özelliğinin nasıl kullanılacağı gösterilmektedir ve başka bir genrule öğesinin çıktıları. Bunun yerine $(SRCS) kullanıldığında açık $(location) yönergesi de kullanılabilir; bu örnekte ikincisi bir şablondur.

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) > $@",
)

Bağımsız değişkenler

Özellikler
name

Ad; zorunlu

Bu hedef için benzersiz bir ad.


Bu kurala Başka bir BUILD dokümanın srcs veya deps bölümü kurallar. Kural, kaynak dosyalar oluşturuyorsa srcs özelliği için de kullanılmaktadır.
srcs

Etiket listesi; varsayılan değer []

Bu kuralla ilgili girişlerin (ör. işlenecek kaynak dosyaları) listesi.

Bu özellik, cmd tarafından yürütülen araçların listelenmesi için uygun değildir; kullan Bunun yerine tools özelliğini kullanabilirsiniz.

Derleme sistemi, genrule çalıştırmadan önce bu ön koşulların derlenmesini sağlar komut; orijinal derleme isteğiyle aynı yapılandırma kullanılarak oluşturulurlar. İlgili içeriği oluşturmak için kullanılan bu önkoşullara ilişkin dosyaların adları, komutta $(SRCS) içindeki boşlukla ayrılmış liste; kişinin kendi yolculuğu srcs hedef //x:y, $(location //x:y) kullanılarak veya $< kullanılarak, srcs.

outs

Dosya adlarının listesi; nonyapılandırabilir; zorunlu

Bu kural tarafından oluşturulan dosyaların listesi.

Çıkış dosyaları, paket sınırlarını geçmemelidir. Çıkış dosya adları pakete göre yorumlanır.

executable işareti ayarlanırsa outs tam olarak bir tane içermelidir etiket.

Genrule komutunun her çıkış dosyasını önceden belirlenmiş bir konumda oluşturması beklenir. Konum, cmd üzerinde genele özel "Marka" kullanılarak mevcuttur değişkenleri ($@, $(OUTS), $(@D) veya $(RULEDIR)) veya kullanarak $(location) değişikliği.

cmd

String; varsayılan değer ""

Çalıştırılacak komut. $(location) ve "Yap" hükümlerine tabidir değişkeni değiştirmeyin.
  1. $(location label) ve $(locations label) (ve benzer) öğelerinin tüm tekrarları değiştirilerek ilk $(location) değişikliği uygulanır ilgili değişkenleri kullanan yapılar execpath, execpaths, rootpath ve rootpaths).
  2. Ardından, "Yap" değişkenleri genişletilir. Lütfen $(JAVA), $(JAVAC) ve önceden tanımlanmış değişkenleri $(JAVABASE), exec yapılandırmasının altına genişler. Böylece Java çağrıları bir derleme adımının parçası olarak çalışan bu komutlar, paylaşılan kitaplıkları ve diğer ve bildirmeyi konuştuk.
  3. Son olarak, elde edilen komut Bash kabuğu kullanılarak yürütülür. Çıkış kodu komutun sıfır olmayan bir değeri olması, komutun başarısız olduğu kabul edilir.
Bu cmd_bash, cmd_ps ve cmd_bat, (hiçbiri geçerli değilse)

Komut satırı uzunluğu, platform sınırını (Linux/macOS'te 64K, Windows'da 8K) aşıyorsa sonra genrule, komutu bir komut dosyasına yazar ve sorunu çözmek için o komut dosyasını yürütür. Bu tüm cmd özellikleri (cmd, cmd_bash, cmd_ps, cmd_bat) tıklayın.

cmd_bash

String; varsayılan değer ""

Çalıştırılacak Bash komutu.

Bu özelliğin önceliği, cmd değerinden daha yüksek. Komut genişletilir ve cmd özelliğiyle tamamen aynı şekilde çalışır.

cmd_bat

String; varsayılan değer ""

Windows'da çalıştırılacak Batch komutu.

Bu özelliğin önceliği, cmd ve cmd_bash özelliklerine göre daha yüksek. Komut, cmd özelliğine benzer şekilde çalışır. şu farklılıklar var:

  • Bu özellik yalnızca Windows'da geçerlidir.
  • Bu komut aşağıdaki varsayılan bağımsız değişkenlerle cmd.exe /c ile çalışır:
    • /S - İlk ve son alıntıları ayıklayın ve diğer her şeyi olduğu gibi yürütün.
    • /E:ON - Genişletilmiş komut kümesini etkinleştir.
    • /V:ON - gecikmeli değişken genişletmeyi etkinleştirme
    • /D - AutoRun kayıt defteri girişlerini yoksayın.
  • $(location) ve "Yap" değişken yerine geçerse yollar Windows stil yollarına (ters eğik çizgiyle) genişletildi.
cmd_ps

String; varsayılan değer ""

Windows'da çalıştırılacak Powershell komutu

Bu özelliğin önceliği cmd, cmd_bash ve cmd_bat. Komut, cmd ile benzer şekilde çalışır özelliğini gönderin:

  • Bu özellik yalnızca Windows'da geçerlidir.
  • Komut, powershell.exe /c ile çalışır.

Powershell'in kullanımını kolaylaştırmak ve hataya daha az açık hale getirmek için aşağıdaki komutu çalıştırıyoruz genrule öğesinde Powershell komutunu yürütmeden önce ortamı ayarlama

  • Set-ExecutionPolicy -Scope CurrentUser RemoteSigned - çalıştırılmasına izin ver imzalanmamış komut dosyaları.
  • $errorActionPreference='Stop' - Birden fazla komut olması durumunda ; ile ayrılmışsa Powershell CmdLet'i başarısız olursa işlem hemen çıkar ancak harici komutta bu ÇALIŞMAZ.
  • $PSDefaultParameterValues['*:Encoding'] = 'utf8' - varsayılanı değiştirin utf-16'dan utf-8'e kodlamak için de kullanılır.
executable

Boole; nonconfig; varsayılan değer False

Çıkışı yürütülebilir olarak bildir.

Bu işareti True (Doğru) değerine ayarlamak, çıktının yürütülebilir bir dosya olduğu ve run komutudur. Bu durumda Genrule tam olarak bir çıkış üretmelidir. Bu özellik ayarlanırsa run, ne olursa olsun dosyayı yürütmeyi dener kontrol edebilirsiniz.

Oluşturulan yürütülebilir dosya için veri bağımlılıklarının tanımlanması desteklenmiyor.

local

Boole; varsayılan değer False

Doğru değerine ayarlanırsa bu seçenek, genrule öğesini "local" kullanarak çalışmaya zorlar. Bu, uzaktan yürütme, korumalı alan oluşturma ve kalıcı çalışan olmayacak anlamına gelir.

Bu, "yerel" sağlamaya eşdeğerdir etiket olarak (tags=["local"]) kaldırın.

message

String; varsayılan değer ""

İlerleme durumu mesajı.

Bu derleme adımı yürütüldüğünde yazdırılacak bir ilerleme mesajı. Varsayılan olarak "Çıkış oluşturuluyor" mesajı (ya da eşit derecede yamsız) bir şeyler tercih edebilirsiniz. echo veya diğer yazdırma işlemleri yerine bu özelliği kullanın ifadeleri cmd komutunuzda kullanabilirsiniz. Bu, derleme aracının ve bu ilerleme mesajlarının yazdırılıp yazdırılmadığı.

output_licenses

Lisans türü; varsayılan değer ["none"]

Bkz. common attributes
output_to_bindir

Boole; nonconfig; varsayılan değer False

Doğru değerine ayarlanırsa bu seçenek çıkış dosyalarının bin içine yazılmasına neden olur. dizinini kullanmanız gerekmez.genfiles

tools

Etiket listesi; varsayılan değer []

Bu kural için araç bağımlılıklarının listesi. Şu kelimenin tanımını göster: bağımlılıkları kontrol edin.

Derleme sistemi, genrule komutunu çalıştırmadan önce bu ön koşulların derlenmesini sağlar; exec kullanılarak oluşturulurlar. yapılandırma dâhildir. Bir tek tools hedef //x:y aşağıdaki kullanılarak elde edilebilir: $(location //x:y).

cmd tarafından yürütülecek herhangi bir *_binary veya araç bu listesini (srcs yerine) kullanarak doğru yapılandırmada oluşturulduğundan emin olun.

starlark_doc_extract

Kural kaynağını görüntüle
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(), kurallar ve işlevler ( makroları, özellikleri ve belirli bir .bzl içerisinde tanımlanan veya yeniden dışa aktarılan sağlayıcıları .scl dosyası. Bu kuralın çıktısı, tanımlandığı şekilde bir ModuleInfo ikili protokolüdür inç stardoc_output.proto "Bazel kaynak ağacı"dır.

Dolaylı çıkış hedefleri

  • name.binaryproto (varsayılan çıkış): A ModuleInfo ikili protokolü.
  • name.textproto (yalnızca açıkça talep edildiğinde oluşturulur): metin name.binaryproto proto sürümü.

Uyarı: Bu kuralın çıkış biçiminin kararlı olacağı garanti edilmez. Temel olarak Stardoc tarafından dahili kullanım.

Bağımsız değişkenler

Özellikler
name

Ad; zorunlu

Bu hedef için benzersiz bir ad.

deps

Etiket listesi; varsayılan değer []

load() tarafından gönderilen Starlark dosyalarını sarmalayan hedeflerin listesi src. Bu hedeflerin normal kullanım altında olması gerekir bzl_library hedefler ancak starlark_doc_extract kuralı bunu zorunlu kılmaz ve DefaultInfo içinde Starlark dosyaları sağlayan herhangi bir hedef.

Sarmalanmış Starlark dosyalarının kaynak ağaçtaki dosyalar olması gerektiğini unutmayın; Bazel load() dosya oluşturuldu.

src

Etiket; zorunlu

Belgelerin çıkarılacağı Starlark dosyası.

Bunun kaynak ağaçta bir dosya olması gerektiğini unutmayın; Bazel, load() işlemini gerçekleştiremez oluşturulan dosyalar.

render_main_repo_name

Boole; varsayılan değer False

True (doğru) ise, yayınlanan belgelerde ana depodaki etiketleri depo bileşeniyle oluşturun (başka bir deyişle //foo:bar.bzl, @main_repo_name//foo:bar.bzl) tıklayın.

Ana depo için kullanılacak ad module(name = ...) kaynağından alınır ana deponun MODULE.bazel dosyasına (Bzlmod etkinse) veya workspace(name = ...) ana deponun WORKSPACE dosyasında.

Bu özellik, şunun için doküman oluştururken False olarak ayarlanmalıdır: Yalnızca aynı depo içinde kullanılması amaçlanan Starlark dosyaları Starlark dosyaları için belge oluştururken True diğer depolardan kullanılır.

symbol_names

Dize listesi; varsayılan değer []

Dışa aktarılan işlevlerin, kuralların, sağlayıcıların veya unsurların nitelikli adlarının isteğe bağlı bir listesi (veya iç içe yerleştirildikleri struct'lar) içerir. Burada, uygun bir ad, bir varlığın modülün kullanıcılarına sunulurken kullanılan adı ifade eder. Buna, varlığın ad alanı için iç içe yerleştirilmiş olduğu struct'lar dahildir.

starlark_doc_extract, yalnızca şu durumlarda varlığa ait dokümanları yayınlar:

  1. varlığına ait nitelikli adının her bileşeni herkese açıktır (başka bir deyişle, nitelikli adın her bileşeninin karakteri alfabetik olup "_" değildir); ve
    1. symbol_names listesinden biri boş (varsayılan değerdir) büyük/küçük harf) veya
    2. tüzel kişinin nitelikli adı veya tüzel kişinin içinde bulunduğu bir struct'ın iç içe yerleştirilmişse, symbol_names listesindedir.

test_suite

Kural kaynağını görüntüle
test_suite(name, compatible_with, deprecation, distribs, features, licenses, restricted_to, tags, target_compatible_with, testonly, tests, visibility)

test_suite, "faydalı" olarak kabul edilen bir dizi testi tanımlar ne kadar önemli olduğunu gördük. Bu projelerin test setlerini tanımlamasına olanak tanır. Örneğin, "testler", "bizim ve ekibin stresini ölçmenizi sağlıyor" "tüm küçük testler" olabilir. bazel test komutu bu sıralamaya uyar kuruluşun: bazel test //some/test:suite gibi bir çağrı için önce Bazel //some/test:suite hedefi tarafından geçişli olarak dahil edilen tüm test hedeflerini numaralandırır ( çağrısına "test_suite genişletmesi" yazın. Ardından, Bazel bu hedefleri oluşturup test eder.

Örnekler

Mevcut paketteki tüm küçük testleri çalıştıracak bir test paketi.

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

Belirli bir test grubunu çalıştıran bir test paketi:

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

Mevcut pakette stabil olmayan tüm testleri çalıştırmak için kullanılan bir test paketi.

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

Bağımsız değişkenler

Özellikler
name

Ad; zorunlu

Bu hedef için benzersiz bir ad.

tags

Dize listesi; nonconfig; varsayılan değer []

"small" gibi metin etiketlerinin listesi veya "veritabanı" gibi ifadeler kullanabilirsiniz. Etiketler herhangi bir geçerli dize olabilir.

"-" ile başlayan etiketler negatif etiket olarak kabul edilir. İlgili içeriği oluşturmak için kullanılan önce "-" karakteri, etiketin bir parçası olarak kabul edilmediğinden paket etiketi "-küçük" bir testin "small" ile eşleşir seçin. Diğer tüm etiketler dikkate alınır pozitif etiketlerdir.

İsteğe bağlı olarak, pozitif etiketleri daha açık hale getirmek için etiketler "+" karakteri olacaktır. Bu karakter, etiket metninin parçası olarak değerlendirilmez. Google yalnızca olumlu ve olumsuz ayrımların daha kolay okunmasını sağlıyor.

Yalnızca pozitif etiketlerin tümüyle ve negatiflerin hiçbiri ile eşleşen kuralları test edin etiketleri test paketine dahil edilir. Bunun, hata kontrolünün başarısız olacağı filtrelenen testlerdeki bağımlılıklar atlanır. ve atlanan bağımlılıkları testlerin yine de yasal olması (ör. görünürlük kısıtlamaları nedeniyle engellenmemesi) gerekir.

manual etiketi anahtar kelimesi, "test_suite genişletmesi" çağrılarda bazel test komutu tarafından gerçekleştirilir joker karakter içeren hedef kalıpları. Burada test_suite hedef "manuel" olarak etiketlendi filtrelenerek hariç tutulur (dolayısıyla genişletildi). Bu davranış, bazel build ve bazel test, genel olarak joker karakter hedef kalıplarını işler. Not: Süitler, bazel query 'tests(E)' adlı çocuğun davranışından açıkça farklıdır. parametresinden bağımsız olarak, her zaman tests sorgu işlevi tarafından manual etiketi.

Bir testin size değerinin, filtreleme amacıyla bir etiket olarak kabul edildiğini unutmayın.

Birlikte kullanılamayan etiketlere sahip testleri içeren bir test_suite öğesine ihtiyacınız varsa (ör. tüm küçük ve orta testlerde) üç test_suite oluşturmanız gerekir tüm küçük testler için bir tane, tüm orta boy testler için bir tane ve önceki iki.

tests

Etiket listesi; nonyapılandırabilir; varsayılan değer []

Herhangi bir dildeki test paketlerinin ve test hedeflerinin listesi.

Dilinden bağımsız olarak burada tüm *_test kabul edilir. Sıra No: Ancak test yapsalar bile *_binary hedefler kabul edilir. Belirtilen tags değerine göre filtreleme yalnızca doğrudan bu özelliği kullanabilirsiniz. Bu özellik test_suite içeriyorsa içindeki testler bu test_suite ile filtrelenmez ( zaten filtre uygulanmış durumdadır).

tests özelliği belirtilmemişse veya boşsa kural varsayılan olarak mevcut BUILD dosyasında bulunan ve manual. Bu kurallar hâlâ tag filtrelemesine tabidir.