Bagaimana Makefile ini membuat program C bahkan tanpa menentukan kompiler?


41

Saya menggunakan Makefile dari buku " Advanced Linux Programming (2001)" [kode] . Aneh bagi saya untuk melihat bahwa make GNU mengkompilasi kode dengan benar, bahkan tanpa menentukan kompiler di Makefile. Ini seperti memanggang tanpa resep apa pun!

Ini adalah versi minimal dari kode:

test.c

int main(){}

Makefile

all:            test

dan membuatnya benar-benar bekerja! Ini adalah perintah yang dijalankannya:

cc     test.c   -o test

Saya tidak dapat menemukan sesuatu yang berguna dalam dokumentasi. Bagaimana ini mungkin?


PS Satu catatan tambahan: Bahkan bahasa tidak ditentukan; Karena test.ctersedia, GNU makemenggunakan cc. Jika ada test.cppatau test.cc(ketika tidak ada test.c), ia menggunakan g++(dan tidak c++).


4
"Ini seperti memanggang tanpa resep apa pun!" Sebuah resep akan memberitahu Anda untuk merebus air, tetapi tidak apakah Anda harus merebus air menggunakan panci di atas kompor gas, panci di kompor induksi, ketel listrik, atau kuali yang diletakkan pada tripod di atas api. Bahkan tidak memberitahu Anda di mana Anda harus mendapatkan air. Ini seperti menyuruh makemerebus air, dan menggunakan aturan internalnya, makehanya akan mengetahui caranya;)
Rhymoid

1
@Rhoidoid Ini seperti berteriak: Saya ingin kue! Dan kemudian robot yang disebut makememeriksa lemari es Anda dan menemukan ada beberapa tepung yang tersedia, kemudian membuat kue default untuk Anda dari resep internalnya. :-)
Ho1

@ Ho1: Robot itu mungkin bertanya, Kue mana yang Anda ingin pak? :): D
Thushi

Jawaban:


68

Lakukan apakah ini menggunakan aturan bawaannya . Ini memberi tahu khususnya bagaimana mengkompilasi kode C dan bagaimana menautkan program objek tunggal.

Anda sebenarnya tidak membutuhkan Makefile:

make test

akan bekerja tanpa satu.

Untuk melihat aturan tersembunyi yang memungkinkan semua ini, gunakan -popsi tanpa Makefile:

make -p -f /dev/null

Seperti yang ditunjukkan oleh alephzero , Make telah memiliki aturan bawaan untuk waktu yang sangat lama (jika tidak selalu); Versi pertama Stuart Feldman di Unix V7 mendefinisikannyafiles.c , dan makalahnya tahun 1979 menyebutkannya. Mereka juga bagian dari spesifikasi POSIX . (Ini tidak berarti bahwa semua implementasi dari Make mendukung mereka - Borland Make for DOS yang lama tidak, setidaknya hingga versi 3.0.)


2
Saya pikir begitu, tetapi POSIX menentukannya juga !
Stephen Kitt

5
@KingZoingo Make sebenarnya adalah mesin inferensi: ia memiliki seperangkat aturan (bawaan dan dari Makefile), artefak yang ada (file dalam direktori saat ini atau dinamai dalam Makefile), dan artefak yang diminta (target dalam Makefile); itu hanya mencoba untuk mencocokkan aturan dan artefak yang ada untuk menentukan apakah itu dapat menggunakannya untuk mendapatkan artefak yang diminta. Aturan bawaan mengatakan itu test.cdapat digunakan untuk menghasilkan test. make -dakan menunjukkan prosesnya secara terperinci ...
Stephen Kitt

4
@ Ho1 @StephenKitt Ini sudah makelama sebelum GNU atau POSIX ditemukan. Versi pertama ditulis hampir 40 tahun yang lalu, dan ada beberapa versi prototipe yang dibangun dari skrip shell bahkan sebelum itu.
alephzero

3
@jamesqf CPPmasih memanggil preprosesor ( cc -Ebiasanya); kompiler C ++ adalah CXX.
Stephen Kitt

3
@ Ho1 CXXdalam konteks ini adalah variabel Make, bukan perintah - $(CXX)dalam Makefile akan digantikan oleh perintah untuk menjalankan kompiler C ++.
Stephen Kitt
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.