Pregunta

Estoy jugando con los archivos Make y la variable VPath. Básicamente, estoy tomando archivos fuente de algunos lugares diferentes (especificados por el VPath), y compilarlos en el directorio actual utilizando simplemente una lista de .o-archivos que quiero.

Hasta ahora todo bien, ahora estoy generando información de dependencia en un archivo llamado '.depend' e incluyendo eso. Gnumake intentará usar las reglas definidas hasta ahora para crear el archivo incluido si no existe, por lo que está bien. Básicamente, mi Makefile se ve así.

VPATH=A/source:B/source:C/source

objects=first.o second.o third.o

executable: $(objects)

.depend: $(objects:.o=.c)
    $(CC) -MM $^ > $@

include .depend

Ahora, para la verdadera pregunta, ¿puedo suprimir la generación del archivo .depend de alguna manera? Actualmente estoy trabajando en un entorno de Clearcase -> Sloooow, por lo que preferiría tenerlo un poco más bajo control cuándo actualizar la información de dependencia.

Es más o menos un ejercicio académico, ya que podría envolver la cosa en un script que está tocando el archivo .depend antes de ejecutar Make (por lo que lo hace más reciente que cualquier archivo fuente), pero sería interesante saber si de alguna manera puedo de alguna manera Suprimirlo usando la marca 'pura'.

No puedo eliminar la dependencia a los archivos de origen (es decir, usando simplemente .depend:), ya que estoy dependiendo del $^ variable para hacer la resolución VPath por mí.

Si hubiera alguna forma de actualizar solo las dependencias como resultado de actualizado #include directivas, eso sería incluso mejor, por supuesto ... pero no estoy conteniendo la respiración por eso ... :)

¿Fue útil?

Solución

Si no quieres rehacer. Depender cada vez, no debes tener una regla para ello. Tenga en cuenta que siempre que realmente necesite rehacer el archivo de dependencias, también debe rehacer un archivo de objeto (este no es mi idea, proviene de Generación avanzada de auto dependencia, y me tomó algo de tiempo agarrarlo). Entonces, construya .de depender en la regla de enlace, utilizando un objetivo falso:

DEPEND_FILE = .depend
# put this command in the executable rule
    $(MAKE) DEPENDENCIES

.PHONY: DEPENDENCIES
DEPENDENCIES: $(objects:.o=.c)
    $(CC) -MM $^ > $(DEPEND_FILE)

-include $(DEPEND_FILE)

Puede hacer que las cosas sean más eficientes al tener archivos dependientes separados, uno para cada objeto, de modo que cuando uno cambie no tenga que recalcular las dependencias de todos los objetos:

# put this command in the %.o rule
    $(CC) -MM $< > $*.d

-include *.d

(Editar: Acabo de corregir un error tonto).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top