Bu Makefile, bir derleyici belirtmeden C programını nasıl yapar?


41

" Advanced Linux Programming (2001)" [code] kitabından bir Makefile kullanıyordum . GNU markasının Makefile'da bir derleyici belirtmeden bile kodu doğru şekilde derlediğini görmek benim için garipti . Herhangi bir tarif olmadan pişirme gibi!

Bu, kodun minimal bir sürümüdür:

test.c

int main(){}

Makefile

all:            test

ve gerçekten işe yarar! Çalıştırdığı komut bu:

cc     test.c   -o test

Belgelerde faydalı bir şey bulamadım. Bu nasıl mümkün olabilir?


PS Bir ek not: Dil bile belirtilmemiş; Çünkü test.cmevcut, GNU makekullanıyor cc. Varsa test.cppveya test.cc(yok olduğunda test.c) kullanır g++( kullanır c++).


4
"Herhangi bir tarif olmadan pişirme gibi!" Bir tarif size su kaynatmanızı söyleyecektir, ancak bir gaz ocağında bir tava, bir endüksiyon ocağında bir tava, bir elektrikli su ısıtıcısı veya bir ateşte tripod üzerine yerleştirilmiş bir kazan kullanarak su kaynatmanız gerekip gerekmediği söylenemez. Suyu nereden alman gerektiğini bile söylemedi. Bu makesu kaynatmak ve kendi iç kurallarını kullanarak anlatmak gibi makesadece nasıl olacağını
çözecek

1
@ Rhymoid Bağırmak gibi bir şey : Bir pasta istiyorum! Sonra bir robot make, buzdolabınızı kontrol eder ve bir miktar un bulunduğunu öğrenir, sonra iç tarifinden sizin için varsayılan bir kek pişirir. :-)
Ho1

@ Ho1: Robot sorabilir, Hangi pastaya sahip olmak istersiniz efendim? :): D
Thushi

Yanıtlar:


68

Bunu, yerleşik kurallarını kullanarak yapın . Bunlar özellikle C kodunun nasıl derleneceğini ve tek nesne programlarının nasıl bağlanacağını anlatıyor.

Aslında bir Makefile'e bile ihtiyacınız yok:

make test

biri olmadan çalışacaktı.

Tüm bunları mümkün kılan gizli kuralları görmek için -pMakefile'sız seçeneği kullanın :

make -p -f /dev/null

Alephzero tarafından belirtildiği gibi , Yap çok uzun bir süre için yerleşik kurallara sahiptir (her zaman değilse); Stuart Feldman'ın Unix V7'deki ilk versiyonu onları tanımlarfiles.c ve 1979 tarihli makalesinde onlardan bahseder. Ayrıca POSIX teknik özelliklerinin bir parçasıdır . (Bu, Make'ın tüm uygulamalarının onları desteklediği anlamına gelmez - eski Borland DOS for Make, en azından 3.0 sürümüne kadar değil.)


2
Öyle düşündüm, ama POSIX de onları belirtiyor !
Stephen Kitt

5
@KingZoingo Make, aslında bir çeşit çıkarım motorudur: bir dizi kural (yerleşik ve Makefile'den), mevcut eserler (geçerli dizindeki veya Makefile'de adı geçen dosyalar) ve istenen eserler (hedeflerde Makefile'ında); talep edilen eserleri elde etmek için bunları kullanıp kullanamayacağını belirlemek için kuralları ve mevcut eserleri eşleştirmeye çalışır. Yerleşik kurallar test.cüretmek için kullanılabileceğini söyler test. make -dsüreci detaylı olarak göstereceğim ...
Stephen Kitt

4
@ Ho1 @StephenKitt Bu makeGNU veya POSIX'in icat edilmesinden çok önceydi. İlk versiyon yaklaşık 40 yıl önce yazılmış ve bundan önce bile kabuk betiklerinden yapılmış bazı prototip versiyonları vardı.
alephzero

3
@jamesqf CPPhala önişlemciyi çağırıyor ( cc -Etipik olarak); C ++ derleyicisidir CXX.
Stephen Kitt

3
@ CXXBu bağlamdaki Ho1 , Make değişkenidir, bir komut değildir - $(CXX)bir Makefile içindeki bir C ++ derleyicisini çalıştırmak için kullanılacak bir komutla değiştirilecektir.
Stephen Kitt
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.