Comment copier un répertoire dans un Makefile?

j'ai un répertoire images/ que je veux copier build/images/ dans un Makefile. Le répertoire peut contenir plusieurs niveaux de sous-répertoires. Quelle serait la façon la plus élégante de le faire? Je veux:

  • éviter une copie complète du répertoire sur chaque make exécuter (c'est à dire pas cp -r)
  • garantie de cohérence (i.e. si un fichier change en images/ il doit être automatiquement mis à jour dans build/images/)
  • éviter de spécifier une règle pour chaque image et chaque sous-répertoire dans le fichier Makefile
  • résolvez le problème en make, donc pas de rsync ou cp -u si possible

J'utilise GNU make, donc les trucs spécifiques à GNU sont autorisés.

20
demandé sur Grumbel 2010-06-23 14:23:16

1 réponses

Eh bien, j'utiliserais juste rsync. make script que vous allez créer avec ces contraintes va juste répliquer sa fonctionnalité, et sera très probablement plus lent et peut contenir des bogues. Un exemple de règle pourrait ressembler à:

build/images:
    rsync -rupE images build/

.PHONY: build/images

(.Faux pour déclencher la règle à chaque fois).

peut-être des liens symboliques ou des liens durs peuvent-ils être utilisés à la place?

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

Si vous voulez vraiment éviter rsync et liens, Cette pièce les réimpose d'une façon ou d'une autre (non testé, a besoin find, mkdir et la plaine cp):

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

build: $(patsubst %,build/%,image_files)
28
répondu liori 2010-06-23 11:08:04