2010-06-23 24 views
19

Tengo un directorio images/ que quiero copiar al build/images/ desde un Makefile. El directorio puede contener múltiples niveles de subdirectorios. ¿Cuál sería la forma más elegante de hacer eso? Quiero:¿Cómo copiar un directorio en un Makefile?

  • evitar una copia completa del directorio en cada make plazo (es decir, sin cp -r)
  • consistencia garantizada (es decir, si un archivo ha cambiado en images/ debería actualizarse automáticamente en build/images/)
  • evitar especificar una regla para cada imagen y cada subdirectorio en el Makefile
  • resolver el problema dentro de make, por lo que no rsync o cp -u si es posible

Estoy usando GNU make, por lo que se permiten cosas específicas de GNU.

+1

Tome un vistazo a esto: http://stackoverflow.com/questions/2483182/recursive-wildcards-in-gnu-make/2483203#2483203 ('cp' en lugar de' convert') Pero personalmente creo que usar 'rsync' es más limpio y más robusto. –

Respuesta

27

Bueno, yo solo usaría rsync. Cualquier secuencia de comandos make que cree con estas restricciones simplemente duplicará su funcionalidad, y muy probablemente sea más lenta y pueda contener errores. Una regla de ejemplo podría verse:

build/images: 
    rsync -rupE images build/ 

.PHONY: build/images 

(.PHONY para activar la regla cada vez).

¿Tal vez se puedan usar enlaces simbólicos o enlaces duros en su lugar?

build/images: 
    ln -s ../images build/images 

Si realmente quiere evitar rsync y enlaces, esta pieza ellas reimplementa alguna manera (no probado, necesita find, mkdir y sencillo cp):

image_files:=$(shell find images -type f) 
build/images/%: images/% 
    mkdir -p $(@D) 
    cp $< [email protected] 

build: $(patsubst %,build/%,image_files) 
+2

Es posible que desee agregar un '--delete' al comando' rsync' para eliminar archivos cuando se eliminen del árbol de origen. – bitmusher

+0

rsync ignora '-E' si se usa' -p'. –

Cuestiones relacionadas