Pengantar
Baru mengenal Bazel? Anda berada di tempat yang tepat. Ikuti tutorial Build Pertama ini untuk pengenalan penggunaan Bazel yang disederhanakan. Tutorial ini menjelaskan istilah-istilah utama saat digunakan dalam konteks Bazel dan memandu Anda memahami dasar-dasar alur kerja Bazel. Dimulai dengan alat yang diperlukan, Anda akan membangun dan menjalankan tiga project dengan kompleksitas yang semakin meningkat serta mempelajari bagaimana dan mengapa project tersebut menjadi lebih kompleks.
Meskipun Bazel adalah sistem build yang mendukung build multibahasa, 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 instal Git juga untuk mendapatkan hasil terbaik.
Selanjutnya, ambil project contoh dari repositori GitHub Bazel dengan menjalankan baris berikut di alat command line pilihan Anda:
git clone https://github.com/bazelbuild/examples
Project contoh untuk tutorial ini ada di direktori examples/cpp-tutorial
.
Lihat di bawah ini bagaimana strukturnya:
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 set file, setiap set mewakili satu tahap dalam tutorial ini. Pada tahap pertama, Anda akan membuat satu target yang berada dalam satu paket. Pada tahap kedua, Anda akan mem-build biner dan library dari satu paket. Pada tahap ketiga dan terakhir, Anda akan membuat project dengan beberapa paket dan mem-build-nya dengan beberapa target.
Ringkasan: Pengantar
Dengan menginstal Bazel (dan Git) serta meng-clone repositori untuk tutorial ini, Anda telah menyiapkan fondasi 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 perlu menyiapkan ruang kerjanya. Ruang kerja adalah direktori yang menyimpan file sumber project dan output build Bazel. Direktori tersebut juga berisi file-file signifikan berikut:
, yang mengidentifikasi direktori dan kontennya sebagai ruang kerja Bazel dan berada di root struktur direktori project.WORKSPACE
file- Satu atau beberapa
, yang memberi tahu Bazel cara membuat berbagai bagian project. Direktori dalam ruang kerja yang berisi fileBUILD
filesBUILD
adalah paket. (Informasi lebih lanjut 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.
CATATAN: Saat Bazel membuat project, semua input harus berada di ruang kerja yang sama. File yang berada di ruang kerja yang berbeda tidak saling bergantung, kecuali jika ditautkan. Informasi lebih mendetail tentang aturan ruang kerja dapat ditemukan di panduan ini.
Memahami file BUILD
File BUILD
berisi beberapa jenis petunjuk yang berbeda untuk Bazel. Setiap
file BUILD
memerlukan setidaknya satu aturan
sebagai serangkaian petunjuk, yang memberi tahu Bazel cara mem-build output yang diinginkan,
seperti library atau biner 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 ini, target hello-world
membuat instance cc_binary rule
bawaan
Bazel.
Aturan ini memberi tahu Bazel untuk membuat biner mandiri yang dapat dieksekusi dari
file sumber hello-world.cc
tanpa dependensi.
Ringkasan: cara memulai
Anda kini sudah memahami beberapa istilah utama, serta artinya dalam konteks project ini dan Bazel secara umum. Di bagian berikutnya, Anda akan membangun dan menguji Tahap 1 project.
Tahap 1: target tunggal, paket tunggal
Saatnya membuat bagian pertama dari proyek ini. Untuk referensi visual, struktur bagian Tahap 1 project ini adalah:
examples
└── cpp-tutorial
└──stage1
├── main
│ ├── BUILD
│ └── hello-world.cc
└── WORKSPACE
Jalankan perintah berikut untuk berpindah ke direktori cpp-tutorial/stage1
:
cd cpp-tutorial/stage1
Kemudian jalankan:
bazel build //main:hello-world
Dalam label target, bagian //main:
adalah lokasi file BUILD
yang 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 Anda yang baru dibuat, yaitu:
bazel-bin/main/hello-world
Tindakan ini akan menghasilkan pesan “Hello world
” yang dicetak.
Berikut adalah grafik dependensi Tahap 1:
Ringkasan: tahap 1
Setelah menyelesaikan build pertama, Anda memiliki gambaran dasar tentang pembuatan 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, sebaiknya bagi project yang lebih besar menjadi beberapa target dan paket. Hal ini memungkinkan build inkremental yang cepat – yaitu, Bazel hanya mem-build ulang apa yang berubah – dan mempercepat build Anda dengan mem-build beberapa bagian project sekaligus. Tahap tutorial ini menambahkan target, dan tahap berikutnya menambahkan paket.
Ini adalah direktori yang Anda kerjakan untuk Tahap 2:
├──stage2
│ ├── main
│ │ ├── BUILD
│ │ ├── hello-world.cc
│ │ ├── hello-greet.cc
│ │ └── hello-greet.h
│ └── WORKSPACE
Lihat di bawah ini pada 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, pertama-tama Bazel akan mem-build 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 mem-build biner hello-world
.
Sebelum dapat mem-build project versi baru ini, Anda perlu mengubah direktori, dengan beralih ke direktori cpp-tutorial/stage2
dengan menjalankan:
cd ../stage2
Sekarang Anda dapat mem-build biner baru menggunakan perintah yang sudah dikenal berikut:
bazel build //main:hello-world
Sekali 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 dibuat, yang menampilkan “Hello world
” lain:
bazel-bin/main/hello-world
Jika Anda sekarang mengubah hello-greet.cc
dan mem-build ulang project, Bazel hanya akan mengompilasi ulang
file tersebut.
Dengan melihat grafik dependensi, Anda dapat melihat bahwa hello-world
bergantung pada input tambahan
yang bernama hello-greet
:
Ringkasan: tahap 2
Sekarang Anda telah membangun project dengan dua target. Target hello-world
membuat
satu file sumber dan bergantung pada satu target lainnya (//main:hello-greet
), yang
membuat dua file sumber tambahan. Pada bagian berikutnya, ambil satu langkah
lebih jauh dan tambahkan paket lain.
Tahap 3: beberapa paket
Tahap selanjutnya ini menambahkan lapisan detail lain dan membangun project dengan
beberapa paket. Lihat di bawah ini 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, untuk Bazel, ruang kerja kini 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 pada 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 target hello-time
dalam paket lib
(sehingga label target //lib:hello-time
) - Bazel mengetahui
hal ini melalui atribut deps
. Anda dapat melihat ini tercermin dalam grafik
dependensi:
Agar build berhasil, buat target //lib:hello-time
di lib/BUILD
secara eksplisit terlihat oleh target di main/BUILD
menggunakan atribut visibilitas.
Hal ini karena secara default target hanya dapat dilihat 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, bangun project versi final ini. Beralihlah ke direktori cpp-tutorial/stage3
dengan menjalankan:
cd ../stage3
Sekali lagi, jalankan perintah berikut:
bazel build //main:hello-world
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: 0.167s, Critical Path: 0.00s
Sekarang, uji biner terakhir tutorial ini untuk pesan Hello world
akhir:
bazel-bin/main/hello-world
Ringkasan: tahap 3
Sekarang Anda telah mem-build project sebagai dua paket dengan tiga target dan memahami dependensi di antara keduanya, yang memungkinkan Anda melanjutkan dan membangun project masa depan dengan Bazel. Di bagian berikutnya, lihat cara melanjutkan perjalanan Bazel.
Langkah berikutnya
Sekarang Anda telah menyelesaikan build dasar pertama Anda dengan Bazel, tetapi ini baru awalnya. Berikut beberapa referensi lainnya untuk terus belajar bersama Bazel:
- Agar tetap berfokus pada C++, baca kasus penggunaan build C++ yang umum.
- Untuk mulai mem-build aplikasi lain dengan Bazel, lihat tutorial untuk Java, aplikasi Android, atau aplikasi iOS).
- Untuk mempelajari lebih lanjut cara bekerja dengan repositori lokal dan jarak jauh, baca dependensi eksternal.
- Untuk mempelajari aturan Bazel lainnya lebih lanjut, lihat panduan referensi ini.
Selamat membangun!