Giriş
Bazel'i kullanmaya yeni mi başladınız? Doğru yerdesiniz. Bazel'i kullanmaya dair basitleştirilmiş bir giriş için bu İlk Derleme eğitimini inceleyin. Bu eğitimde, Bazel bağlamında kullanılan temel terimler tanımlanmakta ve Bazel iş akışının temel bilgileri açıklanmaktadır. İhtiyacınız olan araçlarla başlayarak, karmaşıklığı giderek 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ılıyor ve çoğu dil için geçerli olan genel yönergeler ve akış sağlanıyor.
Tahmini tamamlama süresi: 30 dakikadır.
Ön koşullar
Henüz yapmadıysanız Bazel'i yükleyerek başlayın. Bu eğitimde kaynak kontrolü için Git kullanılıyor. En iyi sonuçları elde etmek 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ğitimdeki örnek proje examples/cpp-tutorial dizinindedir.
Yapısını inceleyin:
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
Üç dosya grubu vardır. Her grup, bu eğitimdeki bir aşamayı temsil eder. İlk aşamada, tek bir pakette bulunan tek bir hedef oluşturacaksınız. İkinci aşamada, tek bir paketten hem ikili hem de kitaplık oluşturacaksınız. Üçüncü ve son aşamada, birden fazla paket içeren bir proje oluşturacak ve bunu birden fazla hedefle derleyeceksiniz.
Özet: Giriş
Bazel'i (ve Git'i) yükleyip bu eğitimin kod deposunu klonlayarak Bazel ile ilk derlemenizin temelini atmış oldunuz. Bazı terimleri tanımlamak ve çalışma alanınızı ayarlamak için sonraki bölüme geçin.
Başlarken
Proje derlemek için önce çalışma alanını ayarlamanız gerekir. Çalışma alanı, projenizin kaynak dosyalarını ve Bazel'in derleme çıktılarını içeren bir dizindir. Ayrıca şu önemli dosyaları da içerir:
- Dizini 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, harici bağımlılıklarınızı da burada belirtirsiniz. - Projenin farklı bölümlerinin nasıl derleneceğini Bazel'e bildiren bir veya daha fazla
BUILDdosyası. Çalışma alanındaBUILDdosyası içeren bir dizin, paket olarak kabul edilir. (Paketler hakkında daha fazla bilgiyi bu eğitimin ilerleyen bölümlerinde edineceksiniz.)
Gelecekteki projelerde bir dizini Bazel çalışma alanı olarak belirlemek için bu dizinde MODULE.bazel adlı boş bir dosya oluşturun. Bu eğitimde, her aşamada MODULE.bazel dosyası olduğu varsayılmaktadır.
DERLEME dosyasını anlama
BUILD dosyası, Bazel için çeşitli talimat türleri içerir. Her BUILD dosyası, Bazel'e yürütülebilir ikili programlar veya kitaplıklar gibi istediğiniz çıktıları nasıl derleyeceğini söyleyen bir dizi talimat olarak en az bir kural gerektirir. BUILD dosyasındaki her derleme kuralı örneği, hedef olarak adlandırılır ve belirli bir kaynak dosyalar ve bağımlılıklar kümesini işaret eder. Bir hedef, diğer hedefleri de işaret edebilir.
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. Bu kural, Bazel'e hello-world.cc kaynak dosyasından bağımsız bir yürütülebilir ikili program oluşturmasını söyler.
Özet: Başlangıç
Artık bazı temel terimlerin yanı sıra bu proje ve 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şturma zamanı. Görsel referans için projenin 1. Aşama bölümünün yapısı şöyledir:
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 konumu, hello-world ise BUILD dosyasındaki hedef adıdır.
Bazel, aşağıdaki gibi bir çıktı üretir:
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 derlediniz. Bazel, derleme çıkışlarını çalışma alanının kökündeki bazel-bin dizinine yerleştirir.
Şimdi yeni derlediğiniz ikili programı test edin. Bu program:
bazel-bin/main/hello-worldBu durumda, "Hello world" mesajı yazdırılır.
1. Aşama'nın bağımlılık grafiği:

Özet: 1. aşama
İlk derlemenizi tamamladığınıza göre artık derlemenin nasıl yapılandırıldığına dair temel bir fikriniz var. Bir sonraki aşamada, başka bir hedef ekleyerek karmaşıklığı artıracaksınız.
2. aşama: Birden fazla derleme hedefi
Küçük projeler için tek bir hedef yeterli olsa da daha büyük projeleri birden fazla hedef ve pakete bölmek isteyebilirsiniz. Bu, hızlı artımlı derlemelere olanak tanır. Yani Bazel yalnızca değişenleri yeniden derler 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şamasında ise bir paket eklenir.
2. Aşama için çalıştığınız dizin:
├──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",
],
)
Bu BUILD dosyasıyla Bazel önce hello-greet kitaplığını (Bazel'in yerleşik cc_library
kuralını kullanarak), ardından hello-world ikili programını derler. hello-world hedefindeki deps özelliği, Bazel'e hello-world ikili programının derlenmesi için hello-greet kitaplığının gerekli olduğunu bildirir.
Projenin bu yeni sürümünü oluşturmadan önce dizinleri değiştirmeniz ve cpp-tutorial/stage2 dizinine geçmeniz gerekir. Bunu yapmak için şu komutu çalıştırın:
cd ../stage2Artık aşağıdaki tanıdık komutu kullanarak yeni ikiliyi oluşturabilirsiniz:
bazel build //main:hello-worldBazel yine aşağıdaki gibi bir çıktı üretir:
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
Şimdi yeni derlediğiniz ikili programı test edebilirsiniz. Bu program başka bir "Hello
world" döndürür:
bazel-bin/main/hello-worldŞimdi hello-greet.cc dosyasını değiştirip projeyi yeniden derlerseniz Bazel yalnızca bu dosyayı yeniden derler.
Bağımlılık grafiğine baktığınızda hello-world öğesinin hello-greet adlı ek bir girişe bağlı olduğunu görebilirsiniz:

Özet: 2. aşama
Artık projeyi iki hedefle derlediniz. hello-world hedefi bir kaynak dosyası derler ve ek kaynak dosyası derleyen bir başka hedefe (//main:hello-greet) bağlıdır. Bir sonraki bölümde, bir adım daha ileri giderek başka bir paket ekleyin.
3. aşama: Birden fazla paket
Bu sonraki aşama, işleri biraz daha karmaşık hale getirir ve birden fazla paket içeren bir proje oluşturur. 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 BUILD dosyası içerdiğini görebilirsiniz. Bu nedenle, Bazel'e göre çalışma alanı artık lib ve main olmak üzere iki paket içeriyor.
lib/BUILD dosyasına göz atın:
cc_library(
name = "hello-time",
srcs = ["hello-time.cc"],
hdrs = ["hello-time.h"],
visibility = ["//main:__pkg__"],
)
Ayrıca 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 (dolayısıyla //lib:hello-time hedef etiketine) bağlıdır. 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 içindeki //lib:hello-time hedefini main/BUILD içindeki hedeflere açıkça görünür hale getirirsiniz.
Bunun nedeni, varsayılan olarak hedeflerin yalnızca aynı BUILD dosyasındaki diğer hedeflere görünür olmasıdır. 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ü oluşturun. 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 çıktı üretir:
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
Şimdi bu eğitici içeriğin son ikili programını test ederek son Hello world mesajı alın:
bazel-bin/main/hello-worldÖzet: 3. aşama
Artık projeyi üç hedef içeren iki paket olarak derlediniz ve aralarındaki bağımlılıkları anlıyorsunuz. Bu sayede gelecekteki projeleri Bazel ile derleyebilirsiniz. Bir sonraki bölümde, Bazel yolculuğunuza nasıl devam edeceğinizi öğrenebilirsiniz.
Sonraki adımlar
Bazel ile ilk temel derlemenizi tamamladınız. Ancak bu sadece başlangıç. Bazel ile öğrenmeye devam etmek için aşağıdaki kaynaklardan yararlanabilirsiniz:
- C++'a 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ı eğitimlerine göz atın.
- Yerel ve uzak depolarla çalışma hakkında daha fazla bilgi edinmek için harici bağımlılıklar başlıklı makaleyi inceleyin.
- Bazel'in diğer kuralları hakkında daha fazla bilgi edinmek için bu referans kılavuzuna bakın.
İyi derlemeler!