2010-04-14 29 views
19

que tienen un Makefile que tiene este aspecto¿Cómo incluir un objetivo limpio en Makefile?

CXX = g++ -O2 -Wall 

all: code1 code2 

code1: code1.cc utilities.cc 
    $(CXX) $^ -o [email protected] 

code2: code2.cc utilities.cc 
    $(CXX) $^ -o [email protected] 

Lo que quiero hacer ahora es incluir clean target para que cada vez corro make se eliminará automáticamente los archivos binarios existentes de code1 y code2 antes de crear el nuevos.

traté de poner estas líneas al final del archivo MAKE, pero no funciona

clean: 
    rm -f [email protected] 
    echo Clean done 

Cuál es la forma correcta de hacerlo?

Respuesta

16

En lenguaje de archivo [email protected] significa "nombre del objetivo", por lo que rm -f [email protected] se traduce en rm -f clean.

es necesario especificar a rm qué es exactamente lo que quiere borrar, como rm -f *.o code1 code2

28

Lo mejor es, probablemente, para crear una variable que contiene los binarios:

binaries=code1 code2 

luego usar ese en el all -target, para evitar repetir:

all: clean $(binaries) 

Ahora, puede utilizar esto con el clean -target, también, y sólo tiene que añadir algunos globos para atrapar archivos de objetos y cosas:

.PHONY: clean 

clean: 
    rm -f $(binaries) *.o 

Nota uso del .PHONY para hacer un cleanpseudo-target. Esta es una función de creación de GNU, por lo que si necesita ser portátil para otras implementaciones de make, no lo use.

+7

+1 para '.PHONY' (que es un GNU-ismo, pero Mayormente inofensivo en otros lugares). Sin embargo, es una mala idea poner 'clean' como una dependencia de' all'; eso aumenta el tiempo de construcción y el ruido. Es mejor definir todas las dependencias * reales * para que los cambios en la fuente se propaguen exactamente tanto como sea necesario. –

2

Por la forma en que está escrito, limpia regla se invoca sólo si se llama explícitamente:

que la limpieza sea

Creo que es mejor, que hacen limpia cada vez. Si desea hacer esto a su manera, intente esto:

 
CXX = g++ -O2 -Wall 

all: clean code1 code2 

code1: code1.cc utilities.cc 
    $(CXX) $^ -o [email protected] 

code2: code2.cc utilities.cc 
    $(CXX) $^ -o [email protected] 

clean: 
    rm ... 
    echo Clean done 
+0

Como qrdl explicó, esto está mal. "rm -f $ @" se convierte en "rm -f clean", lo que no funcionaría. –

+0

No downvote, pero generalmente esta es una mala idea. Todo lo que no sea un proyecto muy pequeño requiere cierto tiempo para construir desde cero, y realmente no desea tener que esperar tanto tiempo cada vez que haya realizado un pequeño cambio. –

+0

bjarkef: a la derecha, acabo de responder a la parte de auto-borrar. Thomas Padron-McCarthy: de acuerdo, y esto está escrito en mi post. –

Cuestiones relacionadas