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

. Sorun bildirin 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 temelleri Bazel bağlamında kullanılacak ve Bazel ile ilgili temel 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ğitim, kaynak kontrolü için Git'i kullandığından en iyi sonuçları elde etmek için Git'i farklı bir şekilde olur.

Sonra, aşağıdaki komutu çalıştırarak Bazel'in GitHub deposundan örnek projeyi alın komut satırı aracınızda aşağıdaki adımları uygulayın:

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

Bu eğitim için örnek proje examples/cpp-tutorial dizinindedir.

Nasıl yapılandırıldığına aşağıda göz atabilirsiniz:

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

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. İçinde üçüncü ve son aşamada ise birden fazla paket ve teslimatlar içeren bir proje yapıyı birden çok hedefle oluşturabilirsiniz.

Ö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ünü inceleyin ve çalışma alanınızı ayarlayın.

Başlarken

Çalışma alanını ayarlama

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

  • Dizini ve içeriğini Bazel çalışma alanı olarak tanımlayan WORKSPACE file projenin dizin yapısının kökünde bulunur.
  • Bazel'e projenin farklı bölümlerini nasıl oluşturacağını bildiren bir veya daha fazla BUILD files . CEVAP çalışma alanında yer alan BUILD dosyası içeren dizin 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 WORKSPACE adlı boş bir dosya olması gerekir. Bu eğiticide her aşamada zaten WORKSPACE dosyası var.

NOT: Bazel projeyi oluşturduğunda tüm girişler aynı çalışma alanında olması gerekir. Farklı çalışma alanlarında bulunan dosyalar birbirine bağlamaz. Çalışma alanı kuralları hakkında daha ayrıntılı bilgi için bu kılavuzda bulabilirsiniz.

BUILD dosyasını anlama

BUILD dosyası, Bazel için farklı türde talimatları içerir. Her biri BUILD dosyası en az bir kural gerektiriyor Bazel'a istenen çıktıları nasıl oluşturacağını anlatan bir dizi talimat olarak yürütülebilir ikili programlar veya kitaplıklar gibi. Derleme kuralının BUILD dosyası hedef olarak adlandırılır ve belirli bir kaynak dosya ve bağımlılık grubunu işaret eder. Bir hedef, başka 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 rule. Kural, Bazel'a Bağımlılığı olmayan hello-world.cc kaynak dosya.

Ö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
       └── WORKSPACE

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ı kök dizinindeki bazel-bin dizini çalışmayacaktır.

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

bazel-bin/main/hello-world

Bu işlem, basılı bir "Hello world" iletisiyle sonuçlanır.

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

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

Özet: 1. aşama

İlk derlemenizi tamamladığınıza göre, artık binanın nasıl yapılandırılmıştır. Bir sonraki aşamada, yeni bir boyut ekleyerek hedefi belirleyebilirsiniz.

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 projenin birden çok parçasını aynı anda inşa ederek çalışır. 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
    │  └── WORKSPACE

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 rule özelliğini kullanarak), ve hello-world ikili değeri. Şuradaki deps özelliği: hello-world hedefi Bazel'e hello-greet kitaplığı, hello-world ikili programını derlemek için gereklidir.

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 Bazel yalnızca yeniden derler yapabilirsiniz.

Bağımlılık grafiğine baktığınızda, hello-world değerinin ekstra bir girdiye bağlı olduğunu görebilirsiniz hello-greet adlı:

"hello-world"ün 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

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. Aşağıdaki yapı ve içeriklere 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
   └── WORKSPACE

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 "lib" paketindeki hedefe nasıl bağlı olduğunu gösterir.

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 başlatabilirsiniz. Bazel ile öğrenmeye devam etmek için aşağıdaki diğer kaynakları kullanabilirsiniz:

Mutlu binalar!