Uzantılara Genel Bakış

Sorun bildirme Kaynağı görüntüleme Nightly · 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

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

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

Daha ileri seviye kavramları öğrenmeden önce:

Makrolar ve kurallar

Makro, kuralları örnekleyen bir işlevdir. Makrolar iki türdedir: 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. Makro, bazı kodları yeniden kullanmanıza olanak tanıdığı için BUILD dosyası çok tekrarlı veya çok karmaşık hale geldiğinde kullanışlıdır. İşlev, BUILD dosyası okunur okunmaz değerlendirilir. BUILD dosyası değerlendirildikten sonra Bazel, makrolar hakkında çok az bilgiye sahip olur. Makronuz bir genrule oluşturursa Bazel, genrule öğesini BUILD dosyasında tanımlamışsınız gibi neredeyse aynı şekilde davranır. (Tek istisna, sembolik bir makroda tanımlanan hedeflerin özel görünürlük semantiği olmasıdır: Sembolik makro, dahili hedeflerini paketin geri kalanından gizleyebilir.)

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

Basit mantığı yeniden kullanmak istiyorsanız bir makroyla başlayın. Eski Bazel sürümlerini desteklemeniz gerekmiyorsa sembolik makro kullanmanızı öneririz. Karmaşık hale gelen makroları kurala dönüştürmek genellikle iyi bir fikirdir. Yeni bir dil için destek genellikle bir kuralla sağlanır. Kurallar, ileri düzey kullanıcılar içindir. Çoğu kullanıcının kural yazması gerekmez. Yalnızca mevcut kuralları yükleyip çağırabilirler.

Değerlendirme modeli

Derleme üç aşamadan oluşur.

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

  • Analiz aşaması. Kuralların kodu (implementation işlevi) yürütülür ve işlemler örneklenir. İşlem, bir giriş grubundan nasıl bir çıkış grubu oluşturulacağını açıklar (ör. "hello.c üzerinde gcc'yi çalıştır ve hello.o dosyasını al"). Gerçek komutları yürütmeden önce hangi dosyaların oluşturulacağını açıkça listelemeniz gerekir. Diğer bir deyişle, analiz aşaması, yükleme aşaması tarafından 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 çalıştırı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ınıp yeniden kullanılır. Bir dosya yalnızca tüm bağımlılıkları (load() ifadesi) çözüldükten sonra değerlendirilir. Tasarım gereği, .bzl dosyasının yüklenmesi görünür bir yan etkiye sahip değildir. 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 öğrenmek için bağımlılık analizini kullanır. Örneğin, bir kural mevcut derleme için ihtiyaç duymadığınız işlemler oluşturursa bu işlemler yürütülmez.

Uzantı oluşturma

Aşağıdaki iki bağlantı, kendi uzantılarınızı yazarken çok faydalı olacaktır. Bunları elinizin altında tutun:

Daha fazla bilgi

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