Как я могу записать содержимое переменной makefile в файл, не вызывая команду оболочки?
Проблема заключается в том, что содержимое переменной возможно дольше, чем оболочка допускает команду (т. Е. Дольше, чем символы MAX_ARG_STRLEN (131072)).
В частности, в make-файле у меня есть переменная, содержащая длинный список имен файлов для обработки (включая их абсолютные пути для сборок вне исходного кода). Теперь мне нужно записать эти имена файлов во (временный) файл, который затем я могу передать другой команде.
До сих пор у нас было такое правило ($COLLATED_FILES
- это переменная, содержащая пути):
$(outdir)/collated-files.tely: $(COLLATED_FILES)
$(LYS_TO_TELY) --name=$(outdir)/collated-files.tely --title="$(TITLE)" \
--author="$(AUTHOR)" $^
Это ломается, если COLLATED_FILES
длиннее, чем около 130000 символов, мы получаем сообщение об ошибке:
make[2]: execvp: /bin/sh: Argument list too long
В качестве решения мы сейчас пытаемся записать содержимое переменной в файл и использовать этот файл в команде $(LYS_TO_TELY)
. К сожалению, я еще не нашел способ сделать это без вызова оболочки.
Мои попытки включают в себя:
$(outdir)/collated-files.list: $(COLLATED_FILES)
echo "" > $@
$(foreach f,$^,echo $f >> $@;)
Но это также вызывает сразу все echo
команды в оболочке, поэтому команда оболочки такая же длинная.
Есть ли способ записать содержимое $(COLLATED_FILES)
в файл на диске, не передавая его в командной строке команде оболочки?
Я также искал, смогу ли я передать содержимое переменной в оболочку, но я также не смог ничего найти в этом направлении ...