2010-03-25 22 views

Respuesta

79

Una compilación, como lo entiende Makefile, consiste en una gran cantidad de objetivos. Por ejemplo, para construir un proyecto que pueda necesitar

  1. Construir file1.o de Archivo1.c
  2. Construir file2.o de Archivo2.c
  3. Construir file3.o de Archivo3.c
  4. Construir executable1 de file1.o y file3.o
  5. Construir executable2 de file2.o

Si implementa este flujo de trabajo con el makefile, que podrían hacer que cada uno de los objetivos separatel y Por ejemplo, si escribió

make file1.o 

, solo compilaría ese archivo, si fuese necesario.

El nombre de all no es fijo. Es solo un nombre convencional; all target denota que si lo invoca, make compilará todos lo que se necesita para hacer una compilación completa. Suele ser un objetivo ficticio, que no crea ningún archivo, sino que simplemente depende de los otros archivos. Para el ejemplo anterior, construir todo es construir compilables, los demás archivos se extraen como dependencias. Así que en el makefile que tiene este aspecto:

all: executable1 executable2 

all objetivo suele ser el primero en el makefile, ya que si se acaba de escribir make en línea de comandos, sin especificar el destino, se va a construir el primer objetivo. Y espera que sea all.

all suele ser también un objetivo .PHONY. Conozca más here.

2

No estoy seguro de que represente algo especial. Es solo una convención que usted proporciona una regla de 'todos', y generalmente se usa para enumerar todos los objetivos secundarios necesarios para construir todo el proyecto, de ahí el nombre 'todos'. Lo único especial es que muchas veces la gente lo ubicará como el primer objetivo en el archivo MAKE, lo que significa que escribir 'make' solo hará lo mismo que 'make all'.

1

El objetivo "todos" es un ejemplo de un objetivo ficticio: no hay nada en el disco llamado "todos". Esto significa que cuando haces un "make all", siempre cree que necesita construirlo, y así ejecuta todos los comandos para ese objetivo. Esos comandos generalmente serán los que construirán todos los productos finales que el archivo MAKE conoce, pero podrían hacer cualquier cosa.

Otros ejemplos de objetivos ficticios son "limpiar" e "instalar", y funcionan de la misma manera.

Si aún no lo ha leído, debería leer el GNU Make Manual, que también es un excelente tutorial.

+0

Y no se olvide de Mr.Proper (incidentalmente mrproper) y distclean ... – t0mm13b

18

El manual de GNU Make da una definición clara para all en su list of standard targets.

Si el autor del Makefile está siguiendo la convención de que entonces el objetivo all debe:

  1. Compilar el programa entero, pero no construye la documentación.
  2. ser el blanco del defecto. Al igual que en el correr solo make debería hacer lo mismo que make all.

Para lograr 1 all se define típicamente como un objetivo .PHONY que depende del ejecutable (s) que forman la totalidad del programa:

.PHONY : all 
all : executable 

Para lograr 2 all o bien debe ser el primer objetivo se define en el archivo make o se le asignará como el objetivo predeterminado:

.DEFAULT_GOAL := all