Giriş
Bazel'i kullanmaya yeni mi başladınız? Doğru yerdesiniz. Bazel'i kullanmaya yönelik 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 temelleri 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 dakika.
Ö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/examples
Bu eğitimdeki örnek proje examples/cpp-tutorial
dizinindedir.
Yapılandırma şeklini aşağıda görebilirsiniz:
examples
└── cpp-tutorial
├──stage1
│ ├── main
│ │ ├── BUILD
│ │ └── hello-world.cc
│ └── WORKSPACE
├──stage2
│ ├── main
│ │ ├── BUILD
│ │ ├── hello-world.cc
│ │ ├── hello-greet.cc
│ │ └── hello-greet.h
│ └── WORKSPACE
└──stage3
├── main
│ ├── BUILD
│ ├── hello-world.cc
│ ├── hello-greet.cc
│ └── hello-greet.h
├── lib
│ ├── BUILD
│ ├── hello-time.cc
│ └── hello-time.h
└── WORKSPACE
Üç 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şturursunuz. İ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ış olursunuz. Bazı terimleri tanımlamak ve çalışma alanınızı ayarlamak için sonraki bölüme geçin.
Başlarken
Çalışma alanını ayarlama
Proje oluşturabilmek için önce ç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 ş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
.WORKSPACE
file - Bazel'e projenin farklı bölümlerinin nasıl oluşturulacağını söyleyen bir veya daha fazla
. Çalışma alanındaBUILD
filesBUILD
dosyası içeren bir dizin paket olarak kabul edilir. (Paketler hakkında daha fazla bilgiyi bu eğitimin ilerleyen bölümlerinde bulabilirsiniz.)
Gelecekteki projelerde bir dizini Bazel çalışma alanı olarak belirlemek için bu dizinde WORKSPACE
adlı boş bir dosya oluşturun. Bu eğitimde, her aşamada WORKSPACE
dosyası zaten mevcuttur.
NOT: Bazel projeyi oluşturduğunda tüm girişler aynı çalışma alanında olmalıdır. Farklı çalışma alanlarında bulunan dosyalar, bağlantı oluşturulmadığı sürece birbirinden bağımsızdır. Çalışma alanı kuralları hakkında daha ayrıntılı bilgiyi bu kılavuzda bulabilirsiniz.
BUILD dosyasını anlama
Bir BUILD
dosyası, Bazel için çeşitli talimat türleri içerir. Her BUILD
dosyası, Bazel'e yürütülebilir ikili dosyalar veya kitaplıklar gibi istenen çıktıların nasıl oluşturulacağını söyleyen bir dizi talimat olarak en az bir kural gerektirir. BUILD
dosyasındaki her derleme kuralı örneğine hedef adı verilir ve belirli bir kaynak dosyalar ile bağımlılıklar kümesini işaret eder.
Bir hedef, diğer hedeflere 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 rule
işlevini başlatır.
Bu kural, Bazel'e hello-world.cc
kaynak dosyasından bağımlılık içermeyen, bağımsız bir yürütülebilir ikili dosya oluşturmasını söyler.
Özet: Başlarken
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
└── WORKSPACE
cpp-tutorial/stage1
dizinine gitmek için aşağıdaki komutu çalıştırın:
cd cpp-tutorial/stage1
Ardından şu komutu çalıştırın:
bazel build //main:hello-world
Hedef etiketteki //main:
bölümü, BUILD
dosyasının çalışma alanının köküne göre konumunu, hello-world
ise BUILD
dosyasındaki hedef adını ifade eder.
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 oluşturdunuz. Bazel, derleme çıkışlarını çalışma alanının kökündeki bazel-bin
dizinine yerleştirir.
Şimdi yeni oluşturduğunuz ikili programı test edin. Bu program:
bazel-bin/main/hello-world
Bu işlem, "Hello world
" mesajının yazdırılmasıyla sonuçlanır.
1. aşamanın bağımlılık grafiğini aşağıda görebilirsiniz:
Ö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 sayede hızlı artımlı derlemeler yapılabilir. Yani Bazel yalnızca değişen kısımları 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
│ └── WORKSPACE
cpp-tutorial/stage2/main
dizinindeki BUILD
dosyasına aşağıdan 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 rule
'sini kullanarak), ardından hello-world
ikili dosyasını oluşturur. hello-world
hedefindeki deps
özelliği, Bazel'e hello-world
ikilisinin oluşturulması 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çmek için şu komutu çalıştırmanız gerekir:
cd ../stage2
Artık aşağıdaki tanıdık komutu kullanarak yeni ikiliyi oluşturabilirsiniz:
bazel build //main:hello-world
Bazel, 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 oluşturduğunuz ikili dosyayı test edebilirsiniz. Bu işlem, 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 oluşturursanız 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 oluşturdunuz. hello-world
hedefi bir kaynak dosyası 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 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ı ve içeriği için aşağıya göz atın:
└──stage3
├── main
│ ├── BUILD
│ ├── hello-world.cc
│ ├── hello-greet.cc
│ └── hello-greet.h
├── lib
│ ├── BUILD
│ ├── hello-time.cc
│ └── hello-time.h
└── WORKSPACE
Artık iki alt dizin olduğunu ve her birinin bir BUILD
dosyası içerdiğini görebilirsiniz. Bu nedenle, Bazel'e göre çalışma alanı artık iki paket içerir: 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__"],
)
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 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:hello-time
hedefinin lib/BUILD
içinde main/BUILD
hedeflerine açıkça görünür olmasını sağlarsınız.
Bunun nedeni, varsayılan olarak hedeflerin yalnızca aynı BUILD
dosyasındaki diğer hedefler tarafından görülebilmesidir. Bazel, hedef görünürlüğünü kullanarak kitaplıkların herkese açık API'lere sızan uygulama ayrıntılarını içermesi gibi sorunları önler.
Şimdi projenin bu son sürümünü oluşturun. Aşağıdaki komutu çalıştırarak cpp-tutorial/stage3
dizinine geçin:
cd ../stage3
Aşağıdaki komutu tekrar çalıştırın:
bazel build //main:hello-world
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: 0.167s, Critical Path: 0.00s
Şimdi bu eğitici içeriğin son ikilisini test ederek son Hello world
mesajı alın:
bazel-bin/main/hello-world
Özet: 3. aşama
Artık projeyi üç hedefli iki paket olarak oluşturup aralarındaki bağımlılıkları anladınız. Bu sayede gelecekteki projeleri Bazel ile oluşturmaya hazırsınız. 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ı ile ilgili eğitimlere 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 inşa etmeler!