2010-02-16 22 views

Respuesta

22

Makefile tener este aspecto:

all: mybinary 

mybinary: files.o it.o depends.o on.o 
[tab]$(CC) $(CFLAGS) files.o it.o depends.o on.o -o mybinary 

files.o: files.c files.h 
[tab]$(CC) -c $(CPPFLAGS) $(CFLAGS) $< -o [email protected] 

... 

Esto significa que, cuando se escribe make all (la abreviatura es sólo para escribir make), que se asegurará de que el objetivo MyBinary o archivo es hasta la fecha. Para hacer eso, necesita asegurarse de que mybinary es más nuevo que todos los archivos.o it.o depends.o y on.o. De lo contrario, utiliza los comandos de shell especificados en la siguiente línea para compilar mybinary. Pero antes de hacerlo, primero se asegura de que los archivos.o y demás estén actualizados. Esto significa que tienen que ser más nuevos que files.c y files.h. De lo contrario, utiliza los comandos de shell especificados en la siguiente línea para compilar files.o. Una vez que todos los archivos * .o estén actualizados, puede compilar mybinary. Una vez que se construye mybinary, todo el objetivo queda satisfecho.

Los objetivos suelen ser solo archivos. El formato de un bloque es:

target: list of dependency files 
[tab]shell commands to build target if it's older than any of its dependencies 
[tab]more shell commands 
[tab]still more 

objetivos también se pueden especificar utilizando comodines, por ejemplo %.c significa lo que en la cáscara que se dice *.c.

Algunos objetivos son objetivos "falsos" lo que significa que no corresponden a ningún archivo real. El objetivo "todos" es de este tipo. También lo es el objetivo "limpio" (make clean). Y así. Realmente no necesita ni desea crear un archivo llamado "todo" o "limpio". Hay varias formas de especificar que un objetivo es falso.

El primer objetivo que aparecerá en el archivo Makefile es el que se invocará si simplemente escribe make. Una convención es nombrar a este objetivo como "todos". Entonces make será lo mismo que make all.

+0

Re "* necesita asegurarse de que mybinary es más nuevo que todos los archivos.o it.o depends.o y on.o *" ...; ¿Cómo se hace esto? ¿Se hace esto comparando el archivo de la última hora modificada? – Pacerier

+0

Sí, comparando los últimos tiempos modificados del archivo. De hecho, esto condujo a la creación de la herramienta UNIX 'táctil' cuyo propósito es simplemente actualizar la fecha de modificación de un archivo, para activar una compilación. –

2

A makefile generalmente incluirá código para hacer su programa, instalar su programa, limpiar después, y otras cosas.

lo que la palabra target Podría haber varias palabras clave, tales como all, install, clean, etc.

Es una forma de decir hacer algo . make all implica hacer todo

+3

Estrictamente, por supuesto, el comando '' make all' 'solo implica (declara) "hacer el trabajo necesario para asegurar que' all 'esté actualizado". Normalmente, las personas escriben el archivo MAKE para que haga la mayor parte de lo que desea (pero no realiza la instalación automáticamente, por ejemplo). Pero eso es solo una convención. –

5

Un 'objetivo de fabricación' es básicamente un archivo que desea reconstruir.

Make no puede adivinar lo que quiere construir, por lo que tiene que decirle, implícita o explícitamente, lo que debe construir. A menudo, el primer objetivo en el archivo es un nombre como 'todo' y si ejecuta 'make' sin ningún objetivo explícito, construirá el primer objetivo enumerado en el archivo MAKE. Sin embargo, algunos archivos MAKE no especifican ningún objetivo; entonces debes especificar uno en la línea de comando. O bien, si no desea que se genere el objetivo predeterminado, debe especificar el objetivo que desea generar.

Un destino también puede ser 'falso', en los términos de la marca GNU. Es decir, es un nombre que no existe, y las reglas no lo crean, pero (el objetivo falso) depende de una cantidad de otros archivos que sí tienen reglas asociadas. De hecho, el objetivo 'todos' suele ser un objetivo falso: no hay un archivo llamado 'todo' en la mayoría de los directorios.

1

make es una herramienta de desarrollo común, que comprueba las fechas de archivo entre los archivos de código fuente y el código objeto producido a partir de ellos, y compila el que la fuente es más reciente. Hace esto mediante el uso de un archivo, llamado makefile, que enumera los archivos que deben compararse.

La sintaxis estándar es make /f makefile myprog.exe

Eso dice a construir myprog.exe utilizando la lista de archivos en el archivo MAKE. El archivo MAKE predeterminado es makefile.mak, por lo que si usa ese nombre, no tiene que especificarlo en la línea de comando.

myprog.exe aquí se llama objetivo. Un truco es que podría poner en el archivo MAKE una lista de instrucciones de compilación para un archivo inexistente. Si luego dice construir ese objetivo, ejecutará esos comandos. A menudo, verá algo como make clean, que tiene un archivo temporal eliminado.

+0

significado "estándar"? – Pacerier

+0

Lo que significa que la mayoría de los programas 'make' aceptarán esa sintaxis para hacer lo que describí en el párrafo siguiente. Hay muchas variantes de 'make', así que no puedo hablar por todas ellas, pero la mayoría aceptará esa sintaxis. –

+0

¿Hay realmente algún "estándar" oficial recomendado para "hacer"? – Pacerier