DERLEME dosyaları

Önceki bölümlerde paketler, hedefler, etiketler ve derleme bağımlılık grafiği soyut olarak açıklanmıştı. Bu bölümde bir paketi tanımlamak için kullanılan kesin söz dizimi açıklanmaktadır.

Tanım gereği her paket, kısa bir program olan bir BUILD dosyası içerir. BUILD dosyaları, Starlark adlı zorunlu bir dil kullanılarak değerlendirilir.

İfadelerin sıralı bir listesi olarak yorumlanır.

Genel olarak sıra önemlidir: Örneğin, değişkenler kullanılmadan önce tanımlanmalıdır. Ancak çoğu BUILD dosyası yalnızca derleme kurallarının beyanlarından oluşur ve bu beyanların göreceli sırası önemli değildir. Önemli olan, paket değerlendirmesi tamamlandığında hangi kuralların ve hangi değerlerle beyan edildiğidir.

cc_library gibi bir kural oluşturma işlevi yürütüldüğünde grafikte yeni bir hedef oluşturulur. Bu hedef daha sonra bir etiket kullanılarak referans verilebilir.

Basit BUILD dosyalarında, kural bildirimleri davranış değiştirilmeden serbestçe yeniden sıralanabilir.

Kod ile veriler arasında net bir ayrım yapılmasını sağlamak için BUILD dosyalarında işlev tanımları, for ifadeleri veya if ifadeleri bulunamaz (ancak liste kapsamları ve if ifadelerine izin verilir). İşlevler bunun yerine .bzl dosyalarında tanımlanabilir. Ayrıca, BUILD dosyalarında *args ve **kwargs bağımsız değişkenlerine izin verilmez. Bunun yerine tüm bağımsız değişkenleri açıkça listeleyin.

En önemlisi, Starlark'taki programlar keyfi G/Ç işlemleri yapamaz. Bu değişken, BUILD dosyalarının yorumlanmasını hermetik hale getirir. Bu, yalnızca bilinen bir giriş kümesine bağlıdır. Girişlerin tekrar üretilebilir olmasını sağlamak için bu şarttır. Daha fazla bilgi için Hermeticity bölümünü inceleyin.

BUILD dosyaları yalnızca ASCII karakterleri kullanılarak yazılmalıdır ancak teknik olarak Latin-1 karakter kümesi kullanılarak yorumlanır.

Temel kodun bağımlılıkları değiştiğinde BUILD dosyalarının güncellenmesi gerektiğinden, bu dosyalar genellikle ekipteki birden fazla kişi tarafından yönetilir. BUILD dosyası yazarları, her derleme hedefini (herkese açık kullanıma yönelik olup olmadığına bakılmaksızın) ve paketin kendisinin rolünü belgelemek için bolca yorum yapmalıdır.

Uzantıyı yükleme

Bazel uzantıları .bzl ile biten dosyalardır. Bir uzantıdan simge içe aktarmak için load ifadesini kullanın.

load("//foo/bar:file.bzl", "some_library")

Bu kod, foo/bar/file.bzl dosyasını yükler ve some_library simgesini ortama ekler. Bu, yeni kurallar, işlevler veya sabitler (ör. dize veya liste) yüklemek için kullanılabilir. load çağrısına ek bağımsız değişkenler ekleyerek birden fazla simge içe aktarılabilir. Bağımsız değişkenler dize değişmezleri (değişken içeremez) olmalıdır ve load ifadeleri üst düzeyde görünmelidir. İşlev gövdesinde görünemezler.

load işlevinin ilk bağımsız değişkeni, .bzl dosyasını tanımlayan bir etiket bağımsız değişkenidir. Göreli bir etiketse geçerli bzl dosyasını içeren pakete (dizin değil) göre çözülür. load ifadelerindeki göreli etiketler, : ile başlamalıdır.

load ayrıca takma adları da destekler. Bu nedenle, içe aktarılan simgelere farklı adlar atayabilirsiniz.

load("//foo/bar:file.bzl", library_alias = "some_library")

Bir load ifadesi içinde birden fazla takma ad tanımlayabilirsiniz. Ayrıca, bağımsız değişken listesi hem takma adları hem de normal simge adlarını içerebilir. Aşağıdaki örnek tamamen yasaldır (tırnak işaretlerinin ne zaman kullanılacağına dikkat edin).

load(":my_rules.bzl", "some_rule", nice_alias = "some_other_rule")

Bir .bzl dosyasında _ ile başlayan simgeler dışa aktarılmaz ve başka bir dosyadan yüklenemez.

.bzl dosyasını kimlerin yükleyebileceğini kısıtlamak için yükleme görünürlüğünü kullanabilirsiniz.

Derleme kuralı türleri

Derleme kurallarının çoğu, dile göre gruplandırılmış aileler halinde gelir. Örneğin, cc_binary, cc_library ve cc_test sırasıyla C++ ikili dosyaları, kitaplıklar ve testler için derleme kurallarıdır. Diğer diller aynı adlandırma şemasını farklı bir ön ek kullanarak kullanır (ör. Java için java_*). Bu işlevlerden bazıları Build Encyclopedia'da açıklanmıştır ancak herkes yeni kurallar oluşturabilir.

  • *_binary kuralları, belirli bir dilde yürütülebilir programlar oluşturur. Derleme işleminden sonra yürütülebilir dosya, derleme aracının ikili çıkış ağacında kuralın etiketine karşılık gelen adda bulunur. Bu nedenle //my:program, (örneğin) $(BINDIR)/my/program adresinde görünür.

    Bazı dillerde bu tür kurallar, kurala ait bir dataözniteliğinde veya bağımlılıklarının geçişli kapatma kapsamındaki herhangi bir kuralda belirtilen tüm dosyaları içeren bir runfiles dizini de oluşturur. Bu dosya grubu, üretime dağıtımı kolaylaştırmak için tek bir yerde toplanır.

  • *_test kuralları, otomatik test için kullanılan bir *_binary kuralının özelleştirilmiş halidir. Testler, başarılı olduğunda sıfır döndüren programlardır.

    Testler de ikili dosyalar gibi çalıştırma dosyası ağaçlarına sahiptir ve testin çalışma zamanında meşru olarak açabileceği tek dosyalar bu ağaçların altındaki dosyalardır. Örneğin, cc_test(name='x', data=['//foo:bar']) programı yürütülürken $TEST_SRCDIR/workspace/foo/bar dosyasını açabilir ve okuyabilir. (Her programlama dilinin, $TEST_SRCDIR değerine erişmek için kendi yardımcı işlevi vardır ancak bunların tümü, ortam değişkenini doğrudan kullanmaya eşdeğerdir.) Kuralın gözetilmemesi, uzak bir test ana makinesinde çalıştırıldığında testin başarısız olmasına neden olur.

  • *_library kuralları, belirli bir programlama dilinde ayrı olarak derlenmiş modülleri belirtir. Kitaplıklar diğer kitaplıklara, ikili dosyalar ve testler ise kitaplıklara bağlı olabilir. Bu durumda, ayrı derleme davranışı beklenir.

Etiketler Bağımlılıklar