Make con dependencias opcionales

Alvaro Herrera alvherre en alvh.no-ip.org
Lun Jun 25 09:51:57 CLT 2007


Hola,

¿Hay alguna manera de expresar en un Makefile que un archivo X depende
de un archivo Z, siempre y cuando el archivo Z exista, pero que si no
existe, entonces X debe construirse de todas maneras?

Mi idea es que el archivo X se construya con una determinada regla que
lleva "opciones por defecto", pero que si yo quiero cambiar las
opciones, entonces creo el archivo Z, le pongo las opciones que quiero,
y ejecuto Make nuevamente.

Sin embargo esto no funciona: porque si pongo que X depende de Z,
entonces Make no quiere hacer el archivo X cuando no existe Z.  ¿Alguna
idea de cómo expresar esto?



La explicación larga: yo tomo mis fotos en crudo (.NEF) y luego las
convierto a JPEG con dcraw.  La mayoría de las fotos las quiero
convertir con ciertas opciones que he determinado de antemano para todas
las fotos.  Pero a algunas pocas les quiero pasar opciones, como cambiar
el brillo o cambiar las opciones de balance de blancos.  Para eso, me
he hecho el siguiente Makefile:
(los archivos iniciales son DSC_NNNN.NEF donde NNNN es el numero de foto)
(hay otra regla que uso para generar .tiff pero eso no es relevante aquí)
(originalmente esto era un script en bash, pero lo convertí a un
makefile cuando tuve un procesador dual core con el cual quería procesar
más de una foto simultáneamente)

ALLNEFS = $(wildcard *.NEF)
ALLJPEGS = $(addprefix jpeg/,$(subst .NEF,.jpeg,$(ALLNEFS)))

all: $(ALLJPEGS)

jpeg/%.jpeg: %.NEF
	dcraw -v -c -w -t 0 `cat $$(basename $< .NEF).opt 2>/dev/null` $< | \
		cjpeg -progressive -quality 85 -dct float -outfile $@
	exiftool -overwrite_original -TagsFromFile $< $@


No creo que quede inmediatamente claro, pero aca lo que se hace es tomar
el archivo DSC_NNNN.opt en caso de que exista, y sobreescribir las
opciones por defecto.  Sin embargo, cuando yo cambio el archivo .opt y
"recompilo" el .jpeg, Make me dice 

make: `jpeg/DSC_2694.jpeg' está actualizado.

porque no sabe que ese archivo depende del .opt :-(

¿Cómo se hace esto; alguna idea??   Ya revisé gran parte del manual (non
free) de Make pero no encuentro nada relevante.

Muchas gracias,

-- 
Alvaro Herrera                 http://www.amazon.com/gp/registry/DXLWNGRJD34J
"Just treat us the way you want to be treated + some extra allowance
 for ignorance."                                    (Michael Brusser)


Más información sobre la lista de distribución Linux