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 pascp -r
) - garantie de cohérence (i.e. si un fichier change en
images/
il doit être automatiquement mis à jour dansbuild/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 dersync
oucp -u
si possible
J'utilise GNU make, donc les trucs spécifiques à GNU sont autorisés.
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)