Genel Kurallar

Sorun bildirin Kaynağı göster

Kurallar

takma ad

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

alias kuralı, kuralı ifade etmek için kullanılabilecek başka bir ad oluşturur.

Takma ad verme yalnızca "normal" hedefler için çalışır. Özellikle package_group ve test_suite takma adlar kullanılamaz.

Takma ad kuralının kendi görünürlük beyanı vardır. Diğer tüm açılardan, kuralların başvuruda bulunduğu kural gibi davranır (ör. takma adda yalnızca test amaçlı yok sayılır; bunun yerine, referans verilen kuralın test değeri yalnızca kullanılır), bazı küçük istisnalar vardır:

  • Komut satırında takma adından bahsediliyorsa testler çalıştırılmaz. Referans verilen testi çalıştıran bir takma ad tanımlamak için tests özelliğinde tek hedef içeren bir test_suite kuralı kullanın.
  • Ortam grupları tanımlanırken environment takma adları desteklenmez. --target_environment komut satırı seçeneğinde de desteklenmezler.

Örnekler

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

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

Bağımsız değişkenler

Özellikler
name

Name; required

Bu hedef için benzersiz bir ad.

actual

Label; required

Bu takma adın başvuruda bulunduğu hedef. Kural olması gerekmez, giriş dosyası da olabilir.

yapılandırma_ayarı

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

Yapılandırılabilir özellikleri tetiklemek amacıyla beklenen bir yapılandırma durumuyla (derleme işaretleri veya platform kısıtlamaları olarak ifade edilir) eşleşir. Bu kuralın nasıl kullanılacağını öğrenmek için select, genel özellik için genel bir bakış için Yapılandırılabilir özellikler bölümüne bakın.

Örnekler

Aşağıda, --compilation_mode=opt veya -c opt öğesini ayarlayan her derlemeyle (açıkça komut satırında veya dolaylı olarak .bazelrc dosyalarından) eşleşir:

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

Aşağıda, ARM'yi hedefleyen ve FOO=bar özel tanımı uygulayan tüm derlemelerle eşleşir (örneğin, bazel build --cpu=arm --define FOO=bar ...):

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

Aşağıda, kullanıcı tanımlı işareti --//custom_flags:foo=1 (açık olarak komut satırında veya .bazelrc dosyalarından dolaylı olarak) ayarlayan herhangi bir derlemeyle eşleşir:

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

Aşağıdaki örnekte, //example:glibc_2_25 etiketine sahip bir constraint_value bulunduğunu varsayarak x86_64 mimarisi ve glibc 2.25 sürümü olan bir platformu hedefleyen derlemeler eşleşir. Bir platformun bu ikisinin dışında ek kısıtlama değerleri tanımlaması durumunda da eşleştiğini unutmayın.

  config_setting(
      name = "64bit_glibc_2_25",
      constraint_values = [
          "@platforms//cpu:x86_64",
          "//example:glibc_2_25",
      ]
  )
  
Tüm durumlarda, örneğin yapılandırmanın derleme içinde değişmesi mümkündür. Örneğin, bir hedefin ayrı bir platform için oluşturulması gerekiyorsa bu yöntem config_setting üst düzey komut satırı işaretleriyle eşleşmese bile bazı derleme hedefleriyle eşleşebilir.

Notlar

  • Birden çok config_setting, geçerli yapılandırma durumuyla eşleştiğinde ne olacağını öğrenmek için select bölümüne bakın.
  • Kısa formları destekleyen işaretler için (ör. --compilation_mode--c), values tanımları tam formu kullanmalıdır. Bu formlar veya formlar kullanılarak çağrılar otomatik olarak eşleşir.
  • Bir işaret birden fazla değer (örneğin, --copt=-Da --copt=-Db veya liste türünde bir Starlark işareti) alırsa "a", gerçek listede herhangi bir yer alıyorsa values = { "flag": "a" } eşleşir.

    values = { "myflag": "a,b" }, aynı şekilde çalışır: --myflag=a --myflag=b, --myflag=a --myflag=b --myflag=c, --myflag=a,b ve --myflag=c,b,a ile eşleşir. Anlamlar, işaretler arasında farklılık gösterir. Örneğin --copt, aynı örnekte birden fazla değeri desteklemez: --copt=a,b ["a,b"], --copt=a --copt=b ise ["a", "b"] oluşturur (böylece values = { "copt": "a,b" } ilkiyle eşleşir ancak ikincisiyle eşleşmez). Ancak --ios_multi_cpus (Apple kuralları için) üretir: -ios_multi_cpus=a,b ve ios_multi_cpus=a --ios_multi_cpus=b ["a", "b"] oluşturur. Beklenti tanımlarını kontrol edin ve beklentilerinizi doğru bir şekilde doğrulamak için koşullarınızı dikkatlice test edin.

  • Yerleşik derleme işaretleri tarafından modellenmeyen koşullar tanımlamanız gerekiyorsa Starlark tarafından tanımlanmış işaretleri kullanın. --define etiketini de kullanabilirsiniz ancak bu seçenek daha zayıf bir destek sunduğundan önerilmez. Daha fazla bilgi edinmek için buraya göz atın.
  • Aynı config_setting tanımlarını farklı paketlerde tekrarlamaktan kaçının. Bunun yerine standart bir pakette tanımlanan ortak bir config_setting referansına bakın.
  • values, define_values ve constraint_values, aynı config_setting öğesindeki herhangi bir kombinasyonda kullanılabilir. Ancak herhangi bir config_setting için en az bir tane ayarlanmalıdır.

Bağımsız değişkenler

Özellikler
name

Name; required

Bu hedef için benzersiz bir ad.

constraint_values

List of labels; optional; nonconfigurable

Hedef platformun bu config_setting ile eşleşmesi için belirtmesi gereken minimum constraint_values grubudur. (Yürütme platformu burada dikkate alınmaz.) Platformdaki ek kısıtlama değerleri yoksayılır. Ayrıntılar için Yapılandırılabilir Derleme Özellikleri bölümüne bakın.

İki config_setting öğesinin aynı select içinde eşleşmesi durumunda, bu özellik, config_setting öğelerinden birinin diğerinin uzmanlık alanı olup olmadığının belirlenmesi için dikkate alınmaz. Yani bir config_setting, bir platformdan diğeriyle daha güçlü bir şekilde eşleşemez.

define_values

Dictionary: String -> String; optional; nonconfigurable

values ile aynıdır, ancak özellikle --define işareti için kullanılır.

--define, özel söz dizimi (--define KEY=VAL) Bazel flag açısından değer olduğu için özeldir.

Bunun anlamı:

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

aynı anahtar (define) sözlükte iki kez göründüğünden çalışmaz. Bu özellik bu 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 bir şekilde eşleşiyor.

--define, normal işaret söz dizimiyle values içinde görünmeye devam edebilir ve sözlük anahtarları farklı kaldığı sürece bu özellikle birlikte kullanılabilir.

flag_values

Dictionary: label -> String; optional; nonconfigurable

values ile aynıdır ancak kullanıcı tarafından tanımlanan derleme işaretleri için kullanılır.

Bu, kullanıcı tanımlı flag'lere etiket olarak, yerleşik flag'lere de rastgele dizeler olarak başvurulduğu için ayrı bir özelliktir.

values

Dictionary: String -> String; optional; nonconfigurable

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

Bu kural, select ifadesinde başvurulan yapılandırılmış hedefin yapılandırmasını devralır. Sözlükteki her giriş için yapılandırmasının girişin beklenen değeriyle eşleşmesi durumunda Bazel çağrısı "eşleştirilir". Örneğin values = {"compilation_mode": "opt"}, hedef tarafından yapılandırılan kurallardaki bazel build --compilation_mode=opt ... ve bazel build -c opt ... çağrılarıyla eşleşir.

Kolaylık olması açısından, yapılandırma değerleri yapı işaretleri olarak (önceki "--" olmadan) belirtilir. Ancak ikisinin aynı olmadığını unutmayın. Bunun nedeni, hedeflerin aynı yapıda birden fazla yapılandırmada oluşturulabilmesidir. Örneğin, bir yürütme yapılandırmasının "cpu" parametresi --cpu değeriyle değil --host_cpu değeriyle eşleşir. Bu nedenle aynı config_setting öğesinin farklı örnekleri, bunları kullanan kuralın yapılandırmasına bağlı olarak aynı çağrıyla farklı şekilde eşleşebilir.

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

dosya grubu

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

Bir hedef koleksiyona kolay bir ad vermek için filegroup kullanın. Bunlara diğer kurallardan referans verilebilir.

Dizinleri doğrudan referans almak yerine filegroup kullanmanız önerilir. İkincisi, derleme sisteminin dizin altındaki tüm dosyalarla ilgili tam bilgiye sahip olmaması nedeniyle güvenilir değildir, bu nedenle bu dosyalar değiştiğinde yeniden oluşturulmayabilir. filegroup, glob ile birlikte kullanıldığında tüm dosyaların derleme sistemi tarafından açıkça bilinmesini sağlayabilir.

Örnekler

İki kaynak dosya içeren bir filegroup oluşturmak için:

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

Alternatif olarak, test verisi dizinini oluşturmak için glob kullanın:

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

Bu tanımlardan yararlanmak için herhangi bir kuraldan bir etiket kullanarak filegroup referansını kullanın:

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

Bağımsız değişkenler

Özellikler
name

Name; required

Bu hedef için benzersiz bir ad.

srcs

List of labels; optional

Dosya grubunun üyeleri olan hedeflerin listesi.

srcs özelliğinin değeri için glob ifadesinin kullanılması yaygın bir durumdur.

data

List of labels; optional

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

data özelliğinde adlandırılmış hedefler, bu filegroup kuralının runfiles bölümüne eklenecek. filegroup, başka bir kuralın data özelliğinde referans verildiğinde, runfiles özelliği bağlı kuralın runfiles öğesine eklenir. Veri dosyalarına bağımlı olma ve dosyaları kullanma hakkında daha fazla bilgi için veri bağımlılıkları bölümüne ve data için genel belgelere bakın.

output_group

String; optional

Kaynaklardan yapıların toplanacağı çıkış grubu. Bu özellik belirtilirse bağımlılıkların belirtilen çıkış grubundaki yapılar varsayılan çıkış grubu yerine dışa aktarılır.

"Çıkış grubu" bir hedefin çıkış yapılarının kategorisidir ve bu kuralın uygulanmasında belirtilir.

genquery

Kural kaynağını göster
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(), Blaze sorgu dilinde belirtilen bir sorguyu çalıştırır ve sonucu bir dosyaya aktarır.

Derlemenin tutarlılığını korumak için sorgunun yalnızca scope özelliğinde belirtilen hedeflerin geçici olarak kapanmasını ziyaret etmesine izin verilir. strict belirtilmezse veya doğru değerine ayarlanırsa bu kuralı ihlal eden sorgular başarısız olur (strict yanlışsa kapsam dışı hedefler uyarıyla atlanır). Bunun olmasını sağlamanın en kolay yolu, kapsamda sorgu ifadesindeki etiketlerden bahsetmektir.

Burada ve komut satırında izin verilen sorgular arasındaki tek fark, burada joker karakter hedefi spesifikasyonları (ör. //pkg:* veya //pkg:all) içeren sorgulara izin verilmediğidir. Bunun iki nedeni vardır: İlk olarak, genquery sorgudan geçen transkriptin dışında kalan hedeflerin çıkışını etkilemesini önleyecek bir kapsam belirtmesi gerekir ve ikincisi, BUILD dosyaları joker karakter bağımlılarını desteklemez (ör. deps=["//a/..."]'e izin verilmez).

Gengen çıktısı, belirleyici çıktıyı zorunlu kılmak için --order_output=full kullanılarak sıralanır.

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

Örnekler

Bu örnekte, belirtilen hedefin geçişli kapanmasındaki etiketlerin listesi bir dosyaya yazılır.

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

Bağımsız değişkenler

Özellikler
name

Name; required

Bu hedef için benzersiz bir ad.

expression

String; required

Yürütülecek sorgu. Komut satırı ve DERLE 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 :b etiketi, //:b hedefini belirtir.
opts

List of strings; optional

Sorgu motoruna aktarılan seçenekler. Bunlar, bazel query'e iletilebilecek komut satırı seçeneklerine karşılık gelir. Şu sorgu seçeneklerine izin verilmez: --keep_going, --query_file, --universe_scope, --order_results ve --order_output. Burada belirtilmeyen seçenekler, varsayılan değerleri bazel query gibi olacaktır.
scope

List of labels; required

Sorgunun kapsamı. Sorgunun, bu hedeflerin geçici olarak kapatılmasının dışında hedeflere dokunmasına izin verilmez.
strict

Boolean; optional; default is True

True (doğru) olduğunda, sorguları, kapsamlarını geçici olarak kapatma işleminden kaçan hedefler oluşturulamaz. Yanlış değerini döndürürse Bazel bir uyarı yazdırır ve sorgunun geri kalanı tamamlanırken, kapsam dışında kalan sorgu yolunu atlar.

Genrule

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

Genel kurallar, görev için belirli bir kural yoksa kullanabileceğiniz genel derleme kurallarıdır. Örneğin, bir Bash tek satırlık çalıştırabilirsiniz. Bununla birlikte, C++ dosyalarını derlemeniz gerekiyorsa zor işlerin tamamı sizin için zaten yapılmış olduğundan, mevcut cc_* kurallarına uyun.

Genrule'un komut bağımsız değişkenini yorumlamak için bir kabuk gerektirdiğini unutmayın. Ayrıca, PATH yolunda rastgele programlara referans vermek de kolaydır. Ancak bu komut, "hermetik" değildir ve yeniden oluşturulamaz. Yalnızca tek bir araç çalıştırmanız gerekiyorsa bunun yerine run_binary kullanmayı düşünebilirsiniz.

Test çalıştırmak için toplu etiket kullanmayın. Testler ve test sonuçları için önbelleğe alma politikaları ve ortam değişkenleri dahil olmak üzere özel kesintiler vardır. Testlerin genellikle derleme tamamlandıktan ve hedef mimaride yürütülmesi gerekirken, geliştirme kuralları derleme sırasında ve yürütme mimarisinde yürütülür (ikisi farklı olabilir). Genel amaçlı bir test kuralına ihtiyacınız varsa sh_test kullanın.

Derlemeyle İlgili Dikkat Edilmesi Gereken Noktalar

Çapraz derleme hakkında daha fazla bilgi için kullanıcı kılavuzuna bakın.

Oluşturma kuralları derleme sırasında çalıştırılırken, bunların çıkışı genellikle derlemeden sonra, dağıtım veya test için kullanılır. Mikrodenetleyici için C kodunu derleme örneğine bakın: Derleyici C kaynak dosyalarını kabul eder ve bir mikro denetleyici üzerinde çalışan kodu oluşturur. Oluşturulan kod, derleme için kullanılan CPU'da çalıştırılamaz ancak C derleyicinin (kaynaktan derlendiyse) yapması gerekir.

Derleme sistemi, derlemenin çalıştığı makineleri tanımlamak için exec yapılandırmasını ve derleme çıkışının çalışması gereken makineleri tanımlamak için hedef yapılandırmasını kullanır. Bunların her birini yapılandırma seçenekleri sunar ve çakışmaları önlemek için ilgili dosyaları ayrı dizinlere ayırır.

Genel kurallar için derleme sistemi, bağımlılıkların uygun şekilde derlenmesini sağlar: srcs, target yapılandırması için oluşturulur (gerekiyorsa), tools exec yapılandırması için oluşturulur ve çıktının target yapılandırması için olduğu kabul edilir. Ayrıca, rezervasyon komutlarının ilgili araçlara aktarabileceği "Oluşturma" değişkenleri de sağlar.

Çoğunluk, gencin hiçbir deps özelliğini tanımlamaması için tasarlanmıştır: Diğer yerleşik kurallar, bağımlı kuralların nasıl işleneceğini otomatik olarak belirlemek için kurallar arasında iletilen dile bağlı meta bilgiler kullanır. Bununla birlikte, genRules için bu otomasyon seviyesi mümkün değildir. Genel kurallar yalnızca dosya ve çalıştırma dosyaları düzeyinde çalışır.

Özel Durumlar

Exec-exec derlemesi: Bazı durumlarda derleme sisteminin, oluşturma işlemi sırasında da çıkışın yürütülebilmesi için kural kuralları çalıştırması gerekir. Örneğin bir popülasyonda, daha sonra başka bir kişi tarafından kullanılan bazı özel derleyiciler oluşturulursa ilki, derleyicinin çıkışını exec yapılandırması için üretmek zorundadır. Bu durumda derleme sistemi otomatik olarak doğru şeyi yapar: Yürütme yapılandırması için hedef yapılandırma yerine ilk pencerenin srcs ve outs değerlerini oluşturur. Daha fazla bilgi için kullanıcı kılavuzuna bakın.

JDK ve C++ Araçları: JDK veya C++ derleyici paketindeki bir aracı kullanmak için derleme sistemi, kullanılacak bir dizi değişken sağlar. Ayrıntılar için "Değişken" değişkeni bölümüne bakın.

Gengenle Ortamı

genrule komutu, set -e -o pipefail kullanılarak bir komut veya ardışık düzen başarısız olduğunda başarısız olacak şekilde yapılandırılan Bash kabuğu tarafından yürütülür.

Derleme aracı, Bash komutunu yalnızca PATH, PWD, TMPDIR gibi temel değişkenleri ve diğer birkaç değişkeni tanımlayan temiz bir işlem ortamında yürütür. Derlemelerin yeniden oluşturulabilir olmasını sağlamak için kullanıcının kabuk ortamında tanımlanan değişkenlerin çoğu, genolle komutuna aktarılmaz. Ancak Bazel (Blaze değil), kullanıcının PATH ortam değişkeninin değerini iletir. PATH değerindeki herhangi bir değişiklik, Bazel'ın sonraki derlemede komutu yeniden yürütmesine neden olur.

Düğüm komutu ağa şu anda erişmemelidir. Komutun alt öğeleri olan işlemler şu an için zorunlu değildir.

Derleme sistemi mevcut çıkış dosyalarını otomatik olarak siler ancak sorgu yürütmeden önce gerekli üst dizinleri oluşturur. Ayrıca herhangi bir hata durumunda çıkış dosyaları da kaldırılır.

Genel Tavsiye

  • Bir gengenin çalıştırdığı araçların belirleyici ve somut olduğundan emin olun. Çıkışlarına zaman damgaları yazmamalı, kümeler ve haritalar için sabit sıralama kullanmalı ve çıkış için yalnızca göreli dosya yolları yazmamalıdır. Bu kurala uyulmaması, beklenmedik derleme davranışına (Bazel sanacağını düşündüğünüz bir çıkıntıyı yeniden derlemez) yol açar ve önbellek performansını düşürür.
  • Çıkışlar, araçlar ve kaynaklar için $(location)'ı kapsamlı şekilde kullanın. Farklı yapılandırmalar için çıkış dosyalarının ayrılması nedeniyle, genel kurallar sabit kodlu ve/veya mutlak yollara güvenemez.
  • Aynı veya çok benzer genel kuralların birden fazla yerde kullanılması ihtimaline karşı yaygın bir Starlark makrosu yazın. Karmaşık bir karmaşıksa, komut dosyasına veya bir Starlark kuralı olarak uygulamayı deneyin. Bu, okunabilirliği ve test edilebilirliği iyileştirir.
  • Çıkış kodunun, bekarlığa ait başarıyı veya başarısızlığı doğru şekilde gösterdiğinden emin olun.
  • Stdout veya stderr'a bilgi mesajı yazmayın. Bu, hata ayıklama için kullanışlı olsa da kolayca gürültü oluşturabilir. Başarılı bir tür, sessiz olmalıdır. Diğer yandan, başarısız bir müdahalenin iyi hata mesajları vermesi gerekir.
  • $$ 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).
  • Simge bağlantıları ve dizinler oluşturmaktan kaçının. Bazel, genrules tarafından oluşturulan dizin/simlink bağlantısı yapısını kopyalamaz ve dizinler için bağımlı kontrolü güvenilir değildir.
  • Diğer kurallarda gösteriden bahsederken, dosyalaşma etiketini veya tek tek çıkış dosyalarının etiketlerini kullanabilirsiniz. Bazen bir yaklaşım daha okunabilirken bazen de bir diğer sonuçla karşılaşabilirsiniz: Bir tüketim kuralının srcs işlevinde çıkışlara adla referans verilmesi, kasıtlı olarak diğer erkeklerin çıktılarını istemeden toplamaktan kaçınır ancak algoritmanın çok sayıda çıkışı olması yorucu olabilir.

Örnekler

Bu örnekte foo.h oluşturulur. Komut herhangi bir giriş almadığı için kaynak yok. Komut tarafından çalıştırılan "binary" gengule aynı paketteki bir perl komut dosyasıdır.

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

Aşağıdaki örnekte filegroup nasıl kullanılacağı ve diğer genrule öğesinin sonuçları gösterilmektedir. Açık $(location) yönergeleri yerine $(SRCS) kullanmanın da işe yarayacağını unutmayın. Bu örnek, tanıtım amacıyla ikincisini kullanır.

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

Name; required

Bu hedef için benzersiz bir ad.


Bu kuralı, diğer BUILD kuralların srcs veya deps bölümünde ad kullanarak bulabilirsiniz. Kural kaynak dosyalar oluşturuyorsa bu srcs özelliğini kullanmanız gerekir.
srcs

List of labels; optional

İşlenecek kaynak dosyalar gibi bu kural için girişlerin listesi.

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

Derleme sistemi, bu ön koşulların oluşturma komutu çalıştırılmadan önce oluşturulduğundan emin olur. Orijinal derleme isteğiyle aynı yapılandırma kullanılarak oluşturulur. Bu ön koşullardaki dosyaların adları komutta $(SRCS) içindeki boşlukla ayrılmış bir liste olarak mevcuttur. Alternatif olarak, srcs bağımsız //x:y hedefinin yolu $(location //x:y) kullanılarak veya srcs içindeki tek giriş olması durumunda $< kullanılarak elde edilebilir.

outs

List of filenames; required; nonconfigurable

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

Çıktı dosyaları paket sınırlarını aşmamalıdır. Çıktı dosya adları, pakete göre yorumlanır.

executable işareti ayarlanmışsa outs tam olarak bir etiket içermelidir.

genrule komutunun, her çıkış dosyasını önceden belirlenmiş bir konumda oluşturması beklenir. cmd, jenerike özgü "Marka" değişkenleri ($@, $(OUTS), $(@D) veya $(RULEDIR)) kullanılarak ya da $(location) yerine

cmd

String; optional

Çalıştırılacak komut. $(location) ve "Oluşturma" değişkeni yerine geçer.
  1. İlk $(location) yerine, tüm $(location label) ve $(locations label) tekrarları (ve ilgili değişkenlerin kullanıldığı execpath, execpaths, rootpath ve rootpaths) benzer yapılar uygulandı.
  2. Ardından "Make" değişkenleri genişletilir. Önceden tanımlanmış $(JAVA), $(JAVAC) ve $(JAVABASE) değişkenlerinin exec yapılandırmasının altında genişlediğini unutmayın. Bu nedenle, bir derleme adımı kapsamında çalışan Java çağrıları, paylaşılan kitaplıkları ve diğer bağımlılıkları doğru şekilde yükleyebilir.
  3. Son olarak, elde edilen komut Bash kabuğu kullanılarak yürütülür. Çıkış kodu sıfır değilse komut başarısız olmuş sayılır.
Bunlardan hiçbiri geçerli değilse cmd_bash, cmd_ps ve cmd_bat yedeğidir.

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

cmd_bash

String; optional

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

Bu özelliğin önceliği cmd değerinden yüksektir. Komut genişletilir ve cmd özelliğiyle tam olarak aynı şekilde çalışır.

cmd_bat

String; optional

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

Bu özelliğin önceliği cmd ve cmd_bash aralığından daha yüksektir. Komut, cmd özellikleriyle benzer şekilde çalışır. Aşağıdaki farklılıklara sahiptir:

  • Bu özellik yalnızca Windows'da geçerlidir.
  • Komut, aşağıdaki varsayılan bağımsız değişkenlerle cmd.exe /c ile çalışıyor:
    • /S - ilk ve son tırnak işaretlerini kaldırıp diğer her şeyi olduğu gibi çalıştırın.
    • /E:ON - Genişletilmiş komut grubunu etkinleştir.
    • /V:ON - Gecikmeli değişken genişletmeyi etkinleştirin
    • /D - Otomatik çalıştırma kayıt defteri girişlerini yoksay.
  • $(location) ve "Make" değişkeni değiştirildikten sonra, yollar Windows stil yollarına (ters eğik çizgiyle) genişletilecektir.
cmd_ps

String; optional

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

Bu özelliğin önceliği cmd, cmd_bash ve cmd_bat arasında daha yüksektir. Komut, cmd özelliğiyle benzer şekilde çalışır. Aşağıdaki farklılıklara sahiptir:

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

Powershell'in kullanımını daha kolay ve hata olasılığını azaltmak amacıyla, Powershell komutunu yürütülmeden önce ortamı oluşturmak için aşağıdaki komutları çalıştırırız.

  • Set-ExecutionPolicy -Scope CurrentUser RemoteSigned - İmzasız komut dosyalarının çalıştırılmasına izin verin.
  • $errorActionPreference='Stop' - ; ile ayrılmış birden fazla komut olması durumunda, Powershell CmdAllow komutu başarısız olursa işlem hemen kapanır. Ancak bu komut, harici komut için ÇALIŞMAZ.
  • $PSDefaultParameterValues['*:Encoding'] = 'utf8' - utf-16 olan varsayılan kodlamayı utf-8 olarak değiştirin.
exec_tools

List of labels; optional

Kullanımdan kaldırıldı. Bunun yerine tools kullanın.

Bir süredir exec_tools ve tools farklı davranışlar sergiliyordu, ancak artık eşdeğerdirler ve Blaze ekibi tüm exec_tools kullanımlarını tools taşımaya başlayacaktır.

executable

Boolean; optional; nonconfigurable; default is False

Çıkışın yürütülebilir olduğunu bildirin.

Bu işaretin Doğru değerine ayarlanması, çıkışın yürütülebilir bir dosya olduğu ve run komutu kullanılarak çalıştırılabileceği anlamına gelir. Bu durumda türetim yalnızca bir çıktı üretmelidir. Bu özellik ayarlanırsa run, içeriği ne olursa olsun dosyayı yürütmeyi dener.

Oluşturulan yürütülebilir öğe için veri bağımlılığı beyan edilmesi desteklenmiyor.

local

Boolean; optional; default is False

Bu politika True (Doğru) değerine ayarlanırsa genrule değerini "yerel" stratejiyle çalışmaya zorlar. Bu da uzaktan yürütme, korumalı alan kullanmayacak ve kalıcı çalışan bulunmayacağı anlamına gelir.

Bu, etiket olarak "yerel"in kullanılmasıyla eşdeğerdir (tags=["local"]).

message

String; optional

İlerleme mesajı.

Bu derleme adımı yürütülürken yazdırılacak bir ilerleme durumu mesajı. Varsayılan olarak mesaj, "çıkış oluşturuluyor" (veya eşit derecede belirsiz bir şeydir) ancak daha spesifik bir mesaj verebilirsiniz. echo komutu veya cmd komutunuzda diğer yazdırma ifadeleri yerine bu özelliği kullanın. Bu sayede derleme aracı, bu tür ilerleme mesajlarının yazdırılıp yazdırılmayacağını kontrol edebilir.

output_licenses

Licence type; optional

Bkz. common attributes
output_to_bindir

Boolean; optional; nonconfigurable; default is False

Doğru değerine ayarlanırsa bu seçenek, çıkış dosyalarının genfiles dizini yerine bin dizinine yazılmasına neden olur.

tools

List of labels; optional

Bu kural için araç bağımlılıklarının listesi. Daha fazla bilgi için bağımlılıklar tanımını inceleyin.

Derleme sistemi, bu ön koşulların genrule komutunu çalıştırmadan önce derlenmesini sağlar. Bu araçlar derlemenin bir parçası olarak yürütüldüğü için exec yapılandırması kullanılarak oluşturulur. Tek bir tools hedefinin (//x:y) yolu, $(location //x:y) kullanılarak elde edilebilir.

cmd tarafından yürütülecek herhangi bir *_binary veya araç, bu yapılandırmada doğru oluşturulduğundan emin olmak için srcs yerine listede görünmelidir.

test_paketi

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

test_suite, kullanıcılar için "faydalı" olarak kabul edilen bir dizi testi tanımlar. Bu, projelerin "giriş yapmadan önce çalıştırmanız gereken testler", "projemizin stres testleri" veya "tüm küçük testler" gibi test gruplarını tanımlamasına olanak tanır. blaze test komutu bu tür bir kuruluşa saygı gösterir: Blaze, blaze test //some/test:suite gibi bir çağrı için önce //some/test:suite hedefi tarafından geçişli olarak dahil edilen tüm test hedeflerini ("test_paketi genişletme" olarak adlandırılır) sıralar, ardından Blaze bu hedefleri oluşturup test eder.

Örnekler

Mevcut paketteki tüm küçük testleri çalıştırmak için bir test paketi.

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

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

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

Mevcut paketteki güvenilir olmayan tüm testleri çalıştıracak bir test paketi.

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

Bağımsız değişkenler

Özellikler
name

Name; required

Bu hedef için benzersiz bir ad.

tags

List of strings; optional; nonconfigurable

"Küçük", "veritabanı" veya "-flaky" gibi metin etiketlerinin listesi. Etiketler herhangi bir geçerli dize olabilir.

"-" karakteriyle başlayan etiketler negatif etiket olarak kabul edilir. Önceki "-" karakteri etiketin bir parçası olarak kabul edilmez. Bu nedenle "-small" için bir etiket etiketi bir testin "küçük" boyutuyla eşleşir. Diğer tüm etiketler pozitif etiket olarak kabul edilir.

İsteğe bağlı olarak, pozitif etiketleri daha belirgin hale getirmek için etiket "+" karakteriyle de başlayabilir. Bu karakter, etiket metninin bir parçası olarak değerlendirilmez. Sadece pozitif ve negatif ayrımı daha kolay okunur.

Test paketine yalnızca pozitif etiketlerin tümüyle eşleşen ve negatif etiketlerin hiçbiri ile uyuşmayan test kuralları dahil edilir. Bunun, filtrelenen testlerde bağımlılık kontrolündeki hatanın atlandığı anlamına gelmediğini unutmayın.Atlanan testlerdeki bağımlılıkların da yasal olması gerekir (ör. görünürlük kısıtlamaları tarafından engellenmez).

manual etiketi anahtar kelimesi, blaze test joker karakter hedef kalıpları içeren çağrılarda gerçekleştirilen "test_ Suite genişletmesi" tarafından yukarıdakinden farklı şekilde işlenir. Burada, "manuel" olarak etiketlenmiş test_suite hedef filtrelenir ve böylece genişletilmez. Bu davranış, blaze build ve blaze test'nin genel olarak joker karakter hedef kalıplarını ele alma biçimiyle tutarlıdır. Süitlerde, manual etiketinden bağımsız olarak her zaman tests sorgu işlevi tarafından genişletildiği için bunun blaze query 'tests(E)' davranışından açıkça farklı olduğunu unutmayın.

Bir teste ait size öğesinin filtreleme amacıyla etiket olarak kabul edildiğini unutmayın.

Birlikte kullanılamayan etiketlerin bulunduğu testlere sahip bir test_suite'ye ihtiyacınız varsa (ör. tüm küçük ve orta testler) bir tane tüm küçük testler için bir, tüm orta testler için bir ve önceki iki testi içeren bir test_suite kuralı oluşturmanız gerekir.

tests

List of labels; optional; nonconfigurable

Herhangi bir dildeki test paketlerinin ve test hedeflerinin listesi.

Dilden bağımsız olarak burada *_test şartları kabul edilir. Test başlatsa bile *_binary hedefi kabul edilmez. Belirtilen tags değerine göre filtreleme, yalnızca bu özellikte doğrudan listelenen testler için yapılır. Bu özellik test_suite içeriyorsa bu testlerin içindeki testler, bu test_suite tarafından filtrelenmez (halihazırda filtrelenmiş olarak kabul edilir).

tests özelliği belirtilmemiş veya boşsa kural, varsayılan olarak geçerli DERLEME dosyasına manual olarak etiketlenmemiş tüm test kurallarını dahil edecektir. Bu kurallar tag filtrelemeye tabi olmaya devam eder.