Reglas implícitas
No es necesario declarar las reglas de todos los archivos de código objeto que queramos compilar. Make da soporta para compilar automáticamente algunos tipos de archivo de forma implícita.
Este vídeo lamentablemente todavía no tiene notas de episodio. Todavía quedan algunos vídeos en este sitio web que no tienen artículos de texto por si te gusta más leer que ver vídeos, y parece que esta página es una de ellas. Hay una transcripción del audio disponible para ayudarte a llegar a este vídeo que puede que te ayude.
¡Ayúdame a saber qué es prioritario y qué no! ¿Te hubiese ayudado encontrar un artículo de texto en esta página junto al vídeo?
Desplegar transcripción del episodio
Ya habéis visto que nuestro programa es un conjunto de archivos de código objeto enlazados a la vez, utilizando GC-O. Cada uno de estos archivos de código objeto lo hemos puesto en una regla nueva indicando que tiene que hacer para cada uno de ellos, por ejemplo el main.o se compila, salida.o se compila, calculadora.o se compila. Existe una optimización que nos va a evitar tener que reescribir muchas líneas de código, y es el tema de las reglas implícitas, y es que Make ya sabe cómo compilar algunos tipos especiales de archivo, por ejemplo como compilar un.c en un.o. Este catálogo de reglas implícitas lo tenéis en la documentación oficial de Make, en el capítulo 10.2. Aquí veis que Make soporta automáticamente la compilación de archivos de código fuente de C, de código fuente de C++, de Pascal, de Fortran, de RADFOR, de Fortran, de RADFOR, de Modula 2, de ensamblador, sabe hasta cómo enlazar archivos, entonces no tenemos por qué escribir siempre todo todo todo todo, sino que podemos hacer que algunas reglas las deduzca él. Nosotros podemos simplemente decirle que main.o depende de main.c y funciones.h, que salida.o depende de salida.c y funciones.h, que calculadora.o depende de calculadora.c y funciones.h, y ya él mismo va a averiguar un poco cómo se compila. Por ejemplo, vamos a hacer un make clean ahora, y vamos a ejecutar make main.o, y como veis ya sabe que lo que tiene que hacer es llamar a cc, que es una variable que por defecto va a valer gcc, vale realmente más que una variable y en este caso lo que es es que cc es un sinónimo para gcc, menos g menos wall que son los parámetros que le hemos dicho con cflux, menos c y finalmente menos o main.o para indicar que queremos que se genere un main.o y main.c para indicar que queremos que se compile el main.c. Lo mismo con salida.o y lo mismo con calculadora.o. Entonces él ya sabe cómo se hace todo esto. Si yo hago un make clean y lo hago de golpe toda la vez, pues veréis que con make ya sabe realmente cómo se hace. Entonces esto está muy bien porque si tenemos varios archivos de código fuente no tenemos por qué decir siempre cómo se hace lo mismo, escribir únicamente las reglas así tal cual ya es más que suficiente. Y además esto funciona con un montón de tipos de archivos, como ya habéis visto archivos de código fuente de c, de c++, de ensamblador, de fortran, en fin un montón. Para ello como veis en la documentación, la voy a volver a abrir porque es que no me puedo acordar de todo de memoria evidentemente, la sección 10.2 os muestra las distintas recetas que usa por defecto, en este caso por ejemplo cuando compila código fuente en c, pues lo que hace es llamar a estas variables que estáis viendo aquí, cc, cppflags, cflags, por eso os he dicho que eran unas variables muy comunes porque por ejemplo cflags contiene las variables o las parámetros que se le van a pasar al compilador, a gcc o al que sea, en este caso yo lo sobreescribo con cflags. Cc es una variable que suele indicar al compilador, si no le digo nada pues va a valer cc, que como ya habéis visto es un enlace simbólico al compilador por defecto de nuestro ordenador, pero que puedo poner si a mí me apetece, por ejemplo cc es gcc, imaginaos que es obligatorio o imaginaos que es necesario que se compile con celan, pues celan, o sea que ningún problema en ese sentido, o por ejemplo cxx es una variable que apunta al compilador de c++ que suele ser normalmente g++ o el que sea, cxxflags van a ser los parámetros que se van a pasar al compilador, o por ejemplo pc es el compilador de pascal, o pflags son los parámetros de pascal, en definitiva que soporta muchos formatos. Aquí tenéis la lista completa de sufijos que él detecta y cuando él detecta que un programa termina con un sufijo y no tenemos ninguna instrucción pues lo que hace es utilizar eso, por ejemplo los.out, los.a para los archivadores de librerías, los.c para el código fuente, los.cpp para el código fuente de c++,.s para el ensamblador, incluso algunos formatos especiales como y para indicar que es jack y.l, tanto lets como jack, aquí los tenéis, tanto jack como lets, o cualquier otro, incluso.txt, si usáis latex o.txt,.info si queréis usar estos formatos de documentación, entonces él ya es muy listo, él ya sabe más o menos cómo tiene que hacerlo, no tenéis por qué poner todo, podéis utilizar los prefijos y ya está, es muy conveniente en este sentido, aquí veis que de reglas tiene.