Bazel ile program oluşturun

Sorun bildirin Kaynağı göster Gece · 7,4 , 7.3 · 7,2 · 7,1 · 7.0 · 6,5

Bu sayfada, Bazel ile program oluşturma, derleme komutu söz dizimi ve hedef kalıp söz dizimi ele alınmaktadır.

Hızlı başlangıç kılavuzu

Bazel'ı çalıştırmak için temel workspace dizinine gidin. veya alt dizinlerinden herhangi birine bağlı olarak ve bazel türünde olduğundan emin olun. Aşağıdaki şartları karşılıyorsanız derleme bölümüne bakın: ve yeni bir çalışma alanı oluşturmanız gerekiyor.

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

Mevcut komutlar

  • analyze-profile: Oluşturma profili verilerini analiz eder.
  • aquery: Analizin ardından işlem grafiğinde bir sorgu yürütür.
  • build: Belirtilen hedefleri oluşturur.
  • canonicalize-flags: Bazel işaretlerini standart hale getirin.
  • clean: Çıkış dosyalarını kaldırır ve isteğe bağlı olarak sunucuyu durdurur.
  • cquery: Analizin ardından bağımlılık grafiği sorgusu yürütür.
  • dump: Bazel sunucu işleminin dahili durumunu döküm haline getirir.
  • help: Komutlarla ilgili yardım bilgilerini veya dizini yazdırır.
  • info: Bazel sunucusu hakkında çalışma zamanı bilgilerini gösterir.
  • fetch: Bir hedefin tüm harici bağımlılıklarını getirir.
  • mobile-install: Mobil cihazlara uygulamaları yükler.
  • query: Bağımlılık grafiği 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 için sürüm bilgilerini yazdırır.

Yardım alma

  • bazel help command: command için baskı yardımı ve seçenekleri.
  • bazel helpstartup_options: Bazel'i barındıran JVM seçenekleri.
  • bazel helptarget-syntax: Hedefleri belirtme 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 bazel build ve bazel test kullanılıyor. Web sitenizdeki çalışmaları bazel help kullanılarak mesajlar.

Bir hedef oluşturma

Derleme işlemine başlamadan önce bir çalışma alanı oluşturmanız gerekir. Çalışma alanı, uygulamanızı oluşturmak için gereken tüm kaynak dosyalarını içeren bir dizin ağacıdır. Bazel, tamamen salt okunur bir kaynaktan derleme yapmanıza olanak tanır. ses seviyesi.

Bazel ile program derlemek için bazel build yazıp ardından derlemek istediğiniz hedefi yazın.

bazel build //foo

//foo derleme komutunu verdikten 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 ilk olarak hedefinizin bağımlılık grafiğindeki tüm paketleri yükler. Buna, doğrudan hedefin BUILD dosyasında listelenen beyan edilen bağımlılıklar ve hedefinizin bağımlılıklarının BUILD dosyalarında listelenen geçiş bağımlılıkları dahildir. Bazel, tüm bağımlılıkları belirledikten sonra doğruluk açısından analiz eder ve derleme işlemlerini oluşturur. Son olarak, Bazel yürütme işlemini derleyiciler ve derlemenin diğer araçları.

Bazel, derlemenin yürütme aşamasında ilerleme mesajları yazdırır. İlerleme mesajları, mevcut derleme adımını (ör. derleyici veya bağlayıcı) başladığı anda ve toplam derleme işlemi sayısına göre tamamlanan sayıyı içerir. başlarsa Bazel yeni bir keşif modeli keşfederken toplam işlem grafiğinin tamamını görüntüleyebilir, ancak bu sayı birkaç saniye içinde sabitlenir.

Derlemenin sonunda, Bazel istenen hedeflerin başarılı bir şekilde oluşturulmadığını ve Öyleyse, çıktı dosyalarının bulundu. Derlemeleri çalıştıran komut dosyaları bu çıkışı güvenilir bir şekilde ayrıştırabilir. Daha fazla bilgi 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 bir boş derleme. Hiçbir şey değişmediğinden yeniden yüklenecek paket ve yürütülecek derleme adımı yoktur. "foo" veya bağımlılıklarında bir değişiklik olursa Bazel bazı derleme işlemlerini yeniden yürütür veya artımlı derleme işlemini tamamlar.

Birden fazla hedef oluşturma

Bazel, oluşturulacak hedeflerin belirlenmesi için çeşitli yöntemler sunar. Bunlar birlikte hedef kalıplar olarak bilinir. Bu söz dizimi, build, test veya query.

Etiketler, BUILD dosyalarında bağımlılıkları belirtmek gibi tek hedefleri belirtmek için kullanılırken Bazel'in hedef kalıpları birden çok hedefi belirtir. Hedef kalıpları, Hedef grupları için joker karakterler kullanarak etiket söz dizimi. En basit durumda, geçerli etiketler de geçerli hedef kalıplardır ve tam olarak bir hedef grubu tanımlar.

// ile başlayan tüm hedef kalıpları, mevcut çalışma alanına göre çözülür.

//foo/bar:wiz Yalnızca tek bir hedef //foo/bar:wiz.
//foo/bar //foo/bar:bar etiketine eş değer.
//foo/bar:all foo/bar paketindeki tüm kural hedefleri.
//foo/... foo dizininin altındaki tüm paketlerdeki tüm kural hedefleri.
//foo/...:all foo dizininin altındaki tüm paketlerdeki tüm kural hedefleri.
//foo/...:* foo dizininin altındaki tüm paketlerdeki tüm hedefler (kurallar ve dosyalar).
//foo/...:all-targets foo dizininin altındaki tüm paketlerdeki tüm hedefler (kurallar ve dosyalar).
//... Çalışma alanındaki paketlerdeki tüm hedefler. Bu, hedefleri içermez harici depolar.
//:all Çalışma alanının kökünde bir "BUILD" dosyası varsa üst düzey paketteki tüm hedefler.

// ile başlamayan hedef kalıplar, geçerli çalışma dizine göre çözülür. Bu örneklerde foo işletim sisteminin bir çalışma dizini olduğu varsayılmıştır:

:foo //foo:foo etiketine eş değer.
bar:wiz //foo/bar:wiz etiketine eş değer.
bar/wiz Eşdeğer:
  • foo/bar/wiz bir paketse //foo/bar/wiz:wiz
  • foo/bar bir paketse //foo/bar:wiz
  • //foo:bar/wiz aksi durumda
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ı, çıkış tabanının altına işaret edenler hariç (ör. çalışma alanının kök dizininde oluşturulan kolaylık sembolik bağlantıları) yinelenen hedef kalıpları için takip edilir.

Ayrıca Bazel, aşağıdaki adlara sahip bir dosya içeren herhangi bir dizindeki yinelenen hedef kalıplarını değerlendirirken sembolik bağlantıları takip etmez: DONT_FOLLOW_SYMLINKS_WHEN_TRAVERSING_THIS_DIRECTORY_VIA_A_RECURSIVE_TARGET_PATTERN

foo/..., paketler üzerinde uygulanan ve tüm paketleri yinelemeli olarak gösteren bir joker karakterdir foo dizininin altında (paket yolunun tüm kökleri için). :all bir bir paketteki tüm kurallarla eşleşen, hedefler üzerinde joker karakter. Bu ikisi, foo/...:all gibi bir ifadede birleştirilebilir ve her iki joker karakter de kullanıldığında bu ifade foo/... olarak kısaltılabilir.

Ayrıca :* (veya :all-targets) her hedefle eşleşen bir joker karakterdir normalde herhangi bir kurala göre oluşturulmayan dosyalar da dahil olmak üzere eşleşen paketler Örneğin, java_binary kurallarıyla ilişkili _deploy.jar dosyaları.

Bu, :*'ün :all'ın süper kümesini ifade ettiği anlamına gelir. Bu söz dizimi, kafa karıştırıcı olsa da _deploy.jar gibi derleme hedeflerinin istenmediği tipik derlemelerde tanıdık :all joker karakterinin kullanılmasına olanak tanır.

Ayrıca, Etiket söz dizimi; bu genellikle Bash dosya adı genişletmesi kullanılırken kullanışlıdır. Örneğin foo/bar/wiz, //foo/bar:wiz ile eşdeğerdir (geçerli bir değer varsa paketi foo/bar) veya //foo:bar/wiz (foo paketi varsa).

Birçok Bazel komutu, bağımsız değişken olarak bir hedef kalıpları listesini kabul eder ve önek olumsuzlama operatörünü - dikkate alın. Bu, önceki bağımsız değişkenler tarafından belirtilen gruptan bir hedef grubu çıkarmak için kullanılabilir. Bunun, dönüşüm hunisinin sıra önemlidir. Örneğin,

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

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

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

"foo/bar altındakiler hariç 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 çıkarılan hedeflerin, çıkarılmayan hedeflerin bağımlılıkları olabileceğinden oluşturulmayacaklarını garanti etmediğini belirtmek önemlidir. Örneğin, //foo:all-apis hedefi olsaydı //foo/bar:api bağımlı olduğu varsayıldığında, ikincisi bir bölüm oluşturabilirsiniz.

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 edilir, yani çıkarılır). Bazel'in bu test hedeflerini derlemesini/test etmesini istiyorsanız komut satırında açık hedef kalıplarıyla bu test hedeflerini belirtmeniz gerekir. Buna karşın, bazel query hiç performans göstermiyor (bu, filtrenin amacına uygun olmayan) bazel query) bilgileri gösterilir.

Harici bağımlılıkları getirme

Varsayılan olarak Bazel, derleme sırasında harici bağımlılıkları indirip sembolik bağlantı oluşturur. Ancak bu istenmeyen bir durum olabilir çünkü yeni dış bağımlılıklar eklendiğinde veya bağımlılıkları ya da mevcut "önceden getirme" bağımlılıkları (örneğin, çevrimdışı olacağınız uçuştan önce). Derleme sırasında yeni bağımlılıkların eklenmesini engellemek isterseniz --fetch=false işaretini belirtebilirsiniz. Bu işaretin yalnızca yerel dosya sistemindeki bir dizini işaret etmeyen depo kuralları için geçerli olduğunu unutmayın. Örneğin, local_repository ile ilgili değişiklikler, new_local_repository ile Android SDK ile NDK deposu kuralları --fetch değerinden bağımsız olarak her zaman geçerli olur .

Derleme sırasında getirme işlemine izin vermezseniz ve Bazel yeni harici yoksa derlemeniz başarısız olur.

bazel fetch komutunu çalıştırarak bağımlılıkları manuel olarak getirebilirsiniz. Derleme sırasında getirme işlemine izin vermezseniz bazel fetch'yi çalıştırmanız gerekir:

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

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

fetch, bağımlılıkları getirilecek hedeflerin listesini alır. Örneğin, Örneğin, bu komut //foo:bar oluşturmak için gerekli olan bağımlılıkları getirir ve //bar:baz:

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 jar'larından JDK'ya kadar) Workspace kök dizininizdeyse bazel fetch'i çalıştırmanız gerekmez. Ancak, Workspace dizini dışında bir uygulama kullanıyorsanız Bazel çalıştırmadan önce otomatik olarak bazel fetch çalıştırır bazel build.

Depo önbelleği

Bazel, aynı dosyanın farklı çalışma alanlarında kullanılması gerekse bile veya harici bir deposun tanımı değişse bile yine aynı dosyanın indirilmesi gerekiyorsa bile aynı dosyayı birden çok kez getirmemeye çalışır. Bunun için, bazel, depo önbelleğinde indirilen tüm dosyaları önbelleğe alır. Bu önbellek, varsayılan ~/.cache/bazel/_bazel_$USER/cache/repos/v1/ adresinde bulunuyor. İlgili içeriği oluşturmak için kullanılan konumu, --repository_cache seçeneği ile değiştirilebilir. Önbellek, tüm çalışma alanları ve bazel'in yüklü sürümleri arasında paylaşılır. Bazel, doğru dosyanın bir kopyasına sahip olduğunu kesin olarak biliyorsa (yani indirme isteğinde belirtilen dosyanın SHA256 toplamı varsa ve önbellekte bu karma değerine sahip bir dosya varsa) önbellekten bir giriş alınır. Bu nedenle, her harici dosya için karma değeri belirtmek yalnızca güvenlik açısından iyi bir fikir değil, aynı zamanda gereksiz indirmelerden de kaçınmanıza yardımcı olur.

Her önbellek isabetinde, dosyanın önbellekteki değiştirilme zamanı güncellendi. Bu sayede, önbellek dizininde bir dosyanın son kullanımı kolayca belirlenebilir (ör. önbelleği manuel olarak temizlemek için). Artık yayında olmayan bir dosyanın kopyasını içerebileceği için önbellek hiçbir zaman otomatik olarak temizlenmez.

Dağıtım dosyası dizinleri

Dağıtım dizini, gereksiz kullanımı önlemek için kullanılan başka bir Bazel mekanizmasıdır indirin. Bazel, depo önbelleğinden önce dağıtım dizinlerinde arama yapar. En önemli fark, dağıtım dizininin manuel olarak hazırlık.

--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şittir ve buna ek olarak dosyanın karma değeri de değerine eşit olmalıdır. Bu yalnızca dosya karması WORKSPACE bildiriminde belirtilir.

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 sayede, dağıtım dosyası dizinlerini belirtmek, bu tür bir dizindeki dosya sayısı çok fazla olsa bile etkili olmaya devam eder.

Bazel'i hava boşluğu olan bir ortamda çalıştırma

Bazel'in ikili program boyutunu küçük tutmak için Bazel'in örtülü bağımlılıkları getirilir. çalıştırmanız gerekir. Bu gizli bağımlılıklarda, herkes için gerekli olmayabilecek araç zincirleri ve kurallar bulunur. Örneğin, Android araçları yalnızca Android projeleri oluşturulurken paketten çıkarılır ve getirilir.

Ancak bu örtülü bağımlılıklar, Tüm tedarikçi firmanızı teslim etmiş olsanız bile, havalandırması olan bir ortamda WORKSPACE bağımlılıkları. Bu sorunu çözmek için ağ erişimi olan bir makinede bu bağımlılıkları içeren bir dağıtım dizini hazırlayabilir ve ardından bunları çevrimdışı bir yaklaşımla hava boşluğu ortamına aktarabilirsiniz.

Dağıtım dizinini hazırlamak için --distdir tıklayın. Örtük bağımlılıklar her sürüm için farklı olabileceğinden, bunu her yeni Bazel ikili sürümü için bir kez yapmanız gerekir.

Bu bağımlılıkları havalandırmalı ortamınızın dışında oluşturmak için öncelikle Bazel kaynak ağacını doğru sürümden kontrol edin:

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

Ardından, bu hedef için dolaylı çalışma zamanı bağımlılıklarını içeren belirli Bazel sürümü:

bazel build @additional_distfiles//:archives.tar

Bu tarball'ı, hava boşluğu olan ortamınıza kopyalanabilecek bir dizine aktarın. --distdir, dizin iç içe yerleştirme düzeyinde oldukça titiz olabileceğinden --strip-components işaretine dikkat edin:

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

Son olarak, Bazel'i hava boşluğu olan ortamınızda kullanırken dizine işaret eden --distdir işaretini iletin. Kolaylık olması için kartı .bazelrc olarak ekleyebilirsiniz. giriş:

build --distdir=path/to/directory

Derleme yapılandırmaları ve çapraz derleme

Belirli bir derlemenin davranışını ve sonucunu belirten tüm girişler üç kategoriye ayrılır. İlk tür, projenizin BUILD dosyalarında depolanan içsel bilgilerdir: derleme kuralı, özelliklerinin değerleri ve geçişli bağımlılıklarının tamamı. İkinci tür, kullanıcı veya derleme aracı tarafından sağlanan harici veya ortam verileridir: hedef mimari seçimi, derleme ve bağlama seçenekleri ve diğer araç zinciri yapılandırma seçenekleri. Tam bir çevre verisi grubuna yapılandırma denir.

Herhangi bir derlemede birden fazla yapılandırma olabilir. Bir 64 bit için yürütülebilir bir //foo:bin derlediğiniz çapraz derleme ancak iş istasyonunuz 32 bit makineyse. Derleme işlemi için //foo:bin'ün 64 bit yürütülebilir dosyalar oluşturabilen bir araç zinciri kullanılarak derlenmesi gerektiği açıktır. Ancak derleme sistemi, derleme sırasında kullanılan çeşitli araçları (ör. kaynaktan derlenen ve daha sonra bir genrule'de kullanılan araçlar) da derlemelidir ve bu araçlar, iş istasyonunuzda çalışacak şekilde derlenmelidir. Bu nedenle, iki yapılandırma tanımlayabiliriz: derleme sırasında çalışan araçları derlemek için kullanılan yürütme yapılandırması ve nihayetinde istediğiniz ikili dosyayı derlemek için kullanılan hedef yapılandırma (veya istem yapılandırması, ancak bu kelimenin zaten birçok anlamı olmasına rağmen daha çok "hedef yapılandırma" deriz).

Genellikle, istenen her iki dosyanın ön koşulu olan birçok kitaplık vardır. derleme hedefi (//foo:bin) ve bir veya daha fazla yönetici aracından temel kitaplıklar. Bu tür kitaplıklar, yürütme yapılandırması için bir kez ve hedef yapılandırma için bir kez olmak üzere iki kez derlenmelidir. Bazel, her iki varyantın da derlendiğinden ve türetilmiş dosyaların karışıklık olmaması için ayrı tutulduğundan emin olur. Bu tür hedefler genellikle birbirinden bağımsız oldukları için eşzamanlı olarak derlenebilir. İlerleme durumu mesajları görürseniz bir hedefin iki kez oluşturulduğunu gösterir. Bu, büyük olasılıkla açıklama.

Yürütme yapılandırması, hedef yapılandırmadan şu şekilde türetilir:

  • Crosstool (--crosstool_top) aracının istek yapılandırması (--host_crosstool_top belirtilmediği sürece)
  • --cpu için --host_cpu değerini kullanın (varsayılan: k8).
  • Bu seçeneklerin, istekte belirtilenle aynı değerlerini kullan yapılandırma: --compiler, --use_ijars ve --host_crosstool_top ise kullanılırsa --host_cpu değeri, Yönetici için Crosstool'da default_toolchain (--compiler yok sayılıyor) yapılandırma.
  • --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ş derlemeleri kullanın (-c opt).
  • Hata ayıklama bilgisi oluşturmaz (--copt=-g0).
  • Yürütülebilir dosyalardan ve paylaşılan kitaplıklardan hata ayıklama bilgilerini kaldırın (--strip=always).
  • Türetilen tüm dosyaları, Google tarafından kullanılandan farklı özel bir konuma yerleştirin istek yapılandırmasını devreye sokmanız gerekir.
  • Derleme verileriyle ikili programların damgalanmasını engelle (--embed_* seçeneklerine bakın).
  • Diğer tüm değerler varsayılan ayarlarında kalır.

Farklı bir yönetici seçmenin tercih edilmesinin birçok nedeni vardır isteğe bağlı konfigürasyondur. En önemlisi:

İlk olarak, sadeleştirilmiş ve optimize edilmiş ikili programlar kullanarak sitenizin araçları, araçların işgal ettiği disk alanını ve ağ G/Ç süresini artırır.

İkinci olarak, tüm derlemelerde yürütme ve istek yapılandırmalarını birbirinden ayırarak, daha önce açıklandığı gibi istek yapılandırmasında yapılan küçük değişikliklerden (ör. bir bağlayıcı seçeneğini değiştirme) kaynaklanan çok pahalı yeniden derlemelerden kaçınabilirsiniz.

Artımlı yeniden oluşturma işlemlerini düzeltme

Bazel projesinin birincil hedeflerinden biri, doğru artımlı yeniden derlemeleri sağlamaktır. Önceki derleme araçları (özellikle Make tabanlı olanlar), artımlı derlemeleri uygulama konusunda birkaç mantıksız varsayımda bulunur.

İlk olarak, dosyaların zaman damgaları tekdüze olarak artar. Bu durum genelde geçerli olsa da bu varsayıma düşmek çok kolaydır. Bir dosyanın daha önceki bir düzeltmesiyle senkronize edilmesi, söz konusu dosyanın değişiklik süresinin azalmasına neden olur. Make tabanlı sistemler yeniden oluşturmaz.

Daha genel olarak ifade etmek gerekirse, Yapma, dosyalarda yapılan değişiklikleri algılasa da değişiklikleri algılamaz. komutlara dönüştürebilirsiniz. Belirli bir derleme adımında derleyiciye iletilen seçenekleri değiştirirseniz Make, derleyiciyi yeniden çalıştırmaz ve önceki derlemenin geçersiz çıkışlarını make clean kullanarak manuel olarak reddetmek gerekir.

Ayrıca Make, bir e-postanın başarısız şekilde sonlandırılmasına karşı dayanıklı değildir. bu alt işlemin çıkış dosyasına yazmaya başlamasından sonraki alt işlemleri içerir. Bu sırada Yapma'nın mevcut yürütülmesi başarısız olursa bir sonraki Make körü körüne kesilmiş çıkış dosyasının geçerli olduğunu varsayın (çünkü yer alır) ve yeniden oluşturulmaz. Benzer şekilde, Make işlemi sonlandırılırsa benzer bir durum ortaya çıkabilir.

Bazel bu ve diğer varsayımlardan kaçınır. Bazel, daha önce yapılan tüm çalışmaların veritabanını tutar ve yalnızca ilgili derleme adımı için girişteki giriş dosyalarının (ve zaman damgalarının) ve derleme komutunun veritabanındaki bir girişle tam olarak eşleştiğini ve veritabanı girişindeki çıkış dosyalarının (ve zaman damgalarının) diskteki dosyaların zaman damgalarıyla tam olarak eşleştiğini tespit ederse bir derleme adımını atlar. Giriş dosyalarında, çıkış dosyalarında veya komutun kendisinde yapılan herhangi bir değişiklik, derleme adımını yeniden yürütür.

Doğru artımlı derlemelerin kullanıcılarına faydası şu şekildedir: zihin bulanıklığı. (Ayrıca, gerekli veya önleyici olsun make clean kullanımının neden olduğu yeniden oluşturma işlemlerini beklemek için daha az zaman harcarsınız.)

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

Resmi olarak, beklenen tüm çıkış dosyaları mevcut olduğunda ve içerikleri, oluşturulmaları için gereken adımlar veya kurallarda belirtildiği gibi doğru olduğunda derlemenin durumunu tutarlı olarak tanımlarız. Bir kaynak dosyayı düzenlediğinizde, derlemenin tutarsız olduğu söylenir ve bir sonraki çalıştırmanıza kadar tutarsız kalır geliştirmenizi sağlayan bir programdır. Bu durumu kararsız tutarsızlık, çünkü yalnızca geçicidir ve tutarlılık çalıştırmayı göstereceğim.

Zararlı olan başka bir tutarsızlık daha vardır: kararlılık Tutarsızlık. Derleme kararlı ve tutarsız bir duruma ulaşırsa tekrarlanır çağrısının başarılı bir şekilde yapılması tutarlılığı geri kazanmaz: ve çıkışlar yanlış kalır. Make (ve diğer derleme araçları) kullanıcılarının make clean yazmasının başlıca nedeni kararlı tutarsız durumlardır. Derleme aracının bu şekilde başarısız olduğunu öğrenmek (ve ardından bu durumdan kurtulmak) zaman alıcı ve can sıkıcı olabilir.

Kavramsal olarak, tutarlı bir derleme elde etmenin en basit yolu, önceki tüm derleme çıktılarını atmak ve baştan başlamaktır: Her derlemeyi temiz bir derleme yapın. Bu yaklaşımın pratik olması için çok zaman aldığı açıktır (belki de sürüm mühendisleri için hariç). Bu nedenle, derleme aracının yararlı olması için tutarlılıktan ödün vermeden artımlı derlemeler gerçekleştirebilmesi 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 kararlı tutarsız durumlardan kaçınmada yetersizdir. Buna karşılık Bazel şu garantiyi sunar: Hiçbir düzenleme yapmadığınız bir derleme aracı çağrısı başarılı olduğunda derleme tutarlı bir durumda olur. (Kaynak dosyalarınızı yoksa Bazel, derlemenin sonucunun tutarlılığı konusunda mevcut derlemedir. Ancak sonraki derlemenin sonuçlarının, tutarlılığı sağlar.)

Tüm garantilerde olduğu gibi, bazı ek bilgiler vardır: Bunları bilinen kararlı bir şekilde çalışmaya başladı. Artımlı bağımlılık analizinde kasıtlı olarak hata bulmaya yönelik girişimlerden kaynaklanan bu tür sorunları inceleyeceğimizi garanti edemeyiz. Ancak derleme aracının normal veya "makul" kullanımından kaynaklanan tüm kararlı tutarsız durumları inceleyip düzeltmek için elimizden geleni yapacağız.

Bazel ile ilgili tutarsız bir durum tespit ederseniz lütfen hatayı bildirin.

Korumalı alanda yürütme

Bazel, işlemlerin hermetik olarak gerçekleşmesini sağlamak için korumalı alanları kullanır. sağlayabilir. Bazel, spawn'ları (genel anlamda işlemler) yalnızca aracın görevini yerine getirmek için ihtiyaç duyduğu minimum dosya grubunu içeren korumalı alanlarda çalıştırır. Şu anda Korumalı alana alma özelliği Linux 3.12 veya sonraki sürümlerde CONFIG_USER_NS seçeneğiyle birlikte çalışır etkin ve macOS 10.11 veya sonraki sürümlerde kullanılabilir.

Sisteminizde korumalı alan desteklenmiyorsa Bazel, derlemelerin hermetik olmasının garanti edilmediği ve ana sistemi bilinmeyen şekillerde etkileyebileceği konusunda sizi uyarmak için bir uyarı yazdırır. Bu uyarıyı devre dışı bırakmak için Bazel'e --ignore_unsupported_sandboxing işareti.

Google Kubernetes Engine küme düğümleri veya Debian gibi bazı platformlarda, güvenlik endişeleri nedeniyle kullanıcı ad alanları varsayılan olarak devre dışı bırakılır. Bunu, dosyaya bakıp kontrol ederek /proc/sys/kernel/unprivileged_userns_clone: Varsa ve 0 içeriyorsa, Kullanıcı ad alanları, sudo sysctl kernel.unprivileged_userns_clone=1.

Bazı durumlarda Bazel korumalı alanı, sistem nedeniyle kurulumu. Belirti genellikle namespace-sandbox.c:633: execvp(argv[0], argv): No such file or directory'e benzer bir mesaj gösteren bir hatadır. Bu durumda, şu soruna sahip kullanıcılar için korumalı alanı devre dışı bırakmayı deneyin: --strategy=Genrule=standalone ve diğer kurallar için --spawn_strategy=standalone. Ayrıca, sorunu inceleyip sonraki bir sürümde düzeltme sunabilmemiz için lütfen sorun takipçimizde bir hata bildirin ve hangi Linux dağıtımını kullandığınızı belirtin.

Yapının aşamaları

Bazel'de bir yapı üç farklı aşamada gerçekleşir: kullanıcı olarak arasındaki fark, derlemeyi kontrol eden seçenekler hakkında (aşağıya bakın).

Yükleme aşaması

İlki yükleme işlemidir. Bu işlem sırasında ilk hedeflerin ve bağımlılıkların geçişli olarak kapatılmasının yüklenmesi, ayrıştırılır, değerlendirilir ve önbelleğe alınır.

Bazel sunucusu çalıştırıldıktan sonra ilk derleme için, dosya sisteminden birçok BUILD dosyası yüklendiğinden yükleme aşaması genellikle birkaç saniye sürer. Sonraki derlemelerde, özellikle BUILD dosyası değişmediyse yükleme çok hızlı gerçekleşir.

Bu aşamada bildirilen hatalar şunları içerir: paket bulunamadı, hedef bulunamadı, BUILD dosyasındaki sözlük ve dil bilgisi hataları ile değerlendirme hataları.

Analiz aşaması

İkinci aşama olan analiz ise verilerin, anlamsal analizi ve doğrulanmasını içerir. her derleme kuralının, bir derleme bağımlılık grafiğinin tam olarak hangi işin yapılacağının belirlenmesini sağlar.

Yükleme gibi analiz de tamamı hesaplandığında birkaç saniye sürer. Ancak Bazel, bağımlılık grafiğini bir derlemeden diğerine ve yalnızca olması gerekeni yeniden analiz eder ve böylece artımlı Bu durum, paketlerin önceki derlemeden bu yana değişmediği durumlarda geçerlidir.

Bu aşamada bildirilen hatalar şunları içerir: uygunsuz bağımlılıklar, geçersiz tüm kurala özel hata mesajlarını içeren bir e-posta alırsınız.

Bazel gereksiz dosyalardan kaçındığı için yükleme ve analiz aşamaları hızlıdır Bu aşamada G/O üzerinde çalışır ve gerçekleştirilecek çalışmayı belirlemek için yalnızca BUILD dosyalarını okur. tamamlandı. Bu durum, Bazel'in yükleme aşamasının üzerine uygulanan sorgu komutu gibi analiz araçları için Bazel'i iyi bir temel haline getirir.

Yürütme aşamasında

Derlemenin üçüncü ve son aşaması yürütme adımıdır. Bu aşama, proje yöneticisinin derlemedeki her adımın çıktıları girişlerle tutarlıdır. Yeniden çalıştırılarak derleme/bağlantı oluşturma vb. olabilir. Bu adımda, derleme arasında, büyük bir oturum için birkaç saniyeden bir saatten seçeceğiz. Bu aşamada bildirilen hatalar şunlardır: eksik kaynak dosyalar, bazı derleme işlemleri tarafından yürütülen bir araçtaki hatalar veya bir aracın beklenen çıkış grubunu üretememesi.