Makefile и переменные оболочки - PullRequest
       7

Makefile и переменные оболочки

0 голосов
/ 01 декабря 2018

Я определяю переменную как это в моем make-файле

target:
         @for entry in ${FOLDERSS}      ; \
         do                                       \
            COUNT=$$(( $${COUNT}+1 ))   ; \
            if [ $$COUNT -eq 1 ] ; then  \
                FOLDERS="[ -s "             ; \
                aux=`echo $$entry`      ; \
                FOLDERS+=$$aux          ; \
            else                                  \
                FOLDERS+=" [ -s "       ; \
                aux=`echo $$entry`      ; \
                FOLDERS+=$$aux          ; \
                FOLDERS+=" ]"               ; \
            fi                              ; \
         done                              ; \
     FOLDERS+=" ]";\

"FOLDERSS" определяется вручную в моем Make-файле, содержащем все папки, которые мне нужно учитывать для компиляции.Теперь я хочу выполнить следующее:

deps: target
         ${AUTOGEN} -d $${FOLDERS}) -f ${AUTOCONF};\

, где AUTOGEN - это скрипт bash, а AUTOCONF - файл конфигурации.ПАПКИ должны записать именно то, что в них содержится, т.е. что-то вроде этого: [-s / home / at / src / folder1 [-s / home / at / src / folder2]] Так что в целом выполнение bashscript в моем make-файле должноиметь следующую команду:

./path/to/autogen -d [ -s /home/at/src/folder1 [ -s /home/at/src/folder2 ] ] -f /path/to/autoconfile

Если я набираю это вручную в make-файле, это работает, однако при использовании символа двойного доллара кажется, что он не может вычислить переменную FOLDERS.

У кого-нибудь есть предложения

1 Ответ

0 голосов
/ 01 декабря 2018

Это немного странная вещь, которую нужно хотеть, и очень сложный способ решения проблемы.Как это вместо этого?

folders := $(patsubst %,[ -s %,${FOLDERSS})\
    $(patsubst %, ],${FOLDERSS})

deps: target
    ${AUTOGEN} -d $(folders)-f ${AUTOCONF}

Мы объявляем переменную Make folders со значением ${FOLDERSS} со строкой [ -s, добавляемой перед каждым токеном, с последующим таким же числом ] закрывающих скобок.

Попытка использования массивов Bash требует, чтобы Make был специально настроен для использования Bash intead из sh;и вы не использовали правильный синтаксис для вызова значений массива.Переменные оболочки в любом случае не будут сохраняться между вызовами рецепта (если только вы не предпримете особые меры для форсирования этого поведения). бесполезное использование echo в обратных чертах в основном безвредно как таковое, но, тем не менее, является антипаттерном, которого вы хотите избежать.

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

...