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.c
tersedia, GNU make
menggunakan cc
. Jika ada test.cpp
atau test.cc
(ketika tidak ada test.c
), ia menggunakan g++
(dan tidak c++
).
make
merebus air, dan menggunakan aturan internalnya,make
hanya akan mengetahui caranya;)make
memeriksa lemari es Anda dan menemukan ada beberapa tepung yang tersedia, kemudian membuat kue default untuk Anda dari resep internalnya. :-)Jawaban:
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:
akan bekerja tanpa satu.
Untuk melihat aturan tersembunyi yang memungkinkan semua ini, gunakan
-p
opsi tanpa Makefile: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 mendefinisikannya
files.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.)sumber
test.c
dapat digunakan untuk menghasilkantest
.make -d
akan menunjukkan prosesnya secara terperinci ...make
lama 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.CPP
masih memanggil preprosesor (cc -E
biasanya); kompiler C ++ adalahCXX
.CXX
dalam konteks ini adalah variabel Make, bukan perintah -$(CXX)
dalam Makefile akan digantikan oleh perintah untuk menjalankan kompiler C ++.