Подтвердить что ты не робот

Как скопировать каталог в Makefile?

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

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

Я использую GNU make, поэтому разрешено использование GNU.

4b9b3361

Ответ 1

Ну, я бы просто использовал 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 $< [email protected]

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