Giriş
Bazel'i kullanmaya yeni mi başladınız? Doğru yerdesiniz. Bazel'i kullanmaya yönelik basit bir giriş için bu ilk derleme eğitimini izleyin. Bu eğitimde, temel terimler Bazel bağlamında kullanıldığı şekilde tanımlanmakta ve Bazel iş akışının temelleri açıklanmaktadır. İhtiyacınız olan araçlardan başlayarak karmaşıklığı artan üç proje oluşturup çalıştıracak ve bu projelerin nasıl ve neden daha karmaşık hale geldiğini öğreneceksiniz.
Bazel, çok dilli derlemeleri destekleyen bir derleme sistemi olsa da bu eğitimde örnek olarak bir C++ projesi kullanılmakta ve çoğu dil için geçerli olan genel yönergeler ve akış sağlanmaktadır.
Tahmini tamamlama süresi: 30 dakika.
Ön koşullar
Henüz yapmadıysanız Bazel'i yükleyin. Bu eğitimde kaynak kontrolü için Git kullanılır. En iyi sonuçlar için Git'i de yükleyin.
Ardından, tercih ettiğiniz komut satırı aracında aşağıdakileri çalıştırarak örnek projeyi Bazel'in GitHub deposundan alın:
git clone https://github.com/bazelbuild/examplesBu eğitim için örnek proje examples/cpp-tutorial dizinindedir.
Bu sayfanın nasıl yapılandırıldığına göz atın:
examples
└── cpp-tutorial
├──stage1
│ ├── main
│ │ ├── BUILD
│ │ └── hello-world.cc
│ └── MODULE.bazel
├──stage2
│ ├── main
│ │ ├── BUILD
│ │ ├── hello-world.cc
│ │ ├── hello-greet.cc
│ │ └── hello-greet.h
│ └── MODULE.bazel
└──stage3
├── main
│ ├── BUILD
│ ├── hello-world.cc
│ ├── hello-greet.cc
│ └── hello-greet.h
├── lib
│ ├── BUILD
│ ├── hello-time.cc
│ └── hello-time.h
└── MODULE.bazel
Her biri bu eğitimdeki bir aşamayı temsil eden üç dosya grubu vardır. İlk aşamada, tek bir paket içinde bulunan tek bir hedef oluşturursunuz. İkinci aşamada, tek bir paketten hem ikili program hem de kitaplık oluşturacaksınız. Üçüncü ve son aşamada, birden fazla paket içeren bir proje oluşturacak ve bu projeyi birden fazla hedef için derleyeceksiniz.
Özet: Giriş
Bazel'i (ve Git'i) yükleyip bu eğitim için kod deposunu klonlayarak Bazel ile ilk derleme işleminizin temelini atmış oldunuz. Bazı terimleri tanımlamak ve çalışma alanınızı ayarlamak için bir sonraki bölüme geçin.
Başlarken
Proje oluşturmadan önce projenin çalışma alanını ayarlamanız gerekir. Çalışma alanı, projenizin kaynak dosyalarını ve Bazel'in derleme çıkışlarını içeren bir dizindir. Ayrıca aşağıdaki önemli dosyaları da içerir:
- Dizin ve içeriğini Bazel çalışma alanı olarak tanımlayan ve projenin dizin yapısının kökünde bulunan
MODULE.bazeldosyası. Ayrıca, dış bağımlılıklarınızı da burada belirtirsiniz. - Bazel'e projenin farklı bölümlerinin nasıl derleneceğini bildiren bir veya daha fazla
BUILDdosyası. Çalışma alanındakiBUILDdosyası içeren bir dizin pakettir. (Paketler hakkında daha fazla bilgiyi bu eğitimde daha sonra bulabilirsiniz.)
Gelecekteki projelerde bir dizini Bazel çalışma alanı olarak belirlemek için söz konusu dizinde MODULE.bazel adlı boş bir dosya oluşturun. Bu eğitim için her aşamada zaten bir MODULE.bazel dosyası mevcuttur.
BUILD dosyasını anlama
BUILD dosyası, Bazel için birkaç farklı türde talimat içerir. Her BUILD dosyasında, Bazel'e istediğiniz çıktıları (ör. yürütülebilir ikili dosyalar veya kitaplıklar) nasıl oluşturacağını söyleyen bir talimat dizisi olarak en az bir kural gerekir. BUILD dosyasındaki her derleme kuralı örneğine hedef denir ve belirli bir kaynak dosya ve bağımlılıklar kümesini işaret eder. Hedefler diğer hedefleri de gösterebilir.
cpp-tutorial/stage1/main dizinindeki BUILD dosyasına göz atın:
cc_binary(
name = "hello-world",
srcs = ["hello-world.cc"],
)
Örneğimizde hello-world hedefi, Bazel'in yerleşik cc_binary kuralını örneklendirir. Kural, Bazel'e hello-world.cc> kaynak dosyasından bağımlılık içermeyen, kendi kendine yeten bir yürütülebilir ikili dosya oluşturmasını söyler.
Özet: Başlarken
Artık bazı temel terimleri ve bu proje ile genel olarak Bazel bağlamında ne anlama geldiklerini biliyorsunuz. Bir sonraki bölümde, projenin 1. aşamasını oluşturup test edeceksiniz.
1. Aşama: tek hedef, tek paket
Projenin ilk bölümünü oluşturmanın zamanı geldi. Projenin 1. Aşama bölümünün yapısına görsel referans olarak göz atın:
examples
└── cpp-tutorial
└──stage1
├── main
│ ├── BUILD
│ └── hello-world.cc
└── MODULE.bazel
cpp-tutorial/stage1 dizinine gitmek için aşağıdaki komutu çalıştırın:
cd cpp-tutorial/stage1Ardından şu komutu çalıştırın:
bazel build //main:hello-worldHedef etiketinde //main: kısmı, BUILD dosyasının çalışma alanının köküne göre konumudur ve hello-world, BUILD dosyasındaki hedef addır.
Bazel aşağıdaki gibi bir sonuç oluşturur:
INFO: Found 1 target...
Target //main:hello-world up-to-date:
bazel-bin/main/hello-world
INFO: Elapsed time: 2.267s, Critical Path: 0.25s
İlk Bazel hedefinizi oluşturdunuz. Bazel, derleme çıktılarını çalışma alanının kökündeki bazel-bin dizinine yerleştirir.
Artık yeni oluşturulan ikili programınızı test edin. Bu program:
bazel-bin/main/hello-worldBu işlem, "Hello world" mesajının yazdırılmasına neden olur.
1. Aşama'nın bağımlılık grafiği aşağıda verilmiştir:

Özet: 1. aşama
İlk derlemenizi tamamladığınıza göre, derlemelerin nasıl yapılandırıldığına dair temel bir fikriniz var. Sonraki aşamada, başka bir hedef ekleyerek karmaşıklığı artıracaksınız.
2. Aşama: birden çok derleme hedefi
Küçük projeler için tek bir hedef yeterli olsa da büyük projeleri birden fazla hedefe ve pakete bölmek isteyebilirsiniz. Bu sayede, Bazel yalnızca değişenleri yeniden derleyerek hızlı artımlı derlemeler yapmanıza olanak tanır ve bir projenin birden fazla bölümünü aynı anda derleyerek derlemelerinizi hızlandırır. Eğitimin bu aşamasında bir hedef, sonraki aşamada ise bir paket eklenir.
2. Aşama için kullandığınız dizin budur:
├──stage2
│ ├── main
│ │ ├── BUILD
│ │ ├── hello-world.cc
│ │ ├── hello-greet.cc
│ │ └── hello-greet.h
│ └── MODULE.bazel
cpp-tutorial/stage2/main dizinindeki BUILD dosyasına göz atın:
cc_library(
name = "hello-greet",
srcs = ["hello-greet.cc"],
hdrs = ["hello-greet.h"],
)
cc_binary(
name = "hello-world",
srcs = ["hello-world.cc"],
deps = [
":hello-greet",
],
)
Bazel, bu BUILD dosyasıyla önce hello-greet kitaplığını (Bazel'in yerleşik cc_library kuralını kullanarak) ardından hello-world ikili programını oluşturur. hello-world hedefindeki deps özelliği, Bazel'e hello-world ikilisini derlemek için hello-greet kitaplığının gerekli olduğunu bildirir.
Projenin bu yeni sürümünü derlemeden önce dizinleri değiştirmeniz ve aşağıdaki komutu çalıştırarak cpp-tutorial/stage2 dizine geçmeniz gerekir:
cd ../stage2Artık aşağıdaki tanıdık komutu kullanarak yeni ikili dosyayı derleyebilirsiniz:
bazel build //main:hello-worldBazel yine şuna benzer bir şey oluşturur:
INFO: Found 1 target...
Target //main:hello-world up-to-date:
bazel-bin/main/hello-world
INFO: Elapsed time: 2.399s, Critical Path: 0.30s
Artık yeni oluşturulan ikili dosyanızı test edebilirsiniz. Bu dosya, başka bir "Hello
world" döndürür:
bazel-bin/main/hello-worldArtık hello-greet.cc dosyasını değiştirip projeyi yeniden oluşturursanız Bazel yalnızca bu dosyayı yeniden derleyecektir.
Bağımlılık grafiğine baktığınızda hello-world'ün hello-greet adlı ek bir girişe bağlı olduğunu görebilirsiniz:

Özet: 2. aşama
Artık projeyi iki hedefle oluşturdunuz. hello-world hedefi bir kaynak dosya oluşturur ve iki ek kaynak dosyası oluşturan başka bir hedefe (//main:hello-greet) bağlıdır. Bir sonraki bölümde, bir adım daha ileri gidip başka bir paket daha ekleyin.
3. Aşama: birden fazla paket
Bu sonraki aşamada, karmaşıklık bir kat daha artar ve birden fazla paket içeren bir proje oluşturulur. cpp-tutorial/stage3 dizininin yapısına ve içeriğine göz atın:
└──stage3
├── main
│ ├── BUILD
│ ├── hello-world.cc
│ ├── hello-greet.cc
│ └── hello-greet.h
├── lib
│ ├── BUILD
│ ├── hello-time.cc
│ └── hello-time.h
└── MODULE.bazel
Artık iki alt dizin olduğunu ve her birinin bir BUILD dosyası içerdiğini görebilirsiniz. Bu nedenle, Bazel için çalışma alanı artık iki paket içeriyor: lib ve
main.
lib/BUILD dosyasına göz atın:
cc_library(
name = "hello-time",
srcs = ["hello-time.cc"],
hdrs = ["hello-time.h"],
visibility = ["//main:__pkg__"],
)
main/BUILD dosyasında:
cc_library(
name = "hello-greet",
srcs = ["hello-greet.cc"],
hdrs = ["hello-greet.h"],
)
cc_binary(
name = "hello-world",
srcs = ["hello-world.cc"],
deps = [
":hello-greet",
"//lib:hello-time",
],
)
Ana paketteki hello-world hedefi, lib paketindeki hello-time hedefine bağlıdır (bu nedenle hedef etiketi //lib:hello-time). Bazel bunu deps özelliği aracılığıyla bilir. Bu durumu bağımlılık grafiğinde görebilirsiniz:

Derlemenin başarılı olması için görünürlük özelliğini kullanarak lib/BUILD'daki //lib:hello-time hedefini main/BUILD'deki hedeflere açıkça görünür hale getirirsiniz.
Bunun nedeni, hedeflerin varsayılan olarak yalnızca aynı BUILD dosyasındaki diğer hedefler tarafından görülebilmesidir. Bazel, uygulama ayrıntılarını içeren kitaplıkların herkese açık API'lere sızması gibi sorunları önlemek için hedef görünürlüğünü kullanır.
Şimdi projenin bu son sürümünü derleyin. Aşağıdaki komutu çalıştırarak cpp-tutorial/stage3 dizinine geçin:
cd ../stage3Aşağıdaki komutu tekrar çalıştırın:
bazel build //main:hello-worldBazel aşağıdaki gibi bir sonuç oluşturur:
INFO: Found 1 target...
Target //main:hello-world up-to-date:
bazel-bin/main/hello-world
INFO: Elapsed time: 0.167s, Critical Path: 0.00s
Son Hello world mesajı için bu eğitimdeki son ikili dosyayı test edin:
bazel-bin/main/hello-worldÖzet: 3. aşama
Artık projeyi üç hedefi olan iki paket olarak oluşturdunuz ve aralarındaki bağımlılıkları anladınız. Bu sayede, Bazel ile gelecekteki projeleri oluşturmaya hazırsınız. Bir sonraki bölümde, Basel yolculuğunuza nasıl devam edeceğiniz açıklanmaktadır.
Sonraki adımlar
Bazel ile ilk temel derlemenizi tamamladınız. Ancak bu sadece başlangıç. Bazel ile ilgili daha fazla bilgi edinmek için aşağıdaki kaynaklardan yararlanabilirsiniz:
- C++'ya odaklanmaya devam etmek için yaygın C++ derleme kullanım alanları hakkında bilgi edinin.
- Bazel ile başka uygulamalar oluşturmaya başlamak için Java, Android uygulaması veya iOS uygulaması ile ilgili eğitici içeriklere göz atın.
- Yerel ve uzak depolarla çalışma hakkında daha fazla bilgi edinmek için harici bağımlılıklar hakkındaki makaleyi inceleyin.
- Bazel'in diğer kuralları hakkında daha fazla bilgi edinmek için bu referans kılavuzunu inceleyin.
İyi çalışmalar.