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

Sorun bildir Kaynağı göster Gece · 7,3 · 7,2 · 7,1 · 7,0 · 6,5

Giriş

Bazel'i kullanmaya yeni mi başladınız? Doğru yerdesiniz. Şu İlk Derleme eğiticisini takip edin: Bazel kullanımı basitleştirilmiştir. Bu eğitimde, anahtar terimlerin kullanımı ve Bazel bağlamında size Bazel yönetiminin temellerini iş akışını takip edin. İhtiyacınız olan araçlarla başlayarak, üç temel araç oluşturup giderek daha karmaşık hale gelen projelere göz atacak ve işlerin nasıl ve neden daha karmaşık hale geldiğini öğreneceksiniz.

Bazel ise bir derleme sistemi Çok dilli derlemeleri desteklediğinden bu eğiticide örnek olarak bir C++ projesi kullanılmıştır ve çoğu dilde geçerli olan genel yönergeleri ve adımları içerir.

Tahmini tamamlanma süresi: 30 dakika.

Ön koşullar

Henüz yüklemediyseniz Bazel'i yükleyerek başlayın zaten. Bu eğiticide kaynak kontrolü için Git kullanıldığından en iyi sonuçları elde etmek için Git'i de tıklayabilirsiniz.

Sonra, aşağıdaki komutu çalıştırarak Bazel'in GitHub deposundan örnek projeyi alın: komut satırı aracınızla aşağıdaki işlemleri yapabilirsiniz:

git clone https://github.com/bazelbuild/examples

Bu eğitimin örnek projesi examples/cpp-tutorial içindedir dizin.

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

Bu eğiticide, her biri bir aşamayı temsil eden üç dosya grubu vardır. İlk aşamada, tek bir paket içinde yer alan tek bir hedef oluşturacaksınız. İkinci aşamada ise tek bir paketten hem ikili program hem de kitaplık derleme. Üçüncü ve son aşamasında birden fazla paket içeren bir proje geliştirecek ve birden çok hedefe sahip olabilir.

Özet: Giriş

Bu eğitim için Bazel (ve Git) hizmetini yükleyip depoyu klonlayarak ilk binanızın temelini attınız. Sonrakine geç bölümünde bazı terimler tanımlamak ve Workspace'i seçin.

Başlarken

Bir proje oluşturmadan önce projenin çalışma alanını oluşturmanız gerekir. Çalışma alanı projenizin kaynak dosyalarını ve Bazel'in derleme çıkışlarını barındıran bir dizindir. Ayrıca, aşağıdaki önemli dosyaları da içerir:

  • Dizini ve içeriğiniMODULE.bazel bir Bazel çalışma alanıdır ve proje dizininin kökünde bulunur inceleyeceğiz. Aynı zamanda dış bağımlılıklarınızı da belirtirsiniz.
  • Bir veya daha fazla BUILD dosyalar oluşturup Bazel'a nasıl yapılacağını göstereceğim. Şu dizinin içindeki bir dizin: BUILD dosyası içeren çalışma alanı package. (Paketler hakkında daha fazla bilgi) daha fazla bilgi edinebilirsiniz.)

Gelecekteki projelerde bir dizini Bazel çalışma alanı olarak belirlemek için bu dizinde MODULE.bazel adlı boş bir dosya olması gerekir. Bu Sözleşme'nin amaçları doğrultusunda, eğiticide, her aşamada zaten bir MODULE.bazel dosyası mevcuttur.

BUILD dosyasını anlama

BUILD dosyası, Bazel için farklı türde talimatları içerir. Her biri BUILD dosya için en az bir tane gerekli rule'yi bir dizi talimat olarak izlerseniz Bu komut, Bazel'a yürütülebilir ikili programlar gibi istediğiniz çıktıları nasıl oluşturacağını söyler veya kitaplıklarda da olabilir. BUILD dosyasındaki bir derleme kuralının her bir örneğine belirli bir yeri hedefler ve bir dizi kaynak dosya ve bağımlılıkları belirler. Bir hedef, diğer hedeflere işaret ediyor.

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. Kural Bazel'a hello-world.cc> kaynak dosyadan oluşur.

Özet: başlarken

Artık bazı anahtar terimleri ve bu terimlerin bu terimlerin genel olarak Bazel’ı düşünmekte fayda var. Bir sonraki bölümde, bir projeyi başarılı bir şekilde Projenin 1. aşaması.

1. Aşama: tek hedef, tek paket

Projenin ilk bölümünü inşa etme zamanı geldi. Görsel referans olması açısından, 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 taşımak 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 konumudur çalışma alanının köküne göre belirlenmiştir ve hello-world, BUILD dosyası.

Bazel aşağıdakine benzer bir sonuç ü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 çıktılarını Çalışma alanının kök dizininde bulunan bazel-bin dizini.

Şimdi, yeni derlenen ikili programınızı test edin:

bazel-bin/main/hello-world

Bu, basılı bir "Hello world" ile sonuçlanır mesajını alırsınız.

1. Aşamanın bağımlılık grafiği şöyle olabilir:

hello-world için bağımlılık grafiği, tek bir kaynakla tek bir hedef gösteriyor
dosyası olarak kaydedebilirsiniz.

Özet: 1. aşama

İlk derlemenizi tamamladığınıza göre artık bir projeyi nasıl nasıl yapılandırıldığını anlamasına yardım eder. Bir sonraki aşamada, çalışma alanına anlamına gelir.

2. Aşama: Birden fazla derleme hedefi

Küçük projeler için tek bir hedef yeterli olsa da her projeyi birden çok hedef ve pakete dönüştürmenize yardımcı olur. Bu sayede ekip üyeleri artımlı derlemeler sunar (yani Bazel yalnızca değişiklikleri yeniden oluşturur) ve yapılarınıza hızlıca dahil edebilirsiniz. Sürecin bu aşaması eğitici bir hedef ekler, sonraki adımda da bir paket eklenir.

2. Aşama için çalıştığınız dizin şu şekildedir:

    ├──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ı oluşturur ( Bazel'in yerleşik cc_library kural), ardından hello-world ikili. hello-world hedefindeki deps özelliği şunları belirtir: hello-world derlemesi için hello-greet kitaplığının gerekli olduğunu söyleyen Bazel ikilik.

Projenin bu yeni sürümünü oluşturabilmek için aşağıdaki komutu çalıştırarak cpp-tutorial/stage2 dizinine geçebilirsiniz:

cd ../stage2

Artık aşağıdaki bilinen komutu kullanarak yeni ikili programı derleyebilirsiniz:

bazel build //main:hello-world

Bir kez daha Bazel aşağıdaki gibi bir şey ü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 başka bir "Hello world" döndüren yeni derlenmiş ikili programınızı test edebilirsiniz:

bazel-bin/main/hello-world

Şimdi hello-greet.cc öğesini değiştirip projeyi yeniden derlerseniz yalnızca Bazel bu dosyayı yeniden derler.

Bağımlılık grafiğine baktığınızda hello-world değerinin bir bağımlılığa bağlı olarak hello-greet adlı fazladan giriş:

"hello-world"ün bağımlılık grafiği,
dosya üzerinde değişiklik yapabilirsiniz.

Özet: 2. aşama

Projeyi iki hedefle oluşturmuş oldunuz. hello-world hedefi derlemeleri bir kaynak dosyadır ve başka bir hedefe (//main:hello-greet) bağlıdır. iki ek kaynak dosyası oluşturur. Bir sonraki bölümde, ve başka bir paket ekleyin.

3. Aşama: Birden fazla paket

Bir sonraki aşama bir komplikasyon katmanı daha ekler ve birden çok pakete sahip olabilir. Belgenin yapısına ve içeriğine göz atın. cpp-tutorial/stage3 dizini:

└──stage3
   ├── main
   │   ├── BUILD
   │   ├── hello-world.cc
   │   ├── hello-greet.cc
   │   └── hello-greet.h
   ├── lib
   │   ├── BUILD
   │   ├── hello-time.cc
   │   └── hello-time.h
   └── MODULE.bazel

Gördüğünüz üzere iki alt dizin vardır ve her biri bir BUILD içerir. dosyası olarak kaydedebilirsiniz. Dolayısıyla, 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, hello-time hedefine bağlıdır (dolayısıyla hedef etiket //lib:hello-time) içine lib bunu deps özelliği aracılığıyla gönderebilirsiniz. Bu, bağımlı bir soruna grafik:

"hello-world"ün bağımlılık grafiği, ana paketteki hedefin nasıl olduğunu gösterir
"lib"deki hedefe bağlıdır
paketinden yararlanın.

Derlemenin başarılı olması için lib/BUILD ürününde //lib:hello-time hedefini yaparsınız. görünürlük özelliğini kullanan main/BUILD içindeki hedeflere açıkça görüntülenebilir. Bunun nedeni, hedeflerin varsayılan olarak yalnızca aynı BUILD dosyası yükleyin. Bazel, kitaplık gibi sorunları önlemek için hedef görünürlük kullanıyor herkese açık API'lere sızdırılan uygulama ayrıntılarını içerir.

Şimdi projenin bu son sürümünü derleyin. cpp-tutorial/stage3 cihazına geç dizini şu şekilde çalıştırın:

cd  ../stage3

Bir kez daha aşağıdaki komutu çalıştırın:

bazel build //main:hello-world

Bazel aşağıdakine benzer bir sonuç ü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ğiticinin son ikili programındaki son Hello world mesajını test edin:

bazel-bin/main/hello-world

Özet: 3. aşama

Projeyi üç hedefi olan iki paket halinde oluşturdunuz ve ve bunlar arasındaki bağımlılıkları fark etmenizi sağlar. Bu da gelecek projelerde başka projeleri de var. Sonraki bölümde, Bazel yolculuğu.

Sonraki adımlar

Bazel ile ilk temel derlemenizi tamamladınız, ancak bu yalnızca başlatabilirsiniz. Bazel ile öğrenmeye devam etmek için aşağıdaki diğer kaynakları kullanabilirsiniz:

Mutlu binalar!