Estaba usando un Makefile del libro " Advanced Linux Programming (2001)" [código] . Fue extraño para mí ver que GNU make compila el código correctamente, sin siquiera especificar un compilador en el Makefile. ¡Es como hornear sin ninguna receta!
Esta es una versión mínima del código:
prueba.c
int main(){}
Makefile
all: test
y hacer que realmente funcione! Este es el comando que ejecuta:
cc test.c -o test
No pude encontrar nada útil en la documentación. ¿Cómo es esto posible?
PD Una nota adicional: incluso el idioma no está especificado; Porque test.c
está disponible, GNU make
utiliza cc
. Si existe test.cpp
o test.cc
(cuando no existe test.c
), usa g++
(y no c++
).
make
que hierva agua, y usando sus reglas internas,make
simplemente descubrirá cómo;)make
revisa su refrigerador y descubre que hay algo de harina disponible, luego hornea un pastel predeterminado para usted a partir de su receta interna. :-)Respuestas:
Make hace esto usando sus reglas incorporadas . En particular, le indican cómo compilar código C y cómo vincular programas de un solo objeto.
En realidad ni siquiera necesitas un Makefile:
funcionaría sin uno.
Para ver las reglas ocultas que hacen posible todo esto, use la
-p
opción sin Makefile:Como señaló alephzero , Make ha tenido reglas incorporadas durante mucho tiempo (si no siempre); La primera versión de Stuart Feldman en Unix V7 los define
files.c
, y su artículo de 1979 los menciona. También son parte de la especificación POSIX . (Esto no significa que todas las implementaciones de Make los admitan; el antiguo Borland Make para DOS no lo hace, al menos hasta la versión 3.0).fuente
test.c
se puede usar para producirtest
.make -d
le mostrará el proceso en detalle ...make
mucho antes de que se inventaran GNU o POSIX. La primera versión fue escrita hace casi 40 años, y hubo algunas versiones prototipo construidas a partir de scripts de shell incluso antes de eso.CPP
todavía invoca el preprocesador (cc -E
normalmente); El compilador de C ++ esCXX
.CXX
en este contexto es la variable Make, no un comando:$(CXX)
en un Makefile será reemplazado por un comando para ejecutar un compilador de C ++.