Bazel ile program oluşturma

Sorun bildirin Kaynağı göster

Bu sayfada Bazel ile program oluşturma, komut söz dizimi ve hedef desen söz dizimi oluşturma açıklanmaktadır.

Hızlı Başlangıç

Bazel'ı çalıştırmak için temel workspace dizinine veya alt dizinlerinden birine gidip bazel yazın. Yeni bir çalışma alanı oluşturmanız gerekiyorsa build öğesine bakın.

bazel help
                             [Bazel release bazel version]
Usage: bazel command options ...

Kullanılabilir komutlar

  • analyze-profile: Derleme profil verilerini analiz eder.
  • aquery: Analiz sonrası işlem grafiğinde bir sorgu yürütür.
  • build: Belirtilen hedefleri oluşturur.
  • canonicalize-flags: Bazel flag'lerini standartlaştırın.
  • clean: Çıkış dosyalarını kaldırır ve isteğe bağlı olarak sunucuyu durdurur.
  • cquery: Analiz sonrası bağımlılık grafiği sorgusu yürütür.
  • dump: Bazel sunucu işleminin dahili durumunu atar.
  • help: Komutlar veya dizin için yardım yazdırır.
  • info: Ekip sunucusuyla ilgili çalışma zamanı bilgilerini gösterir.
  • fetch: Bir hedefin tüm harici bağımlılıklarını getirir.
  • mobile-install: Uygulamaları mobil cihazlara yükler.
  • query: Bağımlılık grafik sorgusu yürütür.
  • run: Belirtilen hedefi çalıştırır.
  • shutdown: Bazel sunucusunu durdurur.
  • test: Belirtilen test hedeflerini oluşturur ve çalıştırır.
  • version: Bazel sürüm bilgilerini yazdırır.

Yardım alma

  • bazel help command: command için yardım ve seçenekler yazdırır.
  • bazel helpstartup_options: Bazel'ı barındıran JVM'nin seçenekleri.
  • bazel helptarget-syntax: Hedef belirleme söz dizimini açıklar.
  • bazel help info-keys: Bilgi komutu tarafından kullanılan anahtarların listesini görüntüler.

bazel aracı, komut adı verilen birçok işlevi yerine getirir. En yaygın kullanılanları bazel build ve bazel test'dir. bazel help adresini kullanarak çevrimiçi yardım mesajlarına göz atabilirsiniz.

Bir hedef oluşturma

Derlemeyi başlatmadan önce bir çalışma alanınıza ihtiyacınız vardır. Çalışma alanı, uygulamanızı oluşturmak için gereken tüm kaynak dosyaları içeren bir dizin ağacıdır. Bazel, salt okunur bir ses düzeyinden derleme yapmanıza olanak tanır.

Bazel ile program oluşturmak için bazel build ve ardından oluşturmak istediğiniz hedefi yazın.

bazel build //foo

//foo derleme komutunu yayınladıktan sonra aşağıdakine benzer bir çıkış görürsünüz:

INFO: Analyzed target //foo:foo (14 packages loaded, 48 targets configured).
INFO: Found 1 target...
Target //foo:foo up-to-date:
  bazel-bin/foo/foo
INFO: Elapsed time: 9.905s, Critical Path: 3.25s
INFO: Build completed successfully, 6 total actions

Bazel, önce hedefinizin bağımlılık grafiğindeki tüm paketleri yükler. Buna bildirilen bağımlılıklar, doğrudan hedefin BUILD dosyasında listelenen dosyalar ve geçişli bağımlılıklar, hedefinizin bağımlılıklarının BUILD dosyalarında listelenen dosyalar dahildir. Bazel tüm bağımlılıkları belirledikten sonra bunları analiz ederek analiz eder ve derleme işlemleri oluşturur. Son olarak, Bazel derlemenin derleyicilerini ve diğer araçlarını yürür.

Bazel, derlemenin yürütme aşamasında ilerleme mesajlarını yazdırır. İlerleme mesajları, başlarken mevcut derleme adımını (derleyici veya bağlayıcı gibi) ve derleme derleme işlemlerinin toplam sayısını içerir. Derleme başladığında, toplam işlem sayısı genellikle Bazel işlem grafiğinin tamamını keşfettikçe artar ancak sayı birkaç saniye içinde sabitlenir.

Derlemenin sonunda, Bazel hangi hedeflerin istendiğini, başarılı bir şekilde oluşturulup oluşturulmadıklarını ve istenirse çıkış dosyalarının nerede bulunabileceğini yazdırır. Derleme çalıştıran komut dosyaları, bu çıkışı güvenilir bir şekilde ayrıştırabilir. Daha fazla ayrıntı için --show_result bölümüne bakın.

Aynı komutu tekrar yazarsanız derleme çok daha hızlı tamamlanır.

bazel build //foo
INFO: Analyzed target //foo:foo (0 packages loaded, 0 targets configured).
INFO: Found 1 target...
Target //foo:foo up-to-date:
  bazel-bin/foo/foo
INFO: Elapsed time: 0.144s, Critical Path: 0.00s
INFO: Build completed successfully, 1 total action

Bu null bir derlemedir. Hiçbir şey değişmediğinden, yeniden yüklenecek paket yok ve yürütülecek adım yok. "foo" veya bağımlılarında bir değişiklik olursa Bazel bazı derleme işlemlerini yeniden yürütebilir ya da ek bir derleme tamamlayabilir.

Birden çok hedef oluşturma

Bazel, oluşturulacak hedefleri belirtmenin çeşitli yollarına izin verir. Bunlara toplu olarak hedef kalıpları denir. Bu söz dizimi build, test veya query gibi komutlarda kullanılır.

Etiketler, hedefleri tek tek belirtmek için kullanılır. Örneğin, BUILD dosyalarındaki bağımlılıkları bildirmek için Bazel'in hedef kalıpları birden çok hedef belirtir. Hedef desenler, joker karakterler kullanılarak hedef kümelerine ait etiket söz diziminin genelleştirilmesidir. En basit şekilde ifade etmek gerekirse, geçerli bir etiket aynı zamanda geçerli bir hedef kalıbıdır ve tam olarak bir hedef kümesini tanımlar.

// ile başlayan tüm hedef kalıpları, geçerli çalışma alanına göre çözümlenir.

//foo/bar:wiz Yalnızca //foo/bar:wiz değerindeki tek hedef.
//foo/bar //foo/bar:bar etiketine eş değer.
//foo/bar:all foo/bar paketindeki tüm kural hedefleri.
//foo/... foo dizini altındaki tüm paketlerde bulunan tüm kural hedefleri.
//foo/...:all foo dizini altındaki tüm paketlerde bulunan tüm kural hedefleri.
//foo/...:* foo dizini altındaki tüm paketlerde bulunan tüm hedefler (kurallar ve dosyalar).
//foo/...:all-targets foo dizini altındaki tüm paketlerde bulunan tüm hedefler (kurallar ve dosyalar).
//... Çalışma alanındaki paketlerde yer alan tüm hedefler. Harici kod depolarındaki hedefler dahil değildir.
//:all Çalışma alanının kökünde bir "DERLE" dosyası varsa üst düzey paketteki tüm hedefler.

// ile başlamayan hedef kalıpları, geçerli çalışma dizinine göre çözümlenir. Aşağıdaki örneklerde foo dizininin çalışan bir dizini varsayılmaktadır:

:foo //foo:foo etiketine eş değer.
bar:wiz //foo/bar:wiz etiketine eş değer.
bar/wiz Eşdeğeri:
  • foo/bar/wiz bir paketse //foo/bar/wiz:wiz
  • foo/bar bir paketse //foo/bar:wiz
  • Aksi takdirde //foo:bar/wiz
bar:all //foo/bar:all etiketine eş değer.
:all //foo:all etiketine eş değer.
...:all //foo/...:all etiketine eş değer.
... //foo/...:all etiketine eş değer.
bar/...:all //foo/bar/...:all etiketine eş değer.

Varsayılan olarak dizin sembolik bağlantıları, çalışma alanının kök dizininde oluşturulan rahatlık sembolü bağlantıları gibi çıkış tabanının altında gösterilenler dışında, yinelenen hedef kalıplar için izlenir.

Buna ek olarak Bazel, aşağıdaki gibi bir dosya içeren herhangi bir dizinde tekrarlanan hedef kalıpları değerlendirirken sembolik bağlantıları takip etmez: DONT_FOLLOW_SYMLINKS_WHEN_TRAVERSING_THIS_DIRECTORY_VIA_A_RECURSIVE_TARGET_PATTERN

foo/..., paketlerin üzerinde bir joker karakterdir. foo etiketinin altındaki tüm paketleri yinelenen şekilde (paket yolunun tüm kökleri için) belirtir. :all, hedeflerin üzerinde ilerleyerek paket içindeki tüm kurallarla eşleşen bir joker karakterdir. Bu ikisi foo/...:all örneğinde olduğu gibi birleştirilebilir ve her iki joker karakter de kullanıldığında foo/... olarak kısaltılabilir.

Ayrıca :* (veya :all-targets), eşleşen kurallardaki her hedefle eşleşen bir joker karakterdir. Normalde herhangi bir kuralla geliştirilmeyen dosyalar (ör. java_binary kurallarıyla ilişkili _deploy.jar dosyaları) bulunur.

Bu, :* ürününün :all üst kümesini belirttiği anlamına gelir. Bu söz dizimi, _deploy.jar gibi yapı hedeflerinin istenmediği olağan derlemelerde bilindik :all joker karakterinin kullanılmasına izin verir.

Buna ek olarak Bazel, etiket söz diziminin gerektirdiği iki nokta işareti yerine eğik çizginin kullanılmasına olanak tanır. Bu özellik genellikle Bash dosya adı genişletmesi kullanılırken kullanışlıdır. Örneğin, foo/bar/wiz, //foo/bar:wiz (foo/bar paketi varsa) veya //foo:bar/wiz ile (foo paketi varsa) eşdeğerdir.

Birçok Bazel komutu, bağımsız değişken olarak hedef kalıpların listesini kabul eder ve tümünü - ön ek olumsuzlama operatörüne uyar. Bu, önceki bağımsız değişkenlerde belirtilen kümeden bir hedef kümesini çıkarmak için kullanılabilir. Bunun önemli olduğunu düşünün. Örneğin,

bazel build foo/... bar/...

"foo altında tüm hedefleri ve bar altında tüm hedefleri oluştur" anlamına gelir

bazel build -- foo/... -foo/bar/...

"foo/bar altında kalanlar dışında foo altındaki tüm hedefleri oluştur" anlamına gelir. (- ile başlayan sonraki bağımsız değişkenlerin ek seçenekler olarak yorumlanmasını önlemek için -- bağımsız değişkeni gereklidir.)

Ancak, bu şekilde hariç tutulan hedeflerin, çıkarılmayan hedeflerin bağımlıları olabileceği için oluşturulmadıklarını garanti etmeyeceğini unutmayın. Örneğin, diğer hedeflerin //foo/bar:api bağımlı olduğu bir //foo:all-apis hedefi varsa ikincisi, ilkini oluşturmanın bir parçası olarak oluşturulur.

tags = ["manual"] içeren hedefler, bazel build ve bazel test gibi komutlarda belirtildiğinde joker karakter hedef kalıplarına (..., :*, :all vb.) dahil edilmez (ancak negatif joker karakter hedef kalıplarına dahil edilirler; bu da çıkarılırlar). Bazel'ın bunları test etmesini/test etmesini istiyorsanız bu tür test hedeflerini komut satırında açık hedef kalıplarıyla belirtmeniz gerekir. Öte yandan bazel query, bu tür filtreleri otomatik olarak gerçekleştirmez (Bu işlem, bazel query amacını bozar).

Harici bağımlılıklar getiriliyor

Varsayılan olarak Bazel, derleme sırasında harici bağımlılıkları indirip simgelerin bağlantısını oluşturur. Ancak bu, yeni harici bağımlılıkların ne zaman eklendiğini öğrenmek veya bağımlıları "önceden getirmek" (örneğin, çevrimdışı olacağınız bir uçuştan önce) öğrenmek istediğiniz için istenmeyen bir durum olabilir. Derlemeler sırasında yeni bağımlılıkların eklenmesini önlemek isterseniz --fetch=false işaretini belirtebilirsiniz. Bu işaretin yalnızca yerel dosya sistemindeki bir dizine işaret etmeyen depo kuralları için geçerli olduğunu unutmayın. Örneğin local_repository, new_local_repository, Android SDK ve NDK depo kurallarında yapılan değişiklikler --fetch değerinden bağımsız olarak her zaman geçerli olur .

Derlemeler sırasında getirme işlemini engellerseniz ve Bazel yeni harici bağımlılıklar bulursa derlemeniz başarısız olur.

bazel fetch çalıştıran bağımlılıkları manuel olarak getirebilirsiniz. Derleme sırasında getirmeye izin vermezseniz bazel fetch çalıştırmanız gerekir:

  • İlk kez derlemeden önce.
  • Yeni bir harici bağımlılık ekledikten sonra.

Dosya çalıştırıldıktan sonra WORKSPACE dosyası değişene kadar tekrar çalıştırmanız gerekmez.

fetch, bağımlıların getirileceği hedeflerin listesini alır. Örneğin, //foo:bar ve //bar:baz derlemek için gereken bağımlılıklar getirilir:

bazel fetch //foo:bar //bar:baz

Bir çalışma alanının tüm harici bağımlılıklarını getirmek için şu komutu çalıştırın:

bazel fetch //...

Kullandığınız tüm araçlar (kitaplık kavanozlarından JDK'ya kadar) çalışma alanı kökünüzün altındaysa yedek getirme işlevini hiç çalıştırmanız gerekmez. Ancak çalışma alanı dizininin dışında bir şey kullanıyorsanız Bazel bazel build komutunu çalıştırmadan önce bazel fetch eklentisini otomatik olarak çalıştırır.

Depo önbelleği

Bazel, farklı çalışma alanlarında aynı dosya gerekli olsa veya harici bir deponun tanımı değişse bile aynı dosyanın indirilmesi için yine de aynı dosyayı birkaç kez getirmekten kaçınmaya çalışır. Bunun için yedek, varsayılan olarak ~/.cache/bazel/_bazel_$USER/cache/repos/v1/ konumunda bulunan depo önbelleğine indirilen tüm dosyaları önbelleğe alır. Konum, --repository_cache seçeneği ile değiştirilebilir. Önbellek, tüm çalışma alanları ve yüklü bazel sürümleri arasında paylaşılır. Bazel, doğru dosyanın bir kopyasına sahip olduğundan emin olduğunda (ör. indirme isteğinde, belirtilen dosyanın SHA256 toplamı varsa ve bu karmayı içeren bir dosya önbellekte yer alıyorsa) önbellekten bir giriş alınır. Bu nedenle, her harici dosya için karma oluşturmak güvenlik açısından iyi bir fikir olmakla kalmaz, gereksiz indirmelerden kaçınmanıza da yardımcı olur.

Her önbellek isabetinden sonra, önbellekteki dosyanın değiştirilme zamanı güncellenir. Bu şekilde, önbellek dizinindeki bir dosyanın son kullanımı kolayca (örneğin, önbelleğin manuel olarak temizlenmesi) belirlenebilir. Önbellek, artık kullanılabilir durumda olmayan bir dosyanın kopyasını içerebileceği için hiçbir zaman otomatik olarak temizlenmez.

Dağıtım dosyası dizinleri

Dağıtım dizini, gereksiz indirmeleri önlemek için başka bir Bazel mekanizmasıdır. Bazel, depodan önce dağıtım dizinlerini arıyor. Aradaki temel fark, dağıtım dizininin manuel hazırlık gerektirmesidir.

--distdir=/path/to-directory seçeneğini kullanarak, dosyaları getirmek yerine aramak için ek salt okunur dizinler belirtebilirsiniz. Dosya adı URL'nin temel adına eşitse ve ayrıca dosyanın karma değeri, indirme isteğinde belirtilene eşitse bu dizinden alınır. Bu özellik yalnızca dosya karması WORKSPACE beyanında belirtildiğinde çalışır.

Dosya adındaki koşul, doğruluk için gerekli olmasa da aday dosyaların sayısını belirtilen dizin başına bir olacak şekilde azaltır. Bu şekilde, bu tür dizinlerdeki dosya sayısı büyük olsa bile, dağıtım dosyaları dizinlerini belirtme verimli kalır.

Bazel'ı havasız bir ortamda koşma

Bazel'ın ikili boyutunu küçük tutmak için Bazel'ın dolaylı bağımlılıkları ilk kez çalıştırılırken ağ üzerinden getirilir. Bu dolaylı bağımlılar, herkes için gerekli olmayabilecek araç zincirleri ve kurallar içerir. Örneğin, Android araçlar grup olarak sunulur ve yalnızca Android projeleri oluşturulurken getirilir.

Ancak bu dolaylı bağımlılıklar, tüm Workspace çalışma bağımlılıklarınızı satın almış olsanız bile Bazel'ı havasız bir ortamda çalıştırırken sorun yaşamanıza neden olabilir. Bu sorunu çözmek için bu bağımlılıkları içeren bir makineyi ağ erişimi olan bir makinede hazırlayabilir ve daha sonra bunları çevrimdışı bir yaklaşımla hava boşluklu bir ortama aktarabilirsiniz.

Dağıtım dizinini hazırlamak için --distdir işaretini kullanın. Dolaylı bağımlılıklar her sürüme göre farklılık gösterebileceğinden bunu her yeni Bazel ikili programı için bir kez yapmanız gerekir.

Bu bağımlıları Airpeped ortamınızın dışında oluşturmak için öncelikle doğru sürümde Bazel kaynak ağacını kontrol edin:

git clone https://github.com/bazelbuild/bazel "$BAZEL_DIR"
cd "$BAZEL_DIR"
git checkout "$BAZEL_VERSION"

Ardından, söz konusu Bazel sürümü için dolaylı çalışma zamanı bağımlılıklarını içeren tarball öğesini oluşturun:

bazel build @additional_distfiles//:archives.tar

Bu tarketi, boşluklu ortamınıza kopyalanabilecek bir dizine aktarın. --distdir etiketini dizin iç içe yerleştirme seviyesiyle hassas bir şekilde ayarlayabileceği için --strip-components işaretini not edin:

tar xvf bazel-bin/external/additional_distfiles/archives.tar \
  -C "$NEW_DIRECTORY" --strip-components=3

Son olarak, havalı bir ortamda Bazel kullandığınızda dizini işaret eden --distdir işaretini kullanın. Kolaylık olması için bu adresi .bazelrc girişi olarak ekleyebilirsiniz:

build --distdir=path/to/directory

Yapılandırmalar ve çapraz derleme oluşturma

Belirli bir derlemenin davranışını ve sonucunu belirten tüm girişler iki ayrı kategoriye ayrılabilir. Birinci tür, projenizin BUILD dosyalarında depolanan gerçek bilgilerdir: derleme kuralı, özelliklerinin değerleri ve geçişli bağımlılıklarının tam grubu. İkinci tür, kullanıcı veya derleme aracı tarafından sağlanan harici veya ortam verileridir: hedef mimari seçimi, derleme ve bağlantı seçenekleri ve diğer araç zinciri yapılandırma seçenekleri. Eksiksiz bir çevresel veri kümesine yapılandırma adı verilir.

Herhangi bir derlemede, birden fazla yapılandırma olabilir. 64 bit mimari için //foo:bin yürütülebilir bir derleme oluşturduğunuz, ancak iş istasyonunuzun 32 bit makine olduğu bir çapraz derlemeyi değerlendirin. Elbette derleme, 64 bit yürütülebilir özelliklere sahip bir araç zinciri kullanarak //foo:bin derlemeyi gerektirecektir. Ancak derleme sistemi ayrıca derleme sırasında kullanılan çeşitli araçlardan da (örneğin, kaynaktan oluşturulan ve daha sonra, bir beyin içinde kullanılan araçlar) oluşturulmalıdır. Bu araçlar iş istasyonunuz üzerinde çalışacak şekilde oluşturulmalıdır. Böylece, iki yapılandırmayı tanımlayabiliriz: Derleme sırasında çalışan araçlar için kullanılan exec yapılandırması ve hedef yapılandırma (veya yapılandırma isteme) ancak bu kelimenin zaten birçok anlamı olsa bile "hedef yapılandırmasını" daha sık belirtiriz.

Genellikle hem istenen derleme hedefinin (//foo:bin) hem de bir veya daha fazla yürütme aracının (ör. bazı temel kitaplıklar) ön koşulu olan birçok kitaplık bulunur. Bu tür kitaplıklar, yürütme yapılandırması için bir kez ve hedef yapılandırma için bir kez oluşturulmalıdır. Bazel, girişimi önlemek amacıyla iki varyantın da derlenmesini ve türetilen dosyaların ayrı tutulmasını sağlar. Bu hedefler genellikle birbirinden bağımsız oldukları için eşzamanlı olarak oluşturulabilir. Belirli bir hedefin iki kez oluşturulduğunu gösteren ilerleme mesajları görürseniz bunlar büyük olasılıkla açıklamadır.

Yürütme yapılandırması hedef yapılandırmadan aşağıdaki şekilde türetilir:

  • --host_crosstool_top belirtilmemişse istek yapılandırmasında belirtilen Crosstool (--crosstool_top) sürümünü kullanın.
  • --cpu için --host_cpu değerini kullanın (varsayılan: k8).
  • İstek yapılandırmasında belirtilenlerle aynı değerleri kullanın: --compiler, --use_ijars ve --host_crosstool_top kullanılıyorsa yürütme aracı için --compiler aracı, Crosstool'da (--compiler yok sayılarak) arama yapmak üzere --host_cpu değerini kullanır.
  • --javabase için --host_javabase değerini kullanın
  • --java_toolchain için --host_java_toolchain değerini kullanın
  • C++ kodu için optimize edilmiş derlemeler kullanın (-c opt).
  • Hata ayıklama bilgisi oluşturma (--copt=-g0).
  • Yürütülebilir dosyalar ve paylaşılan kitaplıklardan hata ayıklama bilgilerini kaldırın (--strip=always).
  • Türetilmiş tüm dosyaları, olası istek yapılandırmalarının kullandığı dosyalardan farklı bir yere yerleştirin.
  • Derleme verilerini damgalamayı derleme verileriyle engelleyin (--embed_* seçeneğine bakın).
  • Diğer tüm değerler varsayılan haliyle kalır.

İstek yapılandırmasından farklı bir yürütme yapılandırması seçmeyi tercih etmenin birçok nedeni olabilir. En önemlisi:

İlk olarak, çizgili ve optimize edilmiş ikili programları kullanarak araçları bağlama ve yürütme için harcanan süreyi, araçların kapladığı disk alanını ve dağıtılmış derlemelerde ağ G/Ç süresini kısaltırsınız.

İkinci olarak, tüm derlemelerde Yürütme ve İstek yapılandırmalarını ayrıştırarak, daha önce açıklandığı gibi istek yapılandırmasında yapılan küçük değişikliklerden (bağlayıcı seçeneklerini değiştirme gibi) yol açacak çok pahalı yeniden oluşturma işlemlerinden kaçınmış olursunuz.

Artımlı yeniden derlemeleri düzeltme

Bazel projesinin ana hedeflerinden biri, doğru artımlı yeniden derlemeleri sağlamaktır. Önceki derleme araçları, özellikle de Marka oluşturmaya dayalı olanlar, artımlı derlemeler uygularken bazı akla aykırı varsayımlar gerçekleştirir.

İlk olarak, dosyaların zaman damgaları monoton bir şekilde artar. Bu durum genel olarak kabul edilse de bu varsayıma uymak çok kolaydır. Bir dosyanın erken revizyonuyla senkronize etmek bu dosyanın değişiklik süresinin azalmasına neden olur; Marka tabanlı sistemler yeniden oluşturulmaz.

Daha genel olarak ifade etmek gerekirse, Dosyalarda yapılan değişiklikleri algılarken komutlarda yapılan değişiklikleri algılamaz. Belirli bir derleme adımındaki derleyiciye aktarılan seçenekleri değiştirirseniz Maker, derleyiciyi yeniden çalıştırmaz ve önceki derlemenin geçersiz çıkışlarını make clean kullanarak manuel olarak silmek gerekir.

Ayrıca Make, bu alt işlemlerden biri çıkış dosyasına yazmaya başladıktan sonra alt işlemlerinden birinin başarısız şekilde feshedilmesine karşı dayanıklı değildir. Make'in mevcut yürütmesi başarısız olsa da Make'in sonraki çağrısına, kısaltılmış çıkış dosyasının geçerli olduğu (girişlerinden daha yeni olduğu için) körü körü yansıtılacak ve yeniden oluşturulmayacaktır. Benzer bir şekilde, Yapma işlemi sonlandırılırsa benzer bir durum oluşabilir.

Bazel bu varsayımlardan ve benzerlerinden kaçınıyor. Bazel, daha önce yapılan tüm çalışmaların yer aldığı bir veritabanı tutar ve yalnızca bir derleme dosyası kümesinin (ve bunların zaman damgalarının) söz konusu derleme adımıyla ve bu derleme adımının derleme komutunun veritabanındaki bir adımla tam olarak eşleştiğini ve veritabanı girişi için çıkış dosyaları grubunun (ve zaman damgaları) zaman damgalarındaki zaman damgalarıyla tam olarak eşleştiğini belirlerse derleme adımını dahil etmez. Giriş dosyalarında veya çıkış dosyalarında ya da komutun kendisinde yapılan herhangi bir değişiklik, derleme adımının yeniden çalıştırılmasına neden olur.

Doğru artımlı derlemeleri olan kullanıcılar için avantaj: Kongre nedeniyle daha az zaman harcanmasıdır. (Ayrıca, make clean kullanımından kaynaklanan (gerekli veya önleme amaçlı olan) yeniden derlemeleri için daha az zaman harcandı.

Tutarlılık ve artımlı derlemeler oluşturun

Resmi olarak, bir çıktının beklenen tüm çıkış dosyaları mevcut olduğunda ve bu dosyaların içeriği doğru olduğunda, dosyaları oluşturmak için gereken adımlar veya kurallar tarafından belirtildiği gibi, derlemenin durumunu tutarlı olarak tanımlarız. Bir kaynak dosyayı düzenlediğinizde derlemenin durumunun tutarsız olduğu söylenir ve siz derleme aracını başarıyla tamamlayana kadar derleme aracını tutarsız tutar. Bu durum yalnızca geçici olduğu ve derleme aracı çalıştırılarak tutarlılık sağlandığı için tutarsız tutarsızlık olarak tanımlanmıştır.

Zararlı başka bir tutarsızlık da vardır: kararlı tutarsızlık. Yapı kararlı bir tutarsızlığa ulaşırsa, derleme aracının yinelenen şekilde çağrılması tutarlılığı geri yüklemez: Derleme "takılmış" olur ve çıkışlar yanlış kalır. Kararlı tutarsız durumlar, Marka (ve diğer derleme araçları) kullanıcılarının make clean yazmasının ana nedenidir. Derleme aracının bu şekilde başarısız olduğunu (ve bundan sonra kurtarıldığını) keşfetmek zaman alıcı ve can sıkıcı olabilir.

Kavramsal olarak, tutarlı bir yapıya ulaşmanın en kolay yolu önceki tüm derleme çıkışlarını atmak ve tekrar başlamaktır: Her yapıyı temiz bir yapı haline getirmek. Bu yaklaşım, görünüşe göre uygulanabilir (sürüm mühendisleri için hariç) çok zaman alıyor. Bu nedenle, kullanışlı olması için derleme aracının tutarlılıktan ödün vermeden artımlı derlemeler yapabilmesi gerekir.

Doğru artımlı bağımlılık analizi yapmak zordur ve yukarıda açıklandığı gibi diğer birçok derleme aracı, artımlı derlemeler sırasında istikrarsız tutarsız durumlardan kaçınarak kötü performans gösterir. Buna karşılık Bazel şu garantisi sunar: Hiçbir düzenleme yapmadığınız derleme aracının başarılı bir şekilde çağrılmasından sonra derleme tutarlı bir durumda olur. (Bir derleme sırasında kaynak dosyalarınızı düzenlerseniz Bazel, mevcut derlemenin sonucunun tutarlılığıyla ilgili hiçbir garanti vermez. Ancak sonraki derlemenin sonuçlarının tutarlılığı geri yükleyeceğini garanti eder.)

Tüm garantilerde olduğu gibi, küçük bir kısım da baskılar vardır: Bazel ile tutarlı bir istikrarsız duruma geçmenin bilinen bazı yolları vardır. Artırılmış bağımlılık analizinde kasıtlı olarak hataları bulma girişimlerinden kaynaklanan bu tür sorunları araştıracağımızı garanti edemeyiz. Ancak, normal ve "makul" şekilde yapılan derleme aracından kaynaklanan tüm istikrarsız tutarsızlıklar için sorunu gidermek için elimizden geleni yapacağız.

Bazel ile tutarlı bir tutarsız durum tespit ederseniz lütfen bir hata bildirin.

Korumalı alana alınan yürütme

Bazel, işlemlerin bütüncül ve doğru şekilde çalışmasını sağlamak için korumalı alanları kullanır. Bazel, yalnızca aletin çalışması için gereken minimum dosya sayısını içeren korumalı alanlarda paws (gevşek konuşma: işlemler) çalıştırır. Korumalı alan özelliği şu anda CONFIG_USER_NS seçeneğinin etkinleştirildiği Linux 3.12 veya daha yeni sürümlerde ve macOS 10.11 veya daha yeni sürümlerde çalışmaktadır.

Sisteminiz korumalı alanı desteklemiyorsa derlemelerin kalıtsal olmadığı ve ana makine sistemini bilinmeyen şekillerde etkileyebileceği konusunda sizi uyarmak için uyarı yazdırılır. Bu uyarıyı devre dışı bırakmak için --ignore_unsupported_sandboxing işaretini Bazel'a iletebilirsiniz.

Kullanıcı ad alanları, Google Kubernetes Engine küme düğümleri veya Debian gibi güvenlik endişeleri nedeniyle varsayılan olarak devre dışıdır. Bu durum, /proc/sys/kernel/unprivileged_userns_clone dosyasına bakılarak kontrol edilebilir: 0 dosya varsa ve 0 içeriyorsa kullanıcı ad alanları sudo sysctl kernel.unprivileged_userns_clone=1 ile etkinleştirilebilir.

Bazel korumalı alanı bazı durumlarda sistem kurulumu nedeniyle kuralları yürütemez. Belirtiler genellikle namespace-sandbox.c:633: execvp(argv[0], argv): No such file or directory benzeri bir mesaj veren hatalardır. Bu durumda, --strategy=Genrule=standalone içeren genel kurallar ve --spawn_strategy=standalone içeren diğer kurallar için korumalı alanı devre dışı bırakmayı deneyin. Ayrıca, bir sonraki sürümde araştırabilmemiz ve bir düzeltme bulabilmemiz için lütfen sorun izleyicimizdeki bir hatayı bildirin ve hangi Linux dağıtımını kullandığınızı belirtin.

Derleme aşamaları

Bazel'da derleme üç farklı aşamada gerçekleşir. Kullanıcı olarak bunların arasındaki farkları anlamak, derlemeyi kontrol eden seçenekler hakkında bilgi verir (aşağıya bakın).

Yükleme aşaması

Bunlardan ilki, ilk hedefler için gerekli tüm DERLE dosyalarının ve bağımlıların geçişli şekilde kapanmasının yüklenmesi, ayrıştırılması, değerlendirilmesi ve önbelleğe alınması sırasında yükleme işlemidir.

Bazel sunucusu başlatıldıktan sonraki ilk derleme için dosya sisteminden çok sayıda DERLE dosyası yüklendiğinden yükleme aşaması genellikle birkaç saniye sürer. Sonraki derlemelerde, özellikle herhangi bir DERLE dosyası değiştirilmediyse yükleme işlemi çok hızlı gerçekleşir.

Bu aşamada bildirilen hatalar şunlardır: paket bulunamadı, hedef bulunamadı, DERLE dosyasında dosyadaki dil bilgisi ve dil bilgisi hataları ve değerlendirme hataları.

Analiz aşaması

İkinci aşama olan analiz her derleme kuralının semantik analizini ve doğrulanmasını, derleme bağımlılık grafiğinin oluşturulmasını ve derlemenin her adımında yapılacak işin belirlenmesini içerir.

Yükleme gibi, analizin tamamı hesaplandığında da birkaç saniye sürer. Ancak Bazel, bağımlılık grafiğini bir derlemeden diğerine önbelleğe alır ve yalnızca gerekenleri yeniden analiz eder. Bu da önceki derlemeden bu yana paketlerin değiştirilmediği durumlarda artımlı derlemeleri son derece hızlı hale getirebilir.

Bu aşamada bildirilen hatalar şunlardır: uygunsuz bağımlılıklar, kural için geçersiz girişler ve kurala özel tüm hata mesajları.

Bazel, bu aşamada gereksiz dosya G/Ç'lerinden kaçındığı için, yükleme ve analiz aşamaları hızla tamamlanır ve yapılacak çalışmanın belirlenmesi için yalnızca DERLE dosyaları okunur. Bu tasarım gereği Bazel, Bazel'in yükleme aşamasının üstüne uygulanan query komutu gibi analiz araçları için iyi bir temel oluşturur.

Yürütme aşaması

Derlemenin üçüncü ve son aşaması yürütme aşamasıdır. Bu aşama, derlemedeki her adımın çıktılarının girdileriyle tutarlı bir şekilde derleme, bağlantı derleme/gereken araçlar gibi araçların yeniden çalıştırılmasını sağlar. Bu adımda derlemenin süresi, büyük bir derleme için birkaç saniye ile bir saatten uzun sürede değişir. Bu aşamada bildirilen hatalar şunlardır: eksik kaynak dosyalar, bazı derleme işlemleri tarafından yürütülen araçlardaki hatalar veya aracın beklenen çıktıları üretmesi.