Как скопировать каталог в Makefile? - PullRequest
20 голосов
/ 23 июня 2010

У меня есть каталог images/, который я хочу скопировать в build/images/ из Makefile. Каталог может содержать несколько уровней подкаталогов. Что было бы самым элегантным способом сделать это? Я хочу:

  • избегать полной копии каталога при каждом make запуске (т. Е. Нет cp -r)
  • гарантированная согласованность (т. Е. Если файл был изменен в images/, он должен автоматически обновляться в build/images/)
  • избегайте указания правила для каждого изображения и каждого подкаталога в Makefile
  • решить проблему в make, поэтому не rsync или cp -u, если возможно

Я использую GNU make, поэтому разрешено использовать специфические для GNU вещи.

1 Ответ

29 голосов
/ 23 июня 2010

Ну, я бы просто использовал rsync.Любой сценарий make, который вы создадите с этими ограничениями, будет просто копировать его функциональность, и, скорее всего, будет медленнее и может содержать ошибки.Пример правила может выглядеть следующим образом:

build/images:
    rsync -rupE images build/

.PHONY: build/images

(.PHONY для запуска правила каждый раз).

Может быть, вместо него можно использовать символические или жесткие ссылки?

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

Если вы действительно хотите избежать rsync и ссылок, эта часть каким-то образом повторно их реализует (не проверено, нужны find, mkdir и обычные cp):

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

build: $(patsubst %,build/%,$(image_files))
...