2010-11-22 14 views
18

De acuerdo con lo que he leído sobre los archivos MAKE, un objetivo falso es cualquier objetivo que no se corresponda con un nombre de archivo real. Mi intuición dice que un directorio como objetivo se trataría igual que un archivo.En un archivo MAKE, ¿el nombre de un directorio es un objetivo falso o un objetivo "real"?

¿Por qué es esto importante? Tengo un directorio como objetivo en mi archivo MAKE. cuando lo tengo como un requisito previo para mi ejecutable principal, ese ejecutable siempre se realiza, independientemente de si todo está actualizado. Si lo saco como un requisito previo, mi archivo MAKE es lo suficientemente inteligente como para saber cuándo hay que construir cosas, pero tengo el problema de no saber si es necesario crear el directorio. De acuerdo con lo que he leído sobre make, cualquier objetivo falso no es bueno como prerrequisito porque make no sabe si está actualizado, por lo que siempre reconstruirá el objetivo asociado. Aquí hay un extracto de mi archivo MAKE.

$(EXEC_WITH_PATH): ${OBJ_DIR} $(DPEND) $(OBJS) 
    @echo "--------------------------------------------"; 
    @echo "$(THIS_DIR) $(MACHINE)"; 
    @echo "Linking Shared Library"; 
    @echo "ar -rc $(EXEC_WITH_PATH) INSERT::{OBJS}"; 
    ar -rc $(EXEC_WITH_PATH) $(OBJS); 
    @echo "--------------------------------------------"; 


# Make dirs for object code and links 
${OBJ_DIR} : 
     @if [ ! -d ${OBJ_DIR} ]; then \ 
       mkdir ${OBJ_DIR}; \ 
     fi; 

lo tanto, en este caso, es ${OBJ_DIR}, un nombre de directorio, un objetivo falso o no?

+1

de todos modos para resolver su problema, puede tener un comando mkdir precedido por un "-" de modo que haga ignorar el valor de retorno. – siukurnin

+4

@siukurnin: No, debe usar 'mkdir -p', para que tenga éxito si el directorio ya existe, pero falla correctamente si no se puede crear el directorio. – Cascabel

+0

Por lo que vale, creo que el problema es que el directorio es un requisito previo para el archivo que está en ese directorio. Por lo tanto, en la mayoría de los casos, el directorio de requisitos previos y el destino tienen la misma marca de tiempo, lo que hace que el objetivo se haga cada vez. – Chance

Respuesta

27

Editar: Esto solo se aplica a GNU make - una suposición justa dada la etiqueta "linux".

Su objetivo es un objetivo real, no uno de PHONY. El problema es que el directorio de salida se actualiza cuando pones objetivos en él para que siempre sea más nuevo que tu objetivo. Esto significa que su objetivo siempre se generará porque está desactualizado con respecto a sus dependencias.

Lo que necesita es un order-only prerequisite. Estos requisitos previos le permiten especificar que se debe compilar si no existe, pero no prestar atención a la marca de tiempo. Es decir, un objetivo no estará desactualizado con respecto a los requisitos previos de solo pedido.

Se especifica así:

$(EXEC_WITH_PATH): $(DPEND) $(OBJS) | ${OBJ_DIR} 
... 

Cualquier cosa después de la barra vertical es un requisito previo para-solamente.

Ahora puede hacer que su objetivo OBJ_DIR más simple:

${OBJ_DIR} : 
     mkdir -p ${OBJ_DIR} 

Nota: He usado la sintaxis ${OBJ_DIR} en lugar de $(OBJ_DIR) porque eso es lo que se utiliza.Los prerrequisitos de solo pedido no dependen de esa sintaxis.

+0

Terminé agregando otro objetivo, por lo que tengo el nuevo objetivo según $ (OBJ_DIR) y $ (EXEC_WITH_PATH), lo que parece funcionar. Sin embargo, tendré que verificar los requisitos previos de "solo orden". Gracias. – Chance

+1

Encontré el enlace aquí http://www.gnu.org/software/make/manual/make.html#Rerequisite-Types – Chance

+0

El problema con esto (parece) es que uno no puede tener un directorio que también sea un objetivo. Entonces, no puedo tener un objetivo de "depuración" y un directorio de "depuración" que necesito crear. – iheanyi

7

Es un objetivo real.

Los objetivos falsos no son detectados automáticamente por el sistema de marca; deben ser identificados por usted, utilizando el objetivo .PHONY.

objetivos falsos sensibles incluyen all y clean - éstos no corresponden a los archivos reales, pero a acciones que desea que el archivo MAKE hacer. Aquí es cómo explicar esto para hacer:

.PHONY: all clean install test 

Los directorios son objetivos legítimos de reglas makefile. No deberías hacer estos falsos.

mydir: 
    mkdir mydir 

El objetivo .PHONY es, por supuesto, falso.

Documentación de GNU se puede encontrar here.

Cuestiones relacionadas