J'utilisais un Makefile du livre " Advanced Linux Programming (2001)" [code] . C'était étrange pour moi de voir que GNU make compilait le code correctement, sans même spécifier un compilateur dans le Makefile. C'est comme cuire sans aucune recette!
Ceci est une version minimale du code:
test.c
int main(){}
Makefile
all: test
et fait vraiment fonctionner! C'est la commande qu'il exécute:
cc test.c -o test
Je n'ai rien trouvé d'utile dans la documentation. Comment c'est possible?
PS Une note supplémentaire: Même la langue n’est pas spécifiée; Parce que test.c
est disponible, GNU make
utilise cc
. S'il existe test.cpp
ou test.cc
(quand il n'y en a pas test.c
), il utilise g++
(et non c++
).
make
de faire bouillir de l'eau et qu'on utilise ses règles internesmake
pour comprendre comment;)make
vérifie votre réfrigérateur et découvre qu'il y a de la farine disponible, puis prépare un gâteau par défaut à partir de sa recette interne. :-)Réponses:
Make le fait en utilisant ses règles intégrées . Celles-ci lui indiquent notamment comment compiler le code C et comment lier des programmes mono-objets.
En fait, vous n'avez même pas besoin d'un Makefile:
fonctionnerait sans un.
Pour voir les règles cachées rendant tout cela possible, utilisez l'
-p
option sans makefile:Comme l'a souligné alephzero , Make a des règles intégrées depuis très longtemps (sinon toujours); La première version de Stuart Feldman dans Unix V7 les définit
files.c
, et son article de 1979 les mentionne. Ils font également partie de la spécification POSIX . (Cela ne signifie pas que toutes les implémentations de Make les prennent en charge - l'ancienne version de Make pour DOS de Borland ne fonctionne pas, du moins jusqu'à la version 3.0.)la source
test.c
peut être utilisé pour produiretest
.make -d
va vous montrer le processus en détail ...make
bien avant que GNU ou POSIX aient été inventés. La première version a été écrite il y a près de 40 ans et il existait déjà des versions de prototype à partir de scripts shell.CPP
appelle toujours le préprocesseur (cc -E
généralement); le compilateur C ++ estCXX
.CXX
dans ce contexte est la variable Make, pas une commande -$(CXX)
dans un Makefile sera remplacé par une commande pour exécuter un compilateur C ++.