template extension clean c++ linux makefile

c++ - extension - makefile java



En un archivo make, ¿es un nombre de directorio un objetivo falso o un objetivo "real"? (2)

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

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

Lo que necesita es un requisito previo de solo pedido . Estos requisitos previos le permiten especificar que debe construirse 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.

Lo especificas así:

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

Cualquier cosa después de la barra vertical es un requisito previo de solo pedido.

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

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

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

Según lo que he leído sobre makefiles, un objetivo falso es cualquier objetivo que no corresponda a un nombre de archivo real. Mi intuición dice que un directorio como destino se trataría igual que un archivo.

¿Porque es esto importante? Tengo un directorio como destino en mi makefile. cuando lo tengo como un prerrequisito para mi ejecutable principal, ese ejecutable siempre se crea, esté o no todo actualizado. Si lo tomo como un requisito previo, mi makefile es lo suficientemente inteligente como para saber cuándo se deben construir las cosas, pero tengo el problema de no saber si es necesario crear el directorio. De acuerdo con lo que he leído sobre make, los objetivos falsos no son buenos como prerrequisitos porque make no sabe si están actualizados, por lo que siempre reconstruirán el objetivo asociado. Aquí hay un extracto de mi makefile.

$(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;

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


Es un objetivo real.

Los objetivos falsos no son detectados automáticamente por el sistema make, deben ser identificados por ti, usando el objetivo .PHONY .

Los objetivos falsos y sensatos incluyen all y están clean , no corresponden a archivos reales, sino a acciones que desea que haga el makefile. Aquí es cómo explicar esto para hacer:

.PHONY: all clean install test

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

mydir: mkdir mydir

El objetivo de .PHONY es, por supuesto, falso.

La documentación de GNU se puede encontrar here .