Önceki bölümlerde paketler, hedefler, etiketler ve derleme bağımlılık grafiği soyut olarak açıklanmıştı. Bu bölümde, paket tanımlamak için kullanılan 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.
Bunlar, sıralı bir ifade 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ştirmeden 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 bir şekilde listeleyin.
En önemlisi, Starlark'taki programlar keyfi G/Ç işlemleri yapamaz. Bu değişmez durum, BUILD
dosyalarının yorumlanmasını hermetik hale getirir. Bu, derlemelerin yeniden üretilebilir olmasını sağlamak için gerekli olan yalnızca bilinen bir giriş grubuna bağlıdı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
, takma adları da destekler. Bu nedenle, içe aktarılan sembollere 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 sembol 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ı yükleyebilecek kişileri 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 dillerde ise aynı adlandırma şeması, farklı bir önekle (ör. Java için java_*
) kullanılır. Bu işlevlerden bazıları Ansiklopedi Oluşturma bölümünde belgelenmiştir, 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ü, doğrudan ortam değişkenini 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 |