Bagaimana cara "membuat" aplikasi tahu target default untuk membangun jika tidak ada target yang ditentukan?

188

Sebagian besar aplikasi linux dikompilasi dengan:

make
make install clean

Seperti yang saya pahami, make mengambil nama target yang dibangun sebagai argumen. Begitu installjuga target yang menyalin beberapa file dan setelah itu cleanadalah target yang menghapus file sementara.

Tetapi target apa yang akan makedibangun jika tidak ada argumen yang ditentukan (mis. Perintah pertama dalam contoh saya)?

grigoryvp
sumber

Jawaban:

232

Secara default, ini dimulai dengan memproses target pertama yang tidak dimulai dengan .alias tujuan default ; untuk melakukan itu, ia mungkin harus memproses target lain - khususnya, target yang menjadi tujuan pertama.

Manual Pembuatan GNU mencakup semua hal ini, dan merupakan bacaan yang sangat mudah dan informatif.

Marcel Gosselin
sumber
61
Memanggil target pertama allhanyalah sebuah konvensi.
Tobu
1
Ini berguna untuk menjalankannya secara terpisah jika Anda menginstal untuk pengguna lain, karena Anda hanya perlu menjalankan make installsudo di dalam, daripada seluruh build.
Scott Wales
2
FYI entri man default untuk make tidak menyebutkan apa yang terjadi ketika Anda tidak menentukan target ..
Sekm
2
Jika GNU make manual mencakup hal-hal ini, mengapa pertanyaan ini diajukan? Manual ini sangat bagus dalam mendokumentasikan cara menulis aturan, tetapi tidak menyebutkan cara menulis Makefile.
Nick
1
Saya melihat file make yang includemerupakan makefile lain, yang target utamanya adalah %.o : %.cpp. Jadi target defaultnya adalah ... untuk membangun semua file .cpp?
Qwertie
178

Untuk menyelamatkan orang lain beberapa detik, dan untuk menyelamatkan mereka dari keharusan membaca manual, inilah jawaban singkatnya. Tambahkan ini ke bagian atas file make Anda:

.DEFAULT_GOAL := mytarget

mytarget sekarang akan menjadi target yang dijalankan jika "make" dijalankan dan tidak ada target yang ditentukan.

Jika Anda memiliki versi make yang lebih lama (<= 3,80), ini tidak akan berfungsi. Jika ini masalahnya, maka Anda dapat melakukan apa yang disebutkan, cukup tambahkan ini di bagian atas file make Anda:

.PHONY: default
default: mytarget ;

Referensi: https://www.gnu.org/software/make/manual/html_node/How-Make-Works.html

Samuel
sumber
1
@nathan Membuat mytarget target default jika seseorang menjalankan "make" tanpa parameter apa pun.
Samuel
1
Perhatikan bahwa .DEFAULT_GOAL tampaknya tidak didukung di GNU make v3.80, dan saya akan mengasumsikan versi sebelumnya juga (v3.81 mendukungnya). Jika Anda menjalankan versi make yang lebih lama, Anda harus memastikan target default Anda adalah target pertama / teratas dalam file make Anda.
Samuel
4
"... untuk menyelamatkan mereka dari keharusan membaca manual" adalah salah satu poin dari SO: jawaban cepat untuk pertanyaan yang mungkin memerlukan waktu untuk menggali dalam dokumentasi kuno.
WattsInABox
1
"Tambahkan ini ke atas file make Anda": Menambahkan ke atas sepertinya bukan keharusan.
Aman Deep Gautam
2
Ini seharusnya jawaban yang benar. Secara eksplisit atas kemenangan tersirat dalam kasus ini.
Sion
34

GNU Make juga memungkinkan Anda menentukan target make default menggunakan variabel khusus yang disebut .DEFAULT_GOAL. Anda bahkan dapat menghapus variabel ini di tengah Makefile, menyebabkan target selanjutnya dalam file menjadi target default.

Ref: The Gnu Make manual - Variabel Khusus

Sandip Bhattacharya
sumber