Ringkasan Ekstensi

Laporkan masalah Lihat sumber

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

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

Sebelum mempelajari konsep yang lebih lanjut, pertama-tama:

Makro dan aturan

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

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

Jika Anda ingin menggunakan kembali logika sederhana, mulailah dengan makro. Jika makro menjadi kompleks, sebaiknya jadikan hal tersebut sebagai aturan. Dukungan untuk bahasa baru biasanya dilakukan berdasarkan aturan. Aturan ditujukan untuk pengguna tingkat lanjut, dan sebagian besar pengguna tidak perlu menulisnya. Aturan tersebut 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 akan ditambahkan ke grafik). Di sinilah makro dievaluasi.

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

  • Fase eksekusi. Tindakan dijalankan, jika setidaknya salah satu outputnya diperlukan. Jika file tidak ada atau 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 sekali per build dan hasil evaluasi akan di-cache dan digunakan kembali. File hanya dievaluasi setelah semua dependensinya (pernyataan load()) telah diselesaikan. Secara desain, pemuatan file .bzl tidak memiliki efek samping yang terlihat, sehingga hanya menentukan nilai dan fungsi.

Bazel mencoba cerdas: ia 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 Anda perlukan untuk build saat ini, tindakan tersebut tidak akan dijalankan.

Membuat ekstensi

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

Lebih jauh

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