Bazel Eğitimi: C++ Projesi Oluşturma

Sorun bildir Kaynağı görüntüle Nightly · 8.4 · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

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ğiticide, 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ıldığından 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ı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 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çeriklerini Bazel çalışma alanı olarak tanımlayan ve projenin dizin yapısının kökünde bulunan MODULE.bazel dosyası. Ayrıca, harici bağımlılıklarınızı da burada belirtirsiniz.
  • Projenin farklı bölümlerinin nasıl oluşturulacağını Bazel'e bildiren bir veya daha fazla BUILDdosya. Çalışma alanında BUILD dosyası içeren bir dizin, paket olarak adlandırılır. (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 MODULE.bazel adlı boş bir dosya oluşturun. Bu eğitimin amaçları doğrultusunda, her aşamada MODULE.bazel dosyası zaten mevcuttur.

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 istediğiniz çıktıları nasıl oluşturacağını söyleyen bir talimat grubu 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 kuralını oluşturur. Kural, Bazel'e bağımlılık içermeyen hello-world.cc kaynak dosyasından 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 olarak, 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/stage1

Ardından şu komutu çalıştırın:

bazel build //main:hello-world

Hedef etikette, //main: bölümü BUILD dosyasının çalışma alanının köküne göre konumu, hello-world ise BUILD dosyasındaki hedef addı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 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 ikiliyi test edin. İkili şudur:

bazel-bin/main/hello-world

Bu durumda, "Hello world" mesajı yazdırılır.

1. aşamanın bağımlılık grafiği aşağıda verilmiştir:

hello-world için bağımlılık grafiğinde tek bir kaynak dosyası olan tek bir hedef gösteriliyor.

Ö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 dosyasını oluşturur. hello-world hedefindeki deps özelliği, Bazel'e hello-world ikilisini oluşturmak 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 ../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 sonuç ü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

Artık yeni oluşturduğunuz ikili dosyayı test edebilirsiniz. Bu dosya 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:

`hello-world` için bağımlılık grafiği, dosyada değişiklik yapıldıktan sonra bağımlılık değişikliklerini gösterir.

Ö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ı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 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:

`hello-world` için bağımlılık grafiği, ana paketteki hedefin `lib` paketindeki hedefe nasıl bağlı olduğunu gösterir.

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ıza göre gelecekteki projeleri Bazel ile oluşturmaya başlayabilirsiniz. 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:

İyi inşa etmeler!