Uzantılara Genel Bakış

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

Bu sayfada, makroları ve kuralları kullanarak BUILD dilinin nasıl genişletileceği açıklanmaktadır.

Bazel uzantıları, .bzl ile biten dosyalardır. Bir uzantıdan sembol içe aktarmak için yükleme ifadesi kullanın.

Daha ileri düzey kavramları öğrenmeden önce:

Makrolar ve kurallar

Makro, kuralları oluşturan bir işlevdir. Makrolar iki türde sunulur: sembolik makrolar (Bazel 8'de yeni) ve eski makrolar. İki makro türü farklı şekilde tanımlanır ancak kullanıcı açısından neredeyse aynı şekilde çalışır. Bir BUILD dosyası çok tekrarlı veya çok karmaşık hale geldiğinde makro kullanışlıdır. Makro, bazı kodları yeniden kullanmanıza olanak tanır. İşlev, BUILD dosyası okunur okunmaz değerlendirilir. BUILD dosyası değerlendirildikten sonra Bazel'in makrolar hakkında çok az bilgisi olur. Makronuz genrule oluşturuyorsa Bazel, genrule öğesini BUILD dosyasında bildirmişsiniz gibi neredeyse davranır. (Tek istisna, sembolik bir makroda bildirilen hedeflerin özel görünürlük semantiğine sahip olmasıdır: Sembolik bir makro, dahili hedeflerini paketin geri kalanından gizleyebilir.)

Kural, makrodan daha güçlüdür. Bazel'in iç işleyişine erişebilir ve neler olup bittiği üzerinde tam kontrole sahip olabilir. Örneğin, bilgileri diğer kurallara iletebilir.

Basit mantığı yeniden kullanmak istiyorsanız makroyla başlayın. Daha eski Bazel sürümlerini desteklemeniz gerekmiyorsa sembolik bir makro kullanmanızı öneririz. Bir makro karmaşık hale gelirse genellikle onu kurala dönüştürmek iyi bir fikirdir. Yeni bir dil için destek genellikle bir kural aracılığıyla sağlanır. Kurallar, ileri düzey kullanıcılar içindir ve çoğu kullanıcının hiçbir zaman kural yazması gerekmez. Bu kullanıcılar yalnızca mevcut kuralları yükleyip çağırır.

Değerlendirme modeli

Derleme üç aşamadan oluşur.

  • Yükleme aşaması. Öncelikle, tüm uzantıları ve derleme için gereken tüm BUILD dosyaları yükleyip değerlendirin. BUILD dosyalarının yürütülmesi yalnızca kuralları başlatır (bir kural her çağrıldığında bir grafiğe eklenir). Makrolar burada değerlendirilir.

  • Analiz aşaması. Kuralların kodu yürütülür (implementation işlevleri) ve işlemler oluşturulur. Bir işlem, bir dizi girişten nasıl bir dizi çıkış oluşturulacağını açıklar. Örneğin, "hello.c üzerinde gcc'yi çalıştır ve hello.o'yu al". Gerçek komutları yürütmeden önce hangi dosyaların oluşturulacağını açıkça belirtmeniz gerekir. Başka bir deyişle, analiz aşaması, yükleme aşamasında oluşturulan grafiği alır ve bir işlem grafiği oluşturur.

  • Yürütme aşaması. İşlemler, çıkışlarından en az biri gerektiğinde yürütülür. Bir dosya eksikse veya bir komut bir çıkış oluşturamazsa derleme başarısız olur. Bu aşamada testler de yapılır.

Bazel, .bzl ve BUILD dosyalarını okumak, ayrıştırmak ve değerlendirmek için paralellik kullanır. Bir dosya, derleme başına en fazla bir kez okunur ve değerlendirmenin sonucu önbelleğe alınarak yeniden kullanılır. Bir dosya yalnızca tüm bağımlılıkları (load() ifadeler) çözüldükten sonra değerlendirilir. .bzl dosyasının yüklenmesi, tasarım gereği görünür bir yan etkiye neden olmaz. Yalnızca değerleri ve işlevleri tanımlar.

Bazel akıllı olmaya çalışır: Hangi dosyaların yüklenmesi, hangi kuralların analiz edilmesi ve hangi işlemlerin yürütülmesi gerektiğini bilmek için bağımlılık analizini kullanır. Örneğin, bir kural geçerli derleme için ihtiyacınız olmayan işlemler oluşturursa bu işlemler yürütülmez.

Uzantı oluşturma

Kendi uzantılarınızı yazarken aşağıdaki iki bağlantıdan çok faydalanabilirsiniz. Erişebileceğiniz yerlerde saklayın:

Daha fazlasını yapma

Makrolara ve kurallara ek olarak yönler ve depo kuralları da yazabilirsiniz.