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
файл существует и т. д.).