Ich habe ein Makefile aus dem Buch " Advanced Linux Programming (2001)" [code] verwendet . Es war seltsam für mich zu sehen, dass GNU make den Code korrekt kompiliert, ohne überhaupt einen Compiler im Makefile anzugeben. Es ist wie Backen ohne Rezept!
Dies ist eine Minimalversion des Codes:
test.c
int main(){}
Makefile
all: test
und machen wirklich funktioniert! Dies ist der Befehl, den es ausführt:
cc test.c -o test
Ich konnte in der Dokumentation nichts Nützliches finden. Wie ist das möglich?
PS Ein zusätzlicher Hinweis: Auch die Sprache ist nicht angegeben; Da zur test.c
Verfügung steht, GNU make
verwendet cc
. Wenn es existiert test.cpp
oder test.cc
(wenn es kein gibt test.c
), verwendet es g++
(und nicht c++
).
make
, man solle Wasser kochen und seine internen Regelnmake
make
überprüft ein Roboter namens Ihren Kühlschrank und stellt fest, dass Mehl verfügbar ist. Dann backt er einen Standardkuchen nach seinem internen Rezept für Sie. :-)Antworten:
Make verwendet dazu die eingebauten Regeln . Hier erfahren Sie insbesondere, wie Sie C-Code kompilieren und Einzelobjektprogramme verknüpfen.
Du brauchst eigentlich nicht mal ein Makefile:
würde ohne einen funktionieren.
Verwenden Sie die
-p
Option ohne Makefile , um die verborgenen Regeln anzuzeigen, die all dies ermöglichen :Wie von alephzero hervorgehoben , hat Make sehr lange (wenn nicht immer) Regeln eingebaut. Stuart Feldmans erste Version in Unix V7 definiert sie
files.c
, und sein Papier von 1979 erwähnt sie. Sie sind auch Teil der POSIX-Spezifikation . (Dies bedeutet nicht, dass alle Implementierungen von Make diese unterstützen - das alte Borland Make für DOS unterstützt dies nicht, zumindest nicht bis Version 3.0.)quelle
test.c
dass damit produziert werden kanntest
.make -d
wird Ihnen den Prozess im Detail zeigen ...make
lange bevor GNU oder POSIX erfunden wurden. Die erste Version wurde vor fast 40 Jahren geschrieben, und es gab einige Prototypversionen, die bereits zuvor aus Shell-Skripten erstellt wurden.CPP
ruft immer noch den Präprozessor auf (cc -E
normalerweise). Der C ++ - Compiler istCXX
.CXX
in diesem Zusammenhang die Variable Make, kein Befehl -$(CXX)
in einem Makefile wird durch einen Befehl zum Ausführen eines C ++ - Compilers ersetzt.