Genel Kurallar

Kurallar

takma ad

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

alias kuralı, bir kuralın adlandırılacağı başka bir ad oluşturur.

Diğer ad oluşturma yalnızca "normal" hedefler için çalışır. Özellikle package_group ve test_suite için takma ad oluşturulamaz.

Takma ad kuralının kendi görünürlük bildirimi vardır. Diğer tüm açılardan, referans verdiği kural gibi davranır (ör.takma ad üzerindeki testonly yoksayılır; bunun yerine, referans verilen kuralın testonly özelliği kullanılır). Ancak bazı küçük istisnalar vardır:

  • Takma adları komut satırında belirtilen testler çalıştırılmaz. Referans verilen testi çalıştıran bir takma ad tanımlamak için test_suite kuralını tests özelliğinde tek bir hedefle kullanın.
  • Ortam grupları tanımlarken environment kurallarının takma adları desteklenmez. --target_environment komut satırı seçeneğinde de desteklenmez.

Ö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 referans verdiği hedef. Kural olması gerekmez, giriş dosyası da olabilir.

config_setting

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ğı hakkında bilgi edinmek için select, genel özelliklere genel bakış için Yapılandırılabilir özellikler başlıklı makaleyi inceleyin.

Örnekler

Aşağıdaki, --compilation_mode=opt veya -c opt değerini ayarlayan tüm derlemelerle eşleşir (komut satırında açıkça veya .bazelrc dosyalarından dolaylı olarak):

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

Aşağıdaki, ARM'yi hedefleyen ve özel tanımlamayı uygulayan tüm derlemelerle 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ğıdaki, user-defined flag'i ayarlayan tüm derlemelerle eşleşir --//custom_flags:foo=1 (komut satırında açıkça veya .bazelrc dosyalarından örtülü olarak):

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

Aşağıdaki, x86_64 mimarisine ve glibc sürüm 2.25'e sahip bir platformu hedefleyen tüm derlemelerle eşleşir. Bu eşleşme, //example:glibc_2_25 etiketli bir constraint_value öğesinin varlığı varsayılarak yapılır. Bir platform, bu ikisinin ötesinde ek kısıtlama değerleri tanımlasa bile eşleşmeye devam eder.

  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, bir hedefin bağımlı olduğu platformdan farklı bir platform için oluşturulması gerekebilir. Bu, bir config_setting üst düzey komut satırı işaretleriyle eşleşmese bile bazı derleme hedefleriyle eşleşebileceği anlamına gelir.

Notlar

  • Birden fazla config_setting mevcut yapılandırma durumuyla eşleştiğinde ne olacağını öğrenmek için select bölümüne bakın.
  • Kısa biçimleri destekleyen işaretler (ör. --compilation_mode ve -c) için values tanımları tam biçimde olmalıdır. Bunlar, her iki formu kullanan çağırmalarla otomatik olarak eşleşir.
  • Bir işaret birden fazla değer alıyorsa (ör. --copt=-Da --copt=-Db veya liste türünde bir Starlark işareti), "a" gerçek listede herhangi bir yerde bulunuyorsa values = { "flag": "a" } eşleşir.

    values = { "myflag": "a,b" } da aynı şekilde çalışır: Bu, --myflag=a --myflag=b, --myflag=a --myflag=b --myflag=c, --myflag=a,b ve --myflag=c,b,a ile eşleşir. Tam 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"] sonucunu verirken --copt=a --copt=b, ["a", "b"] sonucunu verir (bu nedenle values = { "copt": "a,b" }, ikincisiyle değil, ilkiyle eşleşir). Ancak --ios_multi_cpus (Apple kuralları için) şunu yapar: -ios_multi_cpus=a,b ve ios_multi_cpus=a --ios_multi_cpus=b ifadelerinin her ikisi de ["a", "b"] sonucunu verir. İşaret tanımlarını kontrol edin ve koşullarınızı dikkatlice test ederek beklentilerinizi doğrulayın.

  • Yerleşik derleme işaretleriyle modellenmeyen koşullar tanımlamanız gerekiyorsa Starlark ile tanımlanan işaretleri kullanın. --define da kullanabilirsiniz ancak bu daha zayıf destek sunar ve önerilmez. Daha fazla bilgi için buraya göz atın.
  • Farklı paketlerde aynı config_setting tanımlarını tekrarlamaktan kaçının. Bunun yerine, standart bir pakette tanımlanan ortak bir config_setting öğesine referans verin.
  • values, define_values ve constraint_values aynı config_setting içinde herhangi bir kombinasyonla kullanılabilir ancak herhangi bir config_setting için en az birinin ayarlanması gerekir.

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şmek için belirtmesi gereken minimum constraint_values kümesi. (Yürütme platformu burada dikkate alınmaz.) Platformun sahip olduğu ek kısıtlama değerleri yoksayılır. Ayrıntılar için Yapılandırılabilir Derleme Özellikleri başlıklı makaleyi inceleyin.

İki config_setting'nın aynı select'da eşleşmesi durumunda, bu özellik config_setting'lardan birinin diğerinin uzmanlık alanı olup olmadığını belirlemek için dikkate alınmaz. Diğer bir deyişle, bir config_setting, bir platformla diğerinden 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 geçerlidir.

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

Bu durumda:

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

aynı anahtar (define) sözlükte iki kez göründüğü için çalışmaz. Bu özellik, söz konusu sorunu çözer:

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

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

--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 serbestçe karıştırılabilir.

flag_values

Dictionary: label -> String; optional; nonconfigurable

values ile aynıdır ancak kullanıcı tanımlı derleme işaretleri için geçerlidir.

Kullanıcı tanımlı işaretler etiket olarak, yerleşik işaretler ise rastgele dizeler olarak referans verildiğinden bu ayrı bir özelliktir.

values

Dictionary: String -> String; optional; nonconfigurable

Bu kurala uyan yapılandırma değerleri grubu (derleme işaretleri olarak ifade edilir)

Bu kural, bir select ifadesinde kendisine referans veren yapılandırılmış hedefin yapılandırmasını devralır. Sözlükteki her giriş için yapılandırması girişin beklenen değeriyle eşleşiyorsa Bazel çağrısının "eşleştiği" kabul edilir. Örneğin, values = {"compilation_mode": "opt"}, hedef yapılandırılmış kurallarda bazel build --compilation_mode=opt ... ve bazel build -c opt ... çağırmalarıyla eşleşir.

Kolaylık sağlamak için yapılandırma değerleri derleme işaretleri olarak (önünde "--" olmadan) belirtilir. Ancak ikisinin aynı olmadığını unutmayın. Bunun nedeni, hedeflerin aynı derlemede birden fazla yapılandırmada oluşturulabilmesidir. Örneğin, bir ana makine yapılandırmasının "cpu" değeri --cpu değil, --host_cpu ile eşleşir. Bu nedenle, aynı config_setting öğesinin farklı örnekleri, bunları kullanan kuralın yapılandırmasına bağlı olarak aynı çağırmayla 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 fazla kez görünüyorsa yalnızca son örnek kullanılır. Bir anahtar, komut satırında birden çok kez ayarlanabilen bir işareti (ör. bazel build --copt=foo --copt=bar --copt=baz ...) referans alıyorsa bu ayarlardan herhangi biri eşleştiğinde eşleşme gerçekleşir.

filegroup

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

Bir hedef koleksiyonuna uygun bir ad vermek için filegroup simgesini kullanın. Bu değerlere daha sonra diğer kurallardan referans verilebilir.

Dizinlere doğrudan referans vermek yerine filegroup kullanılması önerilir. Derleme sistemi, dizinin altındaki tüm dosyalar hakkında tam bilgiye sahip olmadığından bu dosyalar değiştiğinde yeniden derleme yapmayabilir. Bu nedenle, ikinci yöntem güvenilir değildir. glob ile birlikte kullanıldığında filegroup, tüm dosyaların derleme sistemi tarafından açıkça bilinmesini sağlayabilir.

Örnekler

İki kaynak dosyasından oluşan bir filegroup oluşturmak için

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

Alternatif olarak, bir testdata dizinini taramak 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 alınan bir etiketle filegroup öğesine referans verin:

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 üyesi olan hedeflerin listesi.

srcs özelliğinin değeri için glob ifadesinin sonucunu kullanmak yaygındır.

data

List of labels; optional

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

data özelliğinde belirtilen hedefler, bu filegroup kuralının runfiles bölümüne eklenir. filegroup, başka bir kuralın data özelliğinde referans olarak kullanıldığında runfiles, bağımlı kuralın runfiles özelliğine eklenir. Veri dosyalarına nasıl bağlı kalacağınız ve bunları nasıl kullanacağınız hakkında daha fazla bilgi için veri bağımlılıkları bölümünü ve data'ın genel dokümanlarını inceleyin.

output_group

String; optional

Kaynaklardan yapıtları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ıtlarının kategorisidir ve bu kuralın uygulamasında belirtilir.

genquery

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ı kalması için sorgunun yalnızca scope özelliğinde belirtilen hedeflerin geçişli kapanışını ziyaret etmesine izin verilir. Bu kuralı ihlal eden sorgular, yürütme sırasında başarısız olur. Bu durum, strict belirtilmemişse veya doğruysa geçerlidir (strict yanlışsa kapsam dışı hedefler uyarı verilerek atlanır). Bu durumun yaşanmaması için en kolay yöntem, sorgu ifadesindekiyle aynı etiketleri kapsamda belirtmektir.

Burada ve komut satırında izin verilen sorgular arasındaki tek fark, joker karakter hedef spesifikasyonları (ör. //pkg:* veya //pkg:all) içeren sorgulara burada izin verilmemesidir. Bunun iki nedeni vardır: Birincisi, genquery, sorgunun geçişli kapanışının dışındaki hedeflerin çıkışını etkilemesini önlemek için bir kapsam belirtmelidir.İkincisi ise BUILD dosyaları, joker karakter bağımlılıklarını desteklemez (ör. deps=["//a/..."] kullanılamaz).

Genquery'nin çıkışı, deterministik çıkışı 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 örnek, belirtilen hedefin geçişli kapanımındaki etiketlerin listesini bir dosyaya yazar.

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ı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 özellikteki :b etiketi, //:b hedefini ifade eder.
opts

List of strings; optional

Sorgu motoruna iletilen seçenekler. Bunlar, bazel query'ya iletilebilen komut satırı seçeneklerine karşılık gelir. Burada bazı sorgu seçeneklerine izin verilmez: --keep_going, --query_file, --universe_scope, --order_results ve --order_output. Burada belirtilmeyen seçenekler, bazel query komut satırında olduğu gibi varsayılan değerlere sahip olur.
scope

null; required

Sorgunun kapsamı. Sorgunun, bu hedeflerin geçişli kapanımının dışındaki hedeflere dokunmasına izin verilmez.
strict

Boolean; optional; default is True

Doğruysa sorguları kapsamlarının geçişli kapanışından kaçan hedefler oluşturulamaz. Yanlışsa Bazel bir uyarı yazdırır ve sorgunun geri kalanını tamamlarken sorgu yolunun kapsam dışına çıkmasına neden olan kısmı atlar.

genrule

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

genrule, kullanıcı tanımlı bir Bash komutu kullanarak bir veya daha fazla dosya oluşturur.

Genrules, görev için belirli bir kural yoksa kullanabileceğiniz genel derleme kurallarıdır. Örneğin, tek satırlık bir Bash komutu çalıştırabilirsiniz. Ancak C++ dosyalarını derlemeniz gerekiyorsa mevcut cc_* kurallarına uymanız gerekir. Çünkü ağır işlerin tümü sizin için yapılmıştır.

Testleri çalıştırmak için genrule kullanmayın. Önbelleğe alma politikaları ve ortam değişkenleri de dahil olmak üzere testler ve test sonuçları için özel muafiyetler vardır. Testlerin genellikle derleme tamamlandıktan sonra ve hedef mimaride çalıştırılması gerekirken genrule'lar derleme sırasında ve ana makine mimarisinde (ikisi farklı olabilir) yürütülür. Genel amaçlı bir test kuralına ihtiyacınız varsa sh_test kuralını kullanın.

Çapraz Derlemeyle İlgili Dikkat Edilmesi Gerekenler

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

Genrules, derleme sırasında çalıştırılır ancak çıktıları genellikle derlemeden sonra dağıtım veya test için kullanılır. Mikrodenetleyici için C kodu derleme örneğini ele alalım: Derleyici, C kaynak dosyalarını kabul eder ve mikrodenetleyicide çalışan kod oluşturur. Oluşturulan kod, oluşturulmasında kullanılan CPU'da çalışamaz ancak C derleyicinin (kaynaktan derlendiyse) çalışması gerekir.

Derleme sistemi, derlemenin üzerinde çalıştığı makineyi/makineleri tanımlamak için ana makine yapılandırmasını, derlemenin çıktısının üzerinde çalışması gereken makineyi/makineleri tanımlamak için ise hedef yapılandırmayı kullanır. Bu seçeneklerin her birini yapılandırma imkanı sunar ve çakışmaları önlemek için ilgili dosyaları ayrı dizinlere ayırır.

Derleme sistemi, genrules için bağımlılıkların uygun şekilde oluşturulmasını sağlar: srcs Hedef yapılandırması için (gerekirse) oluşturulur, tools Ana makine yapılandırması için oluşturulur ve çıkışın hedef yapılandırması için olduğu kabul edilir. Ayrıca, genrule komutlarının ilgili araçlara iletebileceği "Make" değişkenleri de sağlar.

Genrule'da deps özelliği tanımlanmaması kasıtlıdır: Diğer yerleşik kurallar, bağımlı kuralların nasıl işleneceğini otomatik olarak belirlemek için kurallar arasında aktarılan dile bağlı meta bilgileri kullanır ancak genrule'larda bu düzeyde bir otomasyon mümkün değildir. Genrules yalnızca dosya ve runfiles düzeyinde çalışır.

Özel Durumlar

Ana makine-ana makine derlemesi: Bazı durumlarda, derleme sisteminin, çıkışın derleme sırasında da yürütülebileceği şekilde genrule'ları çalıştırması gerekir. Örneğin, bir genrule daha sonra başka bir genrule tarafından kullanılan özel bir derleyici oluşturuyorsa, derleyici diğer genrule'da çalışacağı için birincisi çıkışını ana makine yapılandırması için üretmelidir. Bu durumda, derleme sistemi doğru şeyi otomatik olarak yapar: hedef yapılandırma yerine ana makine yapılandırması için ilk genrule'un srcs ve outs öğelerini oluşturur. Daha fazla bilgi için kullanım kılavuzuna bakın.

JDK ve C++ Araçları: JDK veya C++ derleyici paketinden bir araç kullanmak için derleme sistemi, kullanılacak bir dizi değişken sağlar. Ayrıntılar için "Marka" değişkenine bakın.

Genrule Ortamı

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

Derleme aracı, yalnızca PATH, PWD, TMPDIR gibi temel değişkenleri ve birkaç değişkeni daha tanımlayan temizlenmiş bir işlem ortamında Bash komutunu yürütür. Derlemelerin yeniden üretilebilir olmasını sağlamak için kullanıcının kabuk ortamında tanımlanan değişkenlerin çoğu genrule'un komutuna iletilmez. Ancak Bazel (Blaze değil), 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 bir sonraki derlemede yeniden yürütmesine neden olur.

Bir genrule komutu, şu anda zorunlu kılınmamış olsa da komutun alt işlemleri olan süreçleri bağlamak dışında ağa erişmemelidir.

Derleme sistemi, mevcut tüm çıkış dosyalarını otomatik olarak siler ancak bir genrule çalıştırmadan önce gerekli üst dizinleri oluşturur. Ayrıca, başarısızlık durumunda tüm çıkış dosyalarını kaldırır.

Genel Tavsiye

  • Genrule tarafından çalıştırılan araçların deterministik ve hermetik olduğundan emin olun. Çıkışlarına zaman damgaları yazmamalı, kümeler ve haritalar için sabit sıralama kullanmalı ve çıkışa yalnızca göreli dosya yollarını yazmalı, mutlak yolları yazmamalıdır. Bu kurala uyulmaması durumunda: Beklenmedik derleme davranışları (Bazel'in, derleyeceğini düşündüğünüz bir genrule'u yeniden derlememesi) ortaya çıkar. Önbellek performansı düşer.
  • Çıkışlar, araçlar ve kaynaklar için $(location)'ı kapsamlı bir şekilde kullanın. Farklı yapılandırmalar için çıkış dosyalarının ayrılması nedeniyle, genrules sabit kodlanmış ve/veya mutlak yollara dayanamaz.
  • Aynı veya çok benzer genrule'lar birden fazla yerde kullanılıyorsa ortak bir Starlark makrosu yazın. Genrule karmaşıksa bunu bir komut dosyasında veya Starlark kuralı olarak uygulamayı düşünebilirsiniz. Bu, okunabilirliğin yanı sıra test edilebilirliği de artırır.
  • Çıkış kodunun, genrule'un başarılı veya başarısız olduğunu doğru şekilde gösterdiğinden emin olun.
  • stdout veya stderr'ye bilgilendirici mesajlar yazmayın. Hata ayıklama için yararlı olsa da bu kolayca gürültüye dönüşebilir. Başarılı bir genrule sessiz olmalıdır. Öte yandan, başarısız olan bir genrule 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).
  • Sembolik bağlantılar ve dizinler oluşturmaktan kaçının. Bazel, genrules tarafından oluşturulan dizin/sembolik bağlantı yapısını kopyalamaz ve dizinlerin bağımlılık kontrolü güvenilir değildir.
  • Diğer kurallarda genrule'a referans verirken genrule'un etiketini veya tek tek çıkış dosyalarının etiketlerini kullanabilirsiniz. Bazen bir yaklaşım daha okunabilir olur, bazen de diğeri: Tüketici kuralının srcs bölümünde çıkışlara adlarıyla referans vermek, genrule'un diğer çıkışlarının yanlışlıkla alınmasını önler ancak genrule çok sayıda çıkış üretiyorsa bu işlem sıkıcı olabilir.

Örnekler

Bu örnek foo.h oluşturur. Komut herhangi bir giriş almadığı için kaynak yoktur. Komut tarafından çalıştırılan "binary", genrule ile 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 ve başka bir genrule öğesinin çıkışlarının nasıl kullanılacağı gösterilmektedir. Açık $(location) yönergeleri yerine $(SRCS) kullanmanın da işe yarayacağını unutmayın. Bu örnekte, gösterim amacıyla ikincisi kullanılmıştı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 kurala, diğer BUILD kurallarının srcs veya deps bölümünde adıyla atıfta bulunabilirsiniz. Kural kaynak dosyalar oluşturuyorsa srcs özelliğini kullanmanız gerekir.
srcs

List of labels; optional

Bu kuralın girişlerinin listesi (ör. işlenecek kaynak dosyalar).

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

Derleme sistemi, bu ön koşulların genrule komutu çalıştırılmadan önce oluşturulmasını sağlar. Bu ön koşullar, orijinal derleme isteğiyle aynı yapılandırma kullanılarak oluşturulur. Bu ön koşulların dosyalarının adları, komuta $(SRCS) içinde boşlukla ayrılmış bir liste olarak sağlanır. Alternatif olarak, tek bir srcs hedefinin //x:y yolu $(location //x:y) kullanılarak veya srcs'deki tek giriş olması koşuluyla $< kullanılarak elde edilebilir.

outs

List of filenames; required; nonconfigurable

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

Çıkış dosyaları paket sınırlarını aşmamalıdır. Çıkış dosyası 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. Konum, cmd içinde kurala özel "Marka" değişkenleri ($@, $(OUTS), $(@D) veya $(RULEDIR)) ya da $(location) yerine koyma kullanılarak kullanılabilir.

cmd

String; optional

Çalıştırılacak komut. $(location) ve "Make" değişkeni yerine koyma işlemine tabidir.
  1. İlk $(location) değiştirme işlemi uygulanarak $(location label) ve $(locations label) (ve benzeri yapılar, ilgili değişkenler execpath, execpaths, rootpath ve rootpaths kullanılarak) tüm oluşumları değiştirilir.
  2. Ardından, "Marka" değişkenleri genişletilir. $(JAVA), $(JAVAC) ve $(JAVABASE) önceden tanımlanmış değişkenlerinin ana makine yapılandırması altında genişlediğini unutmayın. Bu nedenle, derleme adımının bir parçası olarak ç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, ortaya çıkan komut Bash kabuğu kullanılarak yürütülür. Çıkış kodu sıfır değilse komutun başarısız olduğu kabul edilir.
Bu, cmd_bash, cmd_ps ve cmd_bat için yedek seçenektir. Bu seçeneklerden hiçbiri geçerli değilse kullanılır.

Komut satırı uzunluğu platform sınırını (Linux/macOS'te 64K, Windows'da 8K) aşarsa genrule, komutu bir komut dosyasına yazar ve bu komut dosyasını çalıştırarak sorunu çözer. 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 özellik, cmd özelliğinden daha yüksek önceliğe sahiptir. Komut genişletilir ve cmd özelliğiyle aynı şekilde çalışır.

cmd_bat

String; optional

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

Bu özellik, cmd ve cmd_bash özelliklerine göre daha yüksek önceliğe sahiptir. Komut, cmd özelliğiyle benzer şekilde çalışır. Ancak aşağıdaki farklılıklar vardır:

  • 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ışır:
    • /S - İlk ve son tırnak işaretlerini kaldırıp diğer her şeyi olduğu gibi yürüt.
    • /E:ON - Genişletilmiş komut kümesini etkinleştirin.
    • /V:ON - değişken genişletmeyi geciktirmeyi etkinleştirme
    • /D - AutoRun kayıt defteri girişlerini yoksay.
  • $(location) ve "Marka" değişkeni değiştirildikten sonra yollar, Windows tarzı yollara (ters eğik çizgiyle) genişletilir.
cmd_ps

String; optional

Windows'ta çalıştırılacak PowerShell komutu.

Bu özellik, cmd, cmd_bash ve cmd_bat özelliklerinden daha yüksek önceliğe sahiptir. Komut, cmd özelliğiyle benzer şekilde çalışır ancak aşağıdaki farklılıklar vardır:

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

Powershell'in daha kolay kullanılabilmesi ve daha az hata içermesi için, genrule'da Powershell komutunu yürütmeden önce ortamı ayarlamak üzere 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 varsa bir PowerShell CmdLet'i başarısız olduğunda işlem hemen sonlandırılır. Ancak bu, harici komut için GEÇERLİ DEĞİLDİR.
  • $PSDefaultParameterValues['*:Encoding'] = 'utf8' - Varsayılan kodlamayı utf-16'dan utf-8'e değiştirin.
exec_tools

List of labels; optional

Bu kural için araç bağımlılıklarının listesi. Bu, tools özelliğiyle aynı şekilde çalışır. Ancak bu bağımlılıklar, ana makine yapılandırması yerine kuralın yürütme platformu için yapılandırılır. Yani exec_tools içindeki bağımlılıklar, tools içindeki bağımlılıklarla aynı sınırlamalara tabi değildir. Özellikle, kendi geçişli bağımlılıkları için ana makine yapılandırmasını kullanmaları gerekmez. Daha fazla bilgi için tools sayfasına bakın.

Blaze ekibi, tools kullanımının tamamını exec_tools semantiğini kullanacak şekilde taşıyor. Kullanıcıların, herhangi bir soruna neden olmadığı durumlarda exec_tools yerine tools kullanması önerilir. İşlevsel taşıma işlemi tamamlandıktan sonra exec_tools öğesini tools olarak yeniden adlandırabiliriz. Bu değişiklik yapılmadan önce desteğin sonlandırılmasıyla ilgili bir uyarı ve taşıma talimatları alırsınız.

executable

Boolean; optional; nonconfigurable; default is False

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

Bu işaretin True olarak 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 genrule tam olarak bir çıkış üretmelidir. Bu özellik ayarlanırsa run, dosyanın içeriğine bakılmaksızın yürütülmeye çalışılır.

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

local

Boolean; optional; default is False

Doğru olarak ayarlanırsa bu seçenek, genrule öğesinin "yerel" stratejisi kullanılarak çalıştırılmasını zorlar. Bu durumda uzaktan yürütme, korumalı alan ve kalıcı çalışanlar olmaz.

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

message

String; optional

İlerleme mesajı

Bu derleme adımı yürütülürken yazdırılacak bir ilerleme mesajı. Varsayılan olarak, mesaj "Çıkış oluşturuluyor" (veya benzer şekilde sıkıcı bir mesaj) şeklindedir ancak daha spesifik bir mesaj sağlayabilirsiniz. Bu özelliği, echo komutunuzdaki cmd veya diğer yazdırma ifadeleri yerine kullanın. Bu sayede, derleme aracının bu tür ilerleme mesajlarının yazdırılıp yazdırılmayacağını kontrol etmesine olanak tanınır.

output_licenses

Licence type; optional

common attributes başlıklı makaleyi inceleyin.
output_to_bindir

Boolean; optional; nonconfigurable; default is False

True olarak 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ına bakın.

Derleme sistemi, genrule komutu çalıştırılmadan önce bu ön koşulların karşılanmasını sağlar. Bu araçlar derlemenin bir parçası olarak yürütüldüğünden, host yapılandırması kullanılarak oluşturulur. Tek bir tools hedef //x:y yolu, $(location //x:y) kullanılarak elde edilebilir.

cmd tarafından yürütülecek tüm *_binary veya araçlar, doğru yapılandırmada oluşturulduklarından emin olmak için srcs'de değil, bu listede görünmelidir.

test_suite

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

test_suite, insanlar için "faydalı" olduğu düşünülen bir dizi testi tanımlar. Bu özellik, projelerin "check-in işleminden önce çalıştırmanız gereken testler", "projemizin yük testleri" veya "tüm küçük testler" gibi test kümeleri tanımlamasına olanak tanır. blaze test komutu bu tür bir sıralamaya uyar: blaze test //some/test:suite gibi bir çağırma işleminde Blaze önce //some/test:suite hedefi tarafından geçişli olarak dahil edilen tüm test hedeflerini numaralandırır (buna "test_suite genişletme" diyoruz), ardından Blaze bu hedefleri oluşturur ve test eder.

Örnekler

Mevcut paketteki tüm küçük testleri çalıştırmak için kullanılan 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 paketteki kararsız 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

Name; required

Bu hedef için benzersiz bir ad.

tags

List of strings; optional; nonconfigurable

"small" veya "database" ya da "-flaky" gibi metin etiketlerinin listesi. Etiketler, geçerli herhangi bir dize olabilir.

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

İsteğe bağlı olarak, pozitif etiketleri daha açık hale getirmek için etiketler "+" karakteriyle de başlayabilir. Bu karakter, etiketin metninin bir parçası olarak değerlendirilmez. Bu yalnızca olumlu ve olumsuz ayrımını okumayı kolaylaştırır.

Test paketine yalnızca pozitif etiketlerin tümüyle ve negatif etiketlerin hiçbiriyle eşleşen test kuralları dahil edilir. Bunun, filtrelenen testlere bağımlılıklarla ilgili hata kontrolünün atlandığı anlamına gelmediğini unutmayın.Atlanan testlere bağımlılıkların yine de geçerli olması gerekir (ör. görünürlük kısıtlamaları tarafından engellenmemelidir).

manual etiket anahtar kelimesi, joker karakter içeren çağrılarda blaze test komutu tarafından gerçekleştirilen "test_suite genişletme" işlemiyle yukarıdakilerden farklı şekilde ele alınır. Burada, "manuel" olarak etiketlenen test_suite hedefleri filtrelenir (bu nedenle genişletilmez). Bu davranış, blaze build ve blaze test'nin genel olarak joker hedef kalıplarını ele alma şekliyle tutarlıdır. Bunun, blaze query 'tests(E)' davranışından açıkça farklı olduğunu unutmayın. Paketler, manual etiketinden bağımsız olarak her zaman tests sorgu işleviyle genişletilir.

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

Birbirini dışlayan etiketlere sahip testler içeren bir test_suite oluşturmanız gerekiyorsa (ör. tüm küçük ve orta testler) üç test_suite kuralı oluşturmanız gerekir: biri tüm küçük testler için, biri tüm orta testler için ve biri de önceki iki kuralı içeren.

tests

List of labels; optional; nonconfigurable

Herhangi bir dildeki test paketlerinin ve test hedeflerinin listesi.

Dilinden bağımsız olarak tüm *_test burada kabul edilir. Ancak, test çalıştırsalar bile *_binary hedef kabul edilmez. Belirtilen tags ile filtreleme yalnızca doğrudan bu özellikte listelenen testler için yapılır. Bu özellik test_suite içeriyorsa bunların içindeki testler bu test_suite ile filtrelenmez (zaten filtrelenmiş olarak kabul edilir).

tests özelliği belirtilmemişse veya boşsa kural, varsayılan olarak geçerli BUILD dosyasındaki manual olarak etiketlenmemiş tüm test kurallarını içerecek şekilde ayarlanır. Bu kurallar, tag filtrelemeye tabidir.