Definición de reglas en Makefile

Ahora aprenderemos las reglas de Makefile.

La sintaxis general de una regla de destino Makefile es:

target [target...] : [dependent ....]
[ command ...]

En el código anterior, los argumentos entre paréntesis son opcionales y la elipsis significa uno o más. Aquí, tenga en cuenta que se requiere la pestaña que precede a cada comando.

A continuación se ofrece un ejemplo sencillo en el que se define una regla para hacer que su objetivo salude desde otros tres archivos.

hello: main.o factorial.o hello.o
   $(CC) main.o factorial.o hello.o -o hello

NOTE - En este ejemplo, tendría que dar reglas para crear todos los archivos objeto a partir de los archivos fuente.

La semántica es muy sencilla. Cuando dices "hacer objetivo", elmakeencuentra la regla de destino que se aplica; y, si alguno de los dependientes es más nuevo que el objetivo,makeejecuta los comandos uno a la vez (después de la sustitución de macros). Si hay que hacer dependientes, eso sucede primero (por lo que tiene una recursión).

Maketermina si algún comando devuelve un estado de falla. En tal caso, se mostrará la siguiente regla:

clean:
   -rm *.o *~ core paper

Makeignora el estado devuelto en las líneas de comando que comienzan con un guión. Por ejemplo, ¿a quién le importa si no hay un archivo principal?

Makerepite los comandos, después de la sustitución de macros para mostrarle lo que está sucediendo. A veces es posible que desee desactivar eso. Por ejemplo

install:
   @echo You must be root to install

La gente ha llegado a esperar ciertos objetivos en Makefiles. Siempre debes navegar primero. Sin embargo, es razonable esperar que se encuentren todos los objetivos (o simplemente hacer), instalar y limpiar.

  • make all - Compila todo para que puedas hacer pruebas locales antes de instalar aplicaciones.

  • make install - Instala aplicaciones en los lugares adecuados.

  • make clean - Limpia aplicaciones, elimina los ejecutables, cualquier archivo temporal, archivo objeto, etc.

Reglas implícitas de Makefile

El comando es uno que debería funcionar en todos los casos en los que construimos un ejecutable x a partir del código fuente x.cpp. Esto puede establecerse como una regla implícita:

.cpp:
   $(CC) $(CFLAGS) [email protected] $(LDFLAGS) -o [email protected]

Esta regla implícita dice cómo hacer x con xc - ejecutar cc en xc y llamar a la salida x. La regla está implícita porque no se menciona ningún objetivo en particular. Se puede utilizar en todos los casos.

Otra regla implícita común es la construcción de archivos .o (objeto) a partir de .cpp (archivos fuente).

.cpp.o:
   $(CC) $(CFLAGS) -c $<

alternatively

.cpp.o:
   $(CC) $(CFLAGS) -c $*.cpp