Ringkasan Ekstensi

Tetap teratur dengan koleksi Simpan dan kategorikan konten berdasarkan preferensi Anda.
Laporkan masalah Lihat sumber

Halaman ini menjelaskan cara memperluas bahasa BUILD menggunakan makro dan aturan.

Ekstensi Bazel adalah file yang diakhiri dengan .bzl. Gunakan pernyataan pemuatan untuk mengimpor simbol dari ekstensi.

Sebelum mempelajari konsep yang lebih canggih, pertama-tama:

Makro dan aturan

Makro adalah fungsi yang membuat instance aturan. Hal ini berguna saat file BUILD menjadi terlalu berulang atau terlalu kompleks, karena memungkinkan Anda untuk menggunakan kembali beberapa kode. Fungsi ini akan dievaluasi segera setelah file BUILD dibaca. Setelah evaluasi file BUILD, Bazel memiliki sedikit informasi tentang makro: jika makro Anda menghasilkan genrule, Bazel akan berperilaku seolah-olah Anda menulis genrule tersebut. Akibatnya, bazel query hanya akan mencantumkan genrule yang dihasilkan.

Aturan lebih canggih daripada makro. Aplikasi dapat mengakses internal Bazel dan memiliki kontrol penuh atas apa yang sedang terjadi. Misalnya, metode ini mungkin meneruskan informasi ke aturan lain.

Jika Anda ingin menggunakan kembali logika sederhana, mulailah dengan makro. Jika makro menjadi kompleks, sering kali ide yang bagus untuk menjadikannya sebagai aturan. Dukungan untuk bahasa baru biasanya dilakukan dengan aturan. Aturan ditujukan untuk pengguna tingkat lanjut, dan sebagian besar pengguna tidak perlu menulisnya; mereka hanya akan memuat dan memanggil aturan yang sudah ada.

Model evaluasi

Build terdiri dari tiga fase.

  • Fase pemuatan. Pertama, muat dan evaluasi semua ekstensi dan semua file BUILD yang diperlukan untuk build. Eksekusi file BUILD hanya membuat instance aturan (setiap kali aturan dipanggil, aturan tersebut akan ditambahkan ke grafik). Di sinilah makro dievaluasi.

  • Tahap analisis. Kode aturan dieksekusi (fungsi implementation-nya) dan tindakan instance dibuat. Tindakan menjelaskan cara menghasilkan serangkaian output dari sekumpulan input, seperti "jalankan gcc di hello.c dan dapatkan hello.o". Anda harus secara eksplisit mencantumkan file yang akan dibuat sebelum menjalankan perintah sebenarnya. Dengan kata lain, fase analisis mengambil grafik yang dihasilkan oleh fase pemuatan dan menghasilkan grafik tindakan.

  • Tahap eksekusi. Tindakan akan dijalankan, jika setidaknya salah satu output-nya diperlukan. Jika file tidak ada atau jika perintah gagal menghasilkan satu output, build akan gagal. Pengujian juga dijalankan selama fase ini.

Bazel menggunakan paralelisme untuk membaca, mengurai, dan mengevaluasi file .bzl dan file BUILD. File dibaca maksimal satu kali per build dan hasil evaluasi di-cache dan digunakan kembali. File dievaluasi hanya setelah semua dependensinya (pernyataan load()) diselesaikan. Secara desain, memuat file .bzl tidak memiliki efek samping yang terlihat, tetapi hanya menentukan nilai dan fungsi.

Bazel mencoba menjadi pintar: analisis tersebut menggunakan analisis dependensi untuk mengetahui file mana yang harus dimuat, aturan mana yang harus dianalisis, dan tindakan mana yang harus dijalankan. Misalnya, jika aturan menghasilkan tindakan yang tidak diperlukan untuk build saat ini, aturan tersebut tidak akan dieksekusi.

Membuat ekstensi

Dua tautan di bawah ini akan sangat berguna saat menulis ekstensi Anda sendiri. Buat mereka dalam jangkauan:

Lebih jauh

Selain makro dan aturan, Anda mungkin ingin menulis aspek dan aturan repositori.