Создайте файл из большой переменной Makefile - PullRequest
3 голосов
/ 04 февраля 2009

У меня есть список объектов в переменной Makefile с именем OBJECTS, который слишком велик для буфера команд. Поэтому я использую следующий метод для создания файла со списком объектов (для передачи в ar):

objects.lst:
    $(foreach OBJ,$(OBJECTS),$(shell echo "$(OBJ)">>$@))

Хотя это работает, оно работает очень медленно (по крайней мере, на Cygwin), и мне не нравится полагаться на команды оболочки и перенаправление.

Кроме того, foreach не предназначен для этой цели - он оценивается перед выполнением любых команд, что означает, что я не могу, например, rm -f objects.lst перед добавлением.

Есть ли лучший способ? Я не хочу использовать добавочное архивирование, поскольку это вызывает проблемы с несколькими заданиями.

Единственное, о чем я могу думать, - это синтаксический анализ файла Makefile с помощью отдельного сценария для чтения списка объектов или сохранения списка объектов в отдельном файле. Оба решения имеют свои собственные проблемы.

Ответы [ 4 ]

1 голос
/ 05 февраля 2009

В следующем примере я также заменил echo простым скриптом Perl, чтобы разбить аргументы на новые строки, но это и есть суть ..

objects.lst:
    echo $(wordlist 1,99,$(OBJECTS))>$@
    echo $(wordlist 100,199,$(OBJECTS))>>$@
    echo $(wordlist 200,299,$(OBJECTS))>>$@
    echo $(wordlist 300,399,$(OBJECTS))>>$@
    ...
1 голос
/ 04 февраля 2009

Попробуйте что-то вроде:

OBJECTS:=a b c d
objects.lst:
        echo > $@ <<EOF      $(OBJECTS)

т.е. использовать функциональность <<EOF, встроенную в оболочку. У него нет ограничений по максимальной длине.

0 голосов
/ 28 января 2012

Вот патч для gnu make, который позволяет напрямую записывать переменную в файл. Он создает новую функцию 'writefile', аналогичную существующей функции 'info', за исключением того, что он принимает аргумент имени файла и записывает в файл:

https://savannah.gnu.org/bugs/?35384

0 голосов
/ 04 февраля 2009

Как насчет этого:

OBJECTS_AM=$(filter a% b% c% d% e% f% g% h% i% j% k% l% m%,$(OBJECTS))
OBJECTS_NZ=$(filter-out a% b% c% d% e% f% g% h% i% j% k% l% m%,$(OBJECTS))

objects.lst:
$(shell echo "$(OBJECTS_AM)">$@)
$(shell echo "$(OBJECTS_NZ)">>$@)

Возможно, вам придется разделить его еще один или два раза, но это не так уж и плохо, тем более что распределение имен файлов не так часто меняется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...