DERLEME dosyaları

Sorun bildir Kaynağı görüntüle Nightly · 8.4 · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

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

Tanım gereği her paket, kısa bir program olan BUILD dosyası içerir.

BUILD dosyaları, emir kipiyle yazılmış bir dil olan Starlark 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 bildirimlerinden oluşur ve bu ifadelerin göreli sırası önemli değildir. Önemli olan tek şey, paket değerlendirmesi tamamlandığında hangi kuralların 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 referans verilebilir.

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

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

En önemlisi, Starlark'taki programlar rastgele G/Ç işlemleri gerçekleştiremez. Bu değişmez, BUILD dosyalarının yorumlanmasını hermetik hale getirir. Yani yalnızca bilinen bir giriş kümesine bağlıdır. Bu da derlemelerin yeniden üretilebilir olmasını sağlamak için gereklidir. Daha ayrıntılı bilgi için Hermeticity başlıklı makaleyi inceleyin.

Temel kodun bağımlılıkları her değiştiğinde BUILD dosyalarının güncellenmesi gerektiğinden, bu dosyalar genellikle bir ekipteki birden fazla kişi tarafından yönetilir. BUILD dosya yazarları, her derleme hedefinin rolünü (halka açık kullanım için tasarlanıp tasarlanmadığına bakılmaksızın) ve paketin kendisinin rolünü belgelemek için bolca yorum yapmalıdır.

Uzantı yükleme

Bazel uzantıları, .bzl ile biten dosyalardır. Bir uzantıdan sembol 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 ortama some_library sembolünü ekler. Bu işlev, yeni kuralları, işlevleri veya sabitleri (ör. dize ya da liste) yüklemek için kullanılabilir. load çağrısına ek bağımsız değişkenler kullanılarak birden fazla sembol içe aktarılabilir. Bağımsız değişkenler dize değişmezleri (değişken yok) olmalı ve load ifadeleri üst düzeyde görünmelidir. Bu ifadeler işlev gövdesinde olamaz.

load işlevinin ilk bağımsız değişkeni, .bzl dosyasını tanımlayan bir etikettir. Göreceli bir etiketse geçerli bzl dosyasını içeren pakete (dizine değil) göre çözümlenir. load ifadelerindeki göreli etiketler, başında : karakterini kullanmalıdır.

load, diğer adları da destekler. Bu nedenle, içe aktarılan sembollere farklı adlar atayabilirsiniz.

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

Tek bir load ifadesinde 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 (lütfen tırnak işaretlerinin ne zaman kullanılacağını unutmayın).

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

.bzl dosyasında, _ ile başlayan semboller 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, dil temelinde gruplandırılmış aileler halinde gelir. Örneğin, cc_binary, cc_library ve cc_test sırasıyla C++ ikilileri, kitaplıkları ve testleri için derleme kurallarıdır. Diğer dillerde de aynı adlandırma şeması kullanılır ancak Java için java_* gibi farklı bir önek kullanılır. Bu işlevlerden bazıları Build Encyclopedia'da 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 adla yer alır. Bu nedenle //my:program, (örneğin) $(BINDIR)/my/program konumunda görünür.

    Bazı dillerde bu kurallar, kurala ait bir data özelliğinde veya bağımlılıklarının geçişli kapanımı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 *_binary kuralının uzmanlık alanıdır. Testler, başarı durumunda sıfır döndüren programlardır.

    İkili dosyalar gibi testlerin de runfiles ağaçları vardır ve bu ağaçların altındaki dosyalar, bir testin çalışma zamanında yasal olarak açabileceği tek dosyalardır. Örneğin, bir program cc_test(name='x', data=['//foo:bar']) yürütme sırasında $TEST_SRCDIR/workspace/foo/bar 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.) Kurala uyulmaması, testin uzak bir test ana makinesinde yürütülmesi durumunda başarısız olmasına neden olur.

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

Etiketler Bağımlılıklar

Dosya kodlama

BUILD ve .bzl dosyaları UTF-8 olarak kodlanmalıdır. ASCII, UTF-8'in geçerli bir alt kümesidir. Şu anda rastgele bayt dizilerine izin verilmektedir ancak gelecekte bu destek durdurulabilir.