Bahasa: 日本語 | Español | Français | Português | 中文 | Bahasa Indonesia | English
Sebelumnya | Berikutnya | Daftar Isi | Versi asli bahasa Inggris (gnu.org)

13 Mengintegrasikan GNU make

GNU make sering digunakan sebagai salah satu komponen dalam kumpulan alat yang lebih besar, seperti lingkungan pengembangan terpadu (IDE) atau rantai alat (toolchain) kompiler. Peran make adalah menjalankan perintah dan menentukan apakah perintah tersebut berhasil atau tidak. Untuk menjalankan peran ini saja, tidak diperlukan mekanisme integrasi khusus. Namun, ada kalanya lebih bermanfaat untuk menghubungkan make secara lebih erat dengan bagian lain dari sistem. Ini mencakup baik integrasi dengan alat pada level yang lebih tinggi (alat yang memanggil make) maupun dengan alat pada level yang lebih rendah (alat yang dipanggil oleh make).

13.1 Berbagi slot job dengan GNU make

GNU make memiliki kemampuan untuk menjalankan beberapa resep (recipe) secara paralel (lihat Eksekusi paralel), dan bahkan membatasi jumlah total job paralel meskipun melewati beberapa pemanggilan rekursif make (lihat Menyampaikan opsi ke sub-make). Beberapa alat yang dipanggil oleh make juga mampu menjalankan beberapa operasi secara paralel, baik menggunakan beberapa thread maupun beberapa proses. Alat semacam ini dapat diperluas agar ikut serta dalam mekanisme manajemen job GNU make, sehingga jumlah total thread/proses yang aktif berjalan di sistem tidak melebihi jumlah maksimum slot yang diberikan kepada GNU make.

GNU make menggunakan metode yang disebut “jobserver” untuk mengontrol jumlah job yang aktif melewati pemanggilan rekursif. Implementasi jobserver yang sebenarnya berbeda-beda tergantung sistem operasi, tetapi ada beberapa aspek mendasar yang selalu sama.

Pertama, make menyediakan informasi yang diperlukan untuk mengakses jobserver kepada proses anaknya melalui variabel lingkungan MAKEFLAGS. Alat yang ingin ikut serta dalam protokol jobserver perlu menguraikan (parse) variabel lingkungan ini dan mencari kata yang diawali dengan --jobserver-auth=. Nilai opsi ini menjelaskan bagaimana cara berkomunikasi dengan jobserver. Cara menafsirkan nilai ini dijelaskan pada bagian-bagian berikut.

Perlu diperhatikan bahwa variabel MAKEFLAGS dapat berisi beberapa instance opsi --jobserver-auth=. Hanya instance terakhir yang berlaku.

Kedua, setiap perintah yang dijalankan make memiliki satu slot job implisit yang sudah dicadangkan untuknya sebelum perintah tersebut dimulai. Alat mana pun yang ingin ikut serta dalam protokol jobserver dapat menganggap bahwa dirinya selalu bisa menjalankan satu job tanpa perlu menghubungi jobserver sama sekali.

Terakhir, sangat penting bagi alat yang berpartisipasi dalam protokol jobserver untuk mengembalikan tepat jumlah slot yang diperoleh dari jobserver sebelum keluar, bahkan dalam kondisi error sekalipun. Ingatlah bahwa slot job implisit yang disebutkan tadi tidak boleh dikembalikan ke jobserver! Mengembalikan slot terlalu sedikit berarti slot tersebut akan hilang selama sisa proses build. Sebaliknya, mengembalikan slot terlalu banyak berarti akan ada slot ekstra yang tersedia. Perintah make tingkat teratas akan menampilkan pesan error di akhir build jika mendeteksi jumlah slot yang tersedia di jobserver tidak benar.

Sebagai contoh, anggaplah Anda sedang mengimplementasikan linker yang mendukung operasi multithread. Anda ingin memperluas linker ini sehingga, saat dipanggil oleh GNU make, linker tersebut dapat ikut serta dalam protokol jobserver untuk mengontrol jumlah thread yang digunakan selama proses link. Pertama-tama, Anda perlu memodifikasi linker agar dapat menentukan apakah variabel lingkungan MAKEFLAGS sudah diatur. Selanjutnya, Anda perlu menguraikan nilai variabel tersebut untuk menentukan apakah jobserver tersedia, dan bagaimana cara mengaksesnya. Jika tersedia, Anda dapat mengaksesnya untuk memperoleh slot job yang mengontrol seberapa besar paralelisme yang dapat digunakan oleh alat Anda. Setelah selesai, alat Anda harus mengembalikan slot job tersebut ke jobserver.

13.1.1 Interaksi jobserver di POSIX

Pada sistem POSIX, jobserver diimplementasikan dengan salah satu dari dua cara. Pada sistem yang mendukungnya, GNU make akan membuat pipa bernama (named pipe) dan menggunakannya sebagai jobserver. Dalam kasus ini, opsi auth akan berbentuk --jobserver-auth=fifo:PATH, dengan ‘PATH’ adalah nama path pipa bernama tersebut. Untuk mengakses jobserver, Anda harus membuka path pipa bernama ini dan membaca/menulis padanya seperti yang dijelaskan di bawah ini.

Jika sistem tidak mendukung pipa bernama, atau jika pengguna memberikan opsi --jobserver-style dengan menentukan ‘pipe’, maka jobserver akan diimplementasikan sebagai pipa UNIX sederhana. Dalam kasus ini, opsi auth akan berbentuk --jobserver-auth=R,W, dengan ‘R’ dan ‘W’ adalah bilangan bulat non-negatif yang mewakili deskriptor file: ‘R’ adalah deskriptor file untuk membaca dan ‘W’ adalah deskriptor file untuk menulis. Jika salah satu atau kedua deskriptor file ini bernilai negatif, artinya jobserver dinonaktifkan untuk proses ini.

Ketika menggunakan pipa sederhana, hanya baris perintah yang dikenali make sebagai pemanggilan rekursif make itu sendiri (lihat Cara kerja variabel MAKE) yang memiliki akses ke jobserver. Saat menulis makefile, Anda harus memastikan untuk menandai perintah tersebut sebagai rekursif (cara yang paling umum adalah dengan menambahkan tanda + di awal baris perintah; lihat Penggunaan rekursif make). Perlu diperhatikan bahwa sisi pembacaan pada pipa jobserver diatur ke mode “blocking”. Mode ini tidak boleh diubah.

Pada kedua implementasi jobserver ini, pipa akan diisi terlebih dahulu dengan satu token satu karakter untuk setiap job yang tersedia. Untuk memperoleh slot tambahan, Anda harus membaca satu karakter dari jobserver; untuk melepaskan satu slot, Anda harus menulis kembali satu karakter ke jobserver.

Saat melepaskan slot job, penting untuk menulis kembali karakter yang sama dengan yang Anda baca. Jangan berasumsi bahwa semua token adalah karakter yang sama; karakter yang berbeda dapat memiliki arti yang berbeda bagi GNU make. Urutannya tidak penting, karena make sama sekali tidak tahu dalam urutan apa job akan selesai.

Ada berbagai kondisi error yang perlu Anda pertimbangkan agar implementasi Anda andal:

13.1.2 Interaksi jobserver di Windows

Pada sistem Windows, jobserver diimplementasikan sebagai semaphore bernama (named semaphore). Semaphore ini diatur dengan hitungan awal yang sama dengan jumlah slot yang tersedia. Untuk memperoleh slot, Anda harus menunggu (wait) pada semaphore tersebut (dengan atau tanpa timeout). Untuk melepaskan slot, lepaskan (release) semaphore tersebut.

Untuk mengakses semaphore, Anda harus menguraikan variabel MAKEFLAGS dan mencari string argumen --jobserver-auth=NAME, dengan ‘NAME’ adalah nama semaphore bernama tersebut. Berikan nama ini ke OpenSemaphore untuk membuat handle ke semaphore tersebut.

Satu-satunya gaya (style) yang valid untuk --jobserver-style adalah ‘sem’.

Ada berbagai kondisi error yang perlu Anda pertimbangkan agar implementasi Anda andal:

13.2 Menyinkronkan output terminal

Biasanya, GNU make menjalankan semua perintah dengan akses ke output standar dan output error standar yang sama seperti yang dimiliki make itu sendiri saat dijalankan. Banyak alat mendeteksi apakah output-nya mengarah ke terminal atau bukan, dan menggunakan informasi ini untuk mengubah gaya output-nya. Misalnya, jika output mengarah ke terminal, alat tersebut mungkin menambahkan karakter kontrol yang mengatur warna, atau bahkan mengubah posisi kursor. Jika output tidak mengarah ke terminal, karakter kontrol khusus ini tidak dikeluarkan agar tidak merusak file log dan semacamnya.

Opsi --output-sync (lihat Output selama eksekusi paralel) akan menonaktifkan deteksi terminal ini. Ketika sinkronisasi output diaktifkan, GNU make akan mengatur agar semua output perintah ditulis terlebih dahulu ke sebuah file, sehingga output tersebut dapat ditulis sebagai satu blok utuh tanpa terganggu oleh output perintah lain. Akibatnya, semua alat yang dijalankan oleh make akan mengira bahwa output-nya tidak ditampilkan ke terminal, meskipun sebenarnya akan ditampilkan (karena make akan menampilkannya di sana setelah perintah selesai).

Untuk membantu alat yang ingin menentukan apakah output-nya akan ditampilkan di terminal, GNU make mengatur variabel lingkungan MAKE_TERMOUT dan MAKE_TERMERR sebelum menjalankan perintah apa pun. Alat yang ingin menentukan apakah output standar (atau output error standar) akan ditampilkan di terminal dapat memeriksa apakah variabel lingkungan ini ada dan memiliki nilai yang tidak kosong. Jika ya, alat tersebut dapat menganggap bahwa output-nya (pada akhirnya) akan ditampilkan di terminal. Jika variabel ini tidak diatur atau bernilai kosong, alat tersebut sebaiknya menggunakan cara biasa untuk menentukan apakah output mengarah ke terminal atau tidak.

Isi variabel-variabel ini juga dapat diuraikan untuk menentukan jenis terminal yang digunakan untuk menampilkan output.

Demikian pula, lingkungan yang menjalankan make dan ingin menangkap output-nya untuk pada akhirnya ditampilkan di terminal (atau perangkat tampilan lain yang dapat menafsirkan karakter kontrol terminal) dapat mengatur variabel-variabel ini sebelum menjalankan make. GNU make tidak akan mengubah variabel lingkungan ini jika variabel tersebut sudah ada saat make dijalankan.


Sebelumnya | Berikutnya | Daftar Isi | Versi asli bahasa Inggris (gnu.org)