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

11 Menggunakan make untuk memperbarui file arsip

File arsip (archive) adalah file yang berisi sub-file bernama, yang disebut anggota. File arsip dikelola dengan program ar dan kegunaan utamanya adalah sebagai pustaka (library) subrutin untuk penautan.

11.1 Anggota arsip sebagai target

Sebuah anggota tersendiri dari file arsip dapat digunakan sebagai target atau prasyarat (prerequisite) dalam make. Anda menentukan anggota bernama member dalam file arsip archive sebagai berikut:

archive(member)

Notasi ini hanya dapat digunakan dalam target dan prasyarat, tidak dalam resep (recipe)! Sebagian besar program yang biasa Anda gunakan dalam resep tidak mendukung sintaksis ini dan tidak dapat bekerja langsung pada anggota arsip. Hanya ar dan program lain yang dirancang khusus untuk mengoperasikan arsip yang dapat melakukannya. Oleh karena itu, resep yang valid untuk memperbarui target anggota arsip kemungkinan besar harus menggunakan ar. Sebagai contoh, aturan berikut memerintahkan pembuatan anggota hack.o dalam arsip foolib dengan menyalin file hack.o:

foolib(hack.o) : hack.o
        ar cr foolib hack.o

Faktanya, hampir semua target anggota arsip diperbarui persis dengan cara ini, sehingga tersedia aturan implisit yang melakukannya secara otomatis untuk Anda. [Penting] Flag ‘c’ pada ar wajib disertakan jika file arsip belum ada.

Untuk menentukan beberapa anggota dalam arsip yang sama, Anda dapat menuliskan semua nama anggota bersama-sama di antara tanda kurung. Sebagai contoh, jika Anda menulis:

foolib(hack.o kludge.o)

ini setara dengan:

foolib(hack.o) foolib(kludge.o)

Anda juga dapat menggunakan wildcard bergaya shell dalam referensi anggota arsip. Lihat Menggunakan karakter wildcard dalam nama file. Sebagai contoh, ‘foolib(*.o)’ diperluas menjadi semua anggota arsip foolib yang ada dan namanya berakhiran ‘.o’; misalnya ‘foolib(hack.o) foolib(kludge.o)’.

11.2 Aturan implisit untuk target anggota arsip

Ingat kembali bahwa target berbentuk a(m) mewakili anggota bernama m dalam file arsip a.

Ketika make mencari aturan implisit untuk target semacam ini, sebagai fitur khusus, make juga mempertimbangkan aturan implisit yang cocok dengan (m), selain aturan yang cocok dengan target sebenarnya a(m).

Karena itu, satu aturan khusus dengan target (%) akan cocok. Aturan ini memperbarui target a(m) dengan menyalin file m ke dalam arsip. Sebagai contoh, aturan ini akan memperbarui target anggota arsip foo.a(bar.o) dengan menyalin file bar.o ke dalam arsip foo.a sebagai anggota bernama bar.o.

Ketika aturan ini dirangkai dengan aturan lain, hasilnya menjadi sangat kuat. Karena itu, jika ada file bar.c, cukup mengetik ‘make "foo.a(bar.o)"’ (tanda kutip diperlukan agar ‘(’ dan ‘)’ tidak ditafsirkan secara khusus oleh shell) untuk membuat resep berikut dijalankan, bahkan tanpa makefile sama sekali:

cc -c bar.c -o bar.o
ar r foo.a bar.o
rm -f bar.o

Di sini, make memperlakukan file bar.o seolah-olah sebagai file perantara. Lihat Rantai aturan implisit.

Aturan implisit seperti ini ditulis menggunakan variabel otomatis ‘$%’. Lihat Variabel otomatis.

Nama anggota arsip di dalam sebuah arsip tidak boleh mengandung nama direktori, tetapi dalam makefile terkadang berguna untuk berpura-pura bahwa nama tersebut mengandungnya. Jika Anda menuliskan target anggota arsip foo.a(dir/file.o), make akan melakukan pembaruan otomatis dengan resep berikut:

ar r foo.a dir/file.o

Ini mempunyai efek menyalin file dir/file.o ke dalam anggota bernama file.o. Sehubungan dengan penggunaan seperti ini, variabel otomatis %D dan %F dapat berguna.

11.2.1 Memperbarui direktori simbol arsip

File arsip yang digunakan sebagai pustaka biasanya berisi anggota khusus bernama __.SYMDEF yang memuat direktori nama simbol eksternal yang didefinisikan oleh semua anggota lainnya. Setelah Anda memperbarui anggota lain mana pun, Anda perlu memperbarui __.SYMDEF agar dapat merangkum anggota-anggota lain tersebut dengan benar. Ini dilakukan dengan menjalankan program ranlib:

ranlib archivefile

Biasanya, Anda menuliskan perintah ini dalam aturan untuk file arsip, dan menjadikan semua anggota file arsip sebagai prasyarat dari aturan tersebut. Sebagai contoh:

libfoo.a: libfoo.a(x.o y.o …)
        ranlib libfoo.a

Efeknya adalah anggota arsip x.o, y.o, dan seterusnya diperbarui, lalu anggota direktori simbol __.SYMDEF diperbarui dengan menjalankan ranlib. Aturan untuk memperbarui anggota-anggota tersebut tidak ditampilkan di sini; kemungkinan besar Anda dapat mengabaikannya dan menggunakan aturan implisit yang menyalin file ke dalam arsip, seperti dijelaskan pada bagian sebelumnya.

Perlu dicatat, hal ini tidak diperlukan jika Anda menggunakan program ar dari GNU, karena ar GNU memperbarui anggota __.SYMDEF secara otomatis.

11.3 Bahaya saat menggunakan arsip

Aturan bawaan untuk memperbarui arsip tidak kompatibel dengan build paralel. Aturan-aturan ini (yang diwajibkan oleh standar POSIX) menambahkan setiap file objek ke dalam arsip begitu file tersebut dikompilasi. Ketika build paralel diaktifkan, hal ini memungkinkan beberapa perintah ar memperbarui arsip yang sama secara bersamaan, padahal ini tidak didukung.

Jika Anda ingin menggunakan build paralel dengan arsip, Anda dapat menimpa (override) aturan default dengan menambahkan baris berikut ke makefile Anda:

(%) : % ;
%.a : ; $(AR) $(ARFLAGS) $@ $?

Baris pertama mengubah aturan yang memperbarui setiap objek dalam arsip menjadi tidak melakukan apa-apa, dan baris kedua mengubah aturan default untuk membangun arsip agar memperbarui semua objek yang usang ($?) dalam satu perintah.

Tentu saja, Anda tetap perlu mendeklarasikan prasyarat pustaka Anda menggunakan sintaksis arsip:

libfoo.a: libfoo.a(x.o y.o …)

Jika Anda lebih memilih menulis aturan eksplisit, Anda dapat menggunakan:

libfoo.a: libfoo.a(x.o y.o …)
        $(AR) $(ARFLAGS) $@ $?

11.4 Aturan sufiks untuk file arsip

Anda juga dapat menulis jenis khusus aturan sufiks untuk menangani file arsip. Untuk penjelasan lengkap tentang aturan sufiks, lihat Aturan sufiks gaya lama. Aturan sufiks untuk arsip sudah usang dalam GNU make, karena aturan pola untuk arsip merupakan mekanisme yang lebih umum (lihat Aturan implisit untuk target anggota arsip). Meskipun begitu, aturan ini tetap dipertahankan demi kompatibilitas dengan make lainnya.

Untuk menulis aturan sufiks bagi arsip, Anda cukup menulis aturan sufiks dengan menggunakan sufiks target ‘.a’ (sufiks yang umum digunakan untuk file arsip). Sebagai contoh, berikut ini aturan sufiks gaya lama untuk memperbarui arsip pustaka dari file sumber C:

.c.a:
        $(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o $*.o
        $(AR) r $@ $*.o
        $(RM) $*.o

Ini bekerja persis seolah-olah Anda menulis aturan pola berikut:

(%.o): %.c
        $(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o $*.o
        $(AR) r $@ $*.o
        $(RM) $*.o

Faktanya, inilah persis yang dilakukan make ketika menemukan aturan sufiks dengan ‘.a’ sebagai sufiks target. Setiap aturan sufiks ganda ‘.x.a’ diubah menjadi aturan pola dengan pola target ‘(%.o)’ dan pola prasyarat ‘%.x’.

Karena Anda mungkin ingin menggunakan ‘.a’ sebagai sufiks untuk jenis file lain, make juga mengonversi aturan sufiks arsip menjadi aturan pola dengan cara biasa (lihat Aturan sufiks gaya lama). Dengan demikian, aturan sufiks ganda ‘.x.a’ menghasilkan dua aturan pola: ‘(%.o): %.x’ dan ‘%.a: %.x’.


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