Pengantar
Baru menggunakan Bazel? Anda sudah berada di tempat yang tepat. Ikuti tutorial Build Pertama ini untuk pengantar penggunaan Bazel yang disederhanakan. Tutorial ini menentukan istilah-istilah utama seperti yang digunakan dalam konteks Bazel dan memandu Anda melalui dasar-dasar alur kerja Bazel. Dimulai dengan alat yang Anda butuhkan, Anda akan membangun dan menjalankan tiga project dengan kompleksitas yang meningkat dan mempelajari cara serta alasan project tersebut menjadi lebih kompleks.
Meskipun Bazel adalah sistem build yang mendukung build multi-bahasa, tutorial ini menggunakan project C++ sebagai contoh dan memberikan panduan serta alur umum yang berlaku untuk sebagian besar bahasa.
Perkiraan waktu penyelesaian: 30 menit.
Prasyarat
Mulailah dengan menginstal Bazel, jika Anda belum melakukannya. Tutorial ini menggunakan Git untuk kontrol sumber, jadi untuk hasil terbaik instal Git juga.
Selanjutnya, ambil project contoh dari repositori GitHub Bazel dengan menjalankan perintah berikut di alat command line pilihan Anda:
git clone https://github.com/bazelbuild/examplesProject contoh untuk tutorial ini ada di direktori examples/cpp-tutorial.
Lihat di bawah struktur project tersebut:
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
Ada tiga kumpulan file, dengan setiap kumpulan mewakili tahap dalam tutorial ini. Pada tahap pertama, Anda akan membuat satu target yang berada dalam satu paket. Pada tahap kedua, Anda akan membuat biner dan library dari satu paket. Pada tahap ketiga dan terakhir, Anda akan membuat project dengan beberapa paket dan membangunnya dengan beberapa target.
Ringkasan: Pengantar
Dengan menginstal Bazel (dan Git) serta meng-clone repositori untuk tutorial ini, Anda telah meletakkan dasar untuk build pertama Anda dengan Bazel. Lanjutkan ke bagian berikutnya untuk menentukan beberapa istilah dan menyiapkan ruang kerja Anda.
Memulai
Menyiapkan ruang kerja
Sebelum dapat membuat project, Anda harus menyiapkan ruang kerjanya. Ruang kerja adalah direktori yang menyimpan file sumber project dan output build Bazel. Ruang kerja juga berisi file penting berikut:
, yang mengidentifikasi direktori dan kontennya sebagai ruang kerja Bazel dan berada di root struktur direktori project.WORKSPACEfile- Satu atau beberapa
, yang memberi tahu Bazel cara membuat berbagai bagian project. Direktori dalam ruang kerja yang berisi fileBUILDfilesBUILDadalah paket. (Informasi selengkapnya tentang paket akan dibahas nanti dalam tutorial ini.)
Dalam project mendatang, untuk menetapkan direktori sebagai ruang kerja Bazel, buat file kosong bernama WORKSPACE di direktori tersebut. Untuk tujuan tutorial ini, file WORKSPACE sudah ada di setiap tahap.
NOTE: Saat Bazel membuat project, semua input harus berada di ruang kerja yang sama. File yang berada di ruang kerja yang berbeda tidak bergantung satu sama lain kecuali jika ditautkan. Informasi lebih mendetail tentang aturan ruang kerja dapat ditemukan dalam panduan ini.
Memahami file BUILD
File BUILD berisi beberapa jenis petunjuk yang berbeda untuk Bazel. Setiap
BUILD file memerlukan setidaknya satu aturan
sebagai kumpulan petunjuk, yang memberi tahu Bazel cara membuat output yang diinginkan,
seperti biner atau library yang dapat dieksekusi. Setiap instance aturan build dalam file
BUILD disebut target
dan mengarah ke kumpulan file sumber dan dependensi tertentu.
Target juga dapat mengarah ke target lain.
Lihat file BUILD di direktori cpp-tutorial/stage1/main:
cc_binary(
name = "hello-world",
srcs = ["hello-world.cc"],
)
Dalam contoh kita, target hello-world membuat instance cc_binary rule bawaan Bazel.
Aturan ini memberi tahu Bazel untuk membuat biner yang dapat dieksekusi mandiri dari file sumber hello-world.cc tanpa dependensi.
Ringkasan: memulai
Sekarang Anda sudah memahami beberapa istilah utama, dan artinya dalam konteks project ini dan Bazel secara umum. Di bagian berikutnya, Anda akan membuat dan menguji Tahap 1 project.
Tahap 1: satu target, satu paket
Saatnya membuat bagian pertama project. Untuk referensi visual, struktur bagian Tahap 1 project adalah:
examples
└── cpp-tutorial
└──stage1
├── main
│ ├── BUILD
│ └── hello-world.cc
└── WORKSPACE
Jalankan perintah berikut untuk berpindah ke direktori cpp-tutorial/stage1:
cd cpp-tutorial/stage1Kemudian jalankan:
bazel build //main:hello-worldDalam label target, bagian //main: adalah lokasi file BUILD relatif terhadap root ruang kerja, dan hello-world adalah nama target dalam file BUILD.
Bazel menghasilkan sesuatu yang terlihat seperti ini:
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
Anda baru saja membuat target Bazel pertama Anda. Bazel menempatkan output build di direktori bazel-bin di root ruang kerja.
Sekarang uji biner yang baru Anda buat, yaitu:
bazel-bin/main/hello-worldTindakan ini akan menghasilkan pesan “Hello world” yang dicetak.
Berikut adalah grafik dependensi Tahap 1:

Ringkasan: tahap 1
Setelah menyelesaikan build pertama, Anda akan memiliki gambaran dasar tentang struktur build. Pada tahap berikutnya, Anda akan menambahkan kompleksitas dengan menambahkan target lain.
Tahap 2: beberapa target build
Meskipun satu target sudah cukup untuk project kecil, Anda mungkin ingin membagi project yang lebih besar menjadi beberapa target dan paket. Hal ini memungkinkan build inkremental yang cepat – yaitu, Bazel hanya membangun kembali apa yang telah diubah – dan mempercepat build Anda dengan membangun beberapa bagian project sekaligus. Tahap tutorial ini menambahkan target, dan tahap berikutnya menambahkan paket.
Ini adalah direktori yang Anda gunakan untuk Tahap 2:
├──stage2
│ ├── main
│ │ ├── BUILD
│ │ ├── hello-world.cc
│ │ ├── hello-greet.cc
│ │ └── hello-greet.h
│ └── WORKSPACE
Lihat di bawah file BUILD di direktori cpp-tutorial/stage2/main:
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",
],
)
Dengan file BUILD ini, Bazel pertama-tama membuat library hello-greet (menggunakan cc_library rule bawaan Bazel), lalu biner hello-world. Atribut deps dalam target hello-world memberi tahu Bazel bahwa library hello-greet diperlukan untuk membuat biner hello-world.
Sebelum dapat membuat project versi baru ini, Anda harus mengubah direktori, beralih ke direktori cpp-tutorial/stage2 dengan menjalankan:
cd ../stage2Sekarang Anda dapat membuat biner baru menggunakan perintah yang sudah dikenal berikut:
bazel build //main:hello-worldSekali lagi, Bazel menghasilkan sesuatu yang terlihat seperti ini:
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
Sekarang Anda dapat menguji biner yang baru Anda buat, yang menampilkan “Hello world” lain:
bazel-bin/main/hello-worldJika sekarang Anda mengubah hello-greet.cc dan membangun kembali project, Bazel hanya akan mengompilasi ulang file tersebut.
Dengan melihat grafik dependensi, Anda dapat melihat bahwa hello-world bergantung pada input tambahan bernama hello-greet:

Ringkasan: tahap 2
Anda kini telah membuat project dengan dua target. Target hello-world membuat satu file sumber dan bergantung pada satu target lain (//main:hello-greet), yang membuat dua file sumber tambahan. Di bagian berikutnya, lanjutkan dan tambahkan paket lain.
Tahap 3: beberapa paket
Tahap berikutnya ini menambahkan lapisan komplikasi lain dan membuat project dengan beberapa paket. Lihat di bawah struktur dan konten direktori cpp-tutorial/stage3:
└──stage3
├── main
│ ├── BUILD
│ ├── hello-world.cc
│ ├── hello-greet.cc
│ └── hello-greet.h
├── lib
│ ├── BUILD
│ ├── hello-time.cc
│ └── hello-time.h
└── WORKSPACE
Anda dapat melihat bahwa sekarang ada dua sub-direktori, dan masing-masing berisi file BUILD. Oleh karena itu, bagi Bazel, ruang kerja sekarang berisi dua paket: lib dan main.
Lihat file lib/BUILD:
cc_library(
name = "hello-time",
srcs = ["hello-time.cc"],
hdrs = ["hello-time.h"],
visibility = ["//main:__pkg__"],
)
Dan file main/BUILD:
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",
],
)
Target hello-world dalam paket utama bergantung pada targethello-time
dalam paket lib (oleh karena itu, label target //lib:hello-time) - Bazel mengetahui
hal ini melalui atribut deps. Anda dapat melihatnya tercermin dalam grafik dependensi:

Agar build berhasil, Anda harus membuat target //lib:hello-time di lib/BUILD terlihat secara eksplisit oleh target di main/BUILD menggunakan atribut visibilitas.
Hal ini karena secara default, target hanya terlihat oleh target lain dalam file BUILD yang sama. Bazel menggunakan visibilitas target untuk mencegah masalah seperti library yang berisi detail implementasi yang bocor ke API publik.
Sekarang buat project versi terakhir ini. Beralih ke direktori cpp-tutorial/stage3 dengan menjalankan:
cd ../stage3Sekali lagi, jalankan perintah berikut:
bazel build //main:hello-worldBazel menghasilkan sesuatu yang terlihat seperti ini:
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
Sekarang uji biner terakhir dari tutorial ini untuk pesan Hello world terakhir:
bazel-bin/main/hello-worldRingkasan: tahap 3
Anda kini telah membuat project sebagai dua paket dengan tiga target dan memahami dependensi di antara keduanya, yang membekali Anda untuk melanjutkan dan membuat project mendatang dengan Bazel. Di bagian berikutnya, lihat cara melanjutkan perjalanan Bazel Anda.
Langkah berikutnya
Anda kini telah menyelesaikan build dasar pertama Anda dengan Bazel, tetapi ini baru permulaan. Berikut beberapa referensi lainnya untuk terus belajar dengan Bazel:
- Untuk terus berfokus pada C++, baca tentang kasus penggunaan build C++ umum .
- Untuk mulai membuat aplikasi lain dengan Bazel, lihat tutorial untuk Java, aplikasi Android, atau aplikasi iOS).
- Untuk mempelajari lebih lanjut cara menggunakan repositori lokal dan jarak jauh, baca tentang dependensi eksternal.
- Untuk mempelajari lebih lanjut aturan Bazel lainnya, lihat panduan referensi ini.
Selamat membangun!