Ö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ı, zorunlu bir dil olan Starlark 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. Bununla birlikte, çoğu BUILD
dosyası yalnızca derleme kuralı beyanlarından oluşur ve bu ifadelerin göreli sırası önemsizdir. Önemli olan, paketin değerlendirilmesinin tamamlandığı zamana kadar hangi kuralların ve hangi değerlerle bildirildiğidir.
cc_library
gibi bir derleme kuralı işlevi yürütüldüğünde grafikte yeni bir hedef oluşturulur. Bu hedef daha sonra bir etiket kullanılarak yönlendirilebilir.
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ı teşvik etmek için BUILD
dosyaları; işlev tanımları, for
ifadeleri veya if
ifadeleri içeremez (ancak liste anlamaları 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.
Daha da önemlisi, Starlark'taki programlar rastgele G/Ç gerçekleştiremez. 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 yeniden üretilebilir olmasını sağlamak için bu şarttır.
Daha fazla bilgi için Hermetiklik bölümünü inceleyin.
BUILD
dosyaları, teknik olarak Latin-1 karakter kümesi kullanılarak yorumlansa da yalnızca ASCII karakterleri kullanılarak yazılmalıdır.
Temeldeki kod bağımlılığı her değiştiğinde BUILD
dosyalarının güncellenmesi gerektiğinden, bu dosyalar genellikle bir ekipte birden fazla kişi tarafından yönetilir. BUILD
dosyasının yazarları, herkesin kullanımına açık olsun ya da olmasın her derleme hedefinin rolünü belgelemek ve paketin rolünü belgelemek için özgürce yorum yapmalıdır.
Uzantı yükleniyor
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 sabit değerler (örneğin, dize veya liste) yüklemek için kullanılabilir. load
çağrısı için ek bağımsız değişkenler kullanılarak birden fazla simge içe aktarılabilir. Bağımsız değişkenler dize sabit değerleri (değişken yok) olmalıdır ve load
ifadeleri, bir işlev gövdesinde bulunamaz, en üst düzeyde görünmelidir.
load
öğesinin ilk bağımsız değişkeni, .bzl
dosyasını tanımlayan bir etikettir. Göreli bir etiketse geçerli bzl
dosyasını içeren pakete (dizin değil) göre çözümlenir. load
ifadelerindeki göreli etiketler, başında :
kullanmalı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")
Tek bir load
ifadesinde birden çok 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 (ne zaman tırnak işareti kullanacağınızı lütfen unutmayın).
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 gruplanmış aileler halinde gelir. Örneğin, cc_binary
, cc_library
ve cc_test
, sırasıyla C++ ikili programları, 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. Bir derleme işleminden sonra yürütülebilir dosya, derleme aracının ikili çıktı ağacında, kuralın etiketine karşılık gelen adda yer alır. Bu nedenle,//my:program
öğesi (örneğin)$(BINDIR)/my/program
konumunda görünür.Bazı dillerde bu tür kurallar, kurala ait bir
data
özelliğinde belirtilen tüm dosyaları veya bağımlılıkların geçişli olarak kapatılmasıyla ilgili herhangi bir kuralı içeren bir Runfiles dizini de oluşturur. Bu dosya grubu, üretime dağıtım kolaylığı sağlamak için tek bir yerde toplanır.*_test
kuralları, otomatik test için kullanılan bir*_binary
kuralının uzmanlık alanıdır. Testler, hiç başarı getirmeyen programlardır.İkili programlar gibi, testlerde de çalıştırma dosyası ağaçları bulunur. Testin altındaki dosyalar, testin çalışma zamanında meşru olarak açabileceği tek dosyalardır. Örneğin, bir
cc_test(name='x', data=['//foo:bar'])
programı yürütme sırasında açılıp$TEST_SRCDIR/workspace/foo/bar
okuyabilir. (Her programlama dilinin$TEST_SRCDIR
değerine erişmek için kendi yardımcı programı vardır ancak bunların tümü, doğrudan ortam değişkenini kullanmaya eşdeğerdir.) Kurala uyulmaması, uzaktan test ana makinesinde çalıştırıldığında testin başarısız olmasına neden olur.*_library
kuralları, belirtilen programlama dilinde ayrı olarak derlenmiş modülleri belirtir. Kitaplıklar başka kitaplıklara bağlı olabilir. İkili programlar ve testler, beklenen ayrı derleme davranışına sahip kitaplıklara bağlı olabilir.
Etiketler | Bağımlılıklar |