Makefile: создание zip-файлов из всех вложенных папок

Я пытаюсь отойти от моего специального сценария сборки, который перебирает все дочерние элементы проекта и создает соответствующий zip-файл для каждого:

for i in */; do
    if [[ -d $i ]]; then
        echo "Processing folder $i";
        zip "${i%/}.zip" "$i"*.txt
        echo "Created ${i%/}.zip"
    fi
done;

Первая строка неуклюжа, но она просто перебирает все подкаталоги, кроме скрытых. Как видите, логика проста, но сделать это в Makefile без явного указания каждого подкаталога кажется трудным.

В идеале мы должны начать с:

project
  subdir1
    file1.txt
    file2.txt
  subdir2
    file3.txt

... и в итоге:

project
  subdir1
    file1.txt
    file2.txt
  subdir1.zip
  subdir2
    file3.txt
  subdir2.zip

Есть ли способ безопасно получить этот вид рекурсии из make?

редактировать: очистил базовый скрипт, спасибо Etan

1 ответ

Решение

Нечто подобное может делать то, что вы хотите.

SUBDIRS := $(wildcard */)
ZIPS := $(addsuffix .zip,$(subst /,,$(SUBDIRS)))

$(ZIPS) : %.zip : | %
    zip $@ $*/*.txt

dist: $(ZIPS)

Возможно, вам придется настроить предварительные условия для этого правила статического шаблона и т. Д., Чтобы получить правильное поведение при перестроении (оно должно определять, когда нужно перестраивать, если оно всегда перестраивается, если оно никогда не перестраивается, когда .zip файл существует и т. д.).

Другие вопросы по тегам