Запуск команд оболочки в GNUmakefile - PullRequest
0 голосов
/ 20 апреля 2020

У меня есть требование для запуска цели относительно пользовательского ввода. В настоящее время в наших make-файлах мы запускаем правило, если каталог существует. Я пытаюсь обновить наш make-файл, чтобы проверить пользовательский ввод и запустить его вместо запуска цели для всех доступных папок (папка = проект).

моя структура каталогов выглядит так: -

/home/ravi/build/test/usb/usb.trm
/home/ravi/build/test/flash/flash.trm .... 

Вот мое правило: -

$(TGTBUILD)/%f.c: $(CURDIR)/test/%.trm
    str=$*; \
    IFS='/'; \
    read -ra ADDR <<< "$$str";   \
    for i in "$${ADDR[@]}"; do \
      value=$$i;  \
      break;   \
    done;  \
    if [[ $(PROJECTS) == *$$value* ]]; then \
      $(test_c) \
    fi  

$(PROJECTS) переменная имеет заданные пользователем проекты во время выполнения. Я дал usb при запуске make-файла. Так что makefile должен запускаться только для проекта usb, а не для проекта flash. Чтобы добиться того же самого, я сделал вышеупомянутое изменение в правиле, чтобы проверить, выполняется ли правило только для заданных пользователем проектов.

У меня возникает следующая проблема: -

   str=cdn_ahb/cdn_ahb; \
    IFS='/'; \
    read -ra ADDR <<< "$str";   \
    for i in "${ADDR[@]}"; do \
        value=$i;  \
        break;   \
    done;  \
    if [[ ccix == *$value* ]]; then \
    mkdir -p /home/ravi/workspace/client_test/build/Release/project/usb
    /bin/sh: -c: line 9: syntax error: unexpected end of file

Что-то не так? с моим синтаксисом? Или не могли бы вы предложить мне другой способ выполнить мое требование?

1 Ответ

0 голосов
/ 20 апреля 2020

По крайней мере, здесь это подозрительно: вам нужно запятую после value=i и done; плюс fi для завершения if. Тогда

str = $*

завершится неудачно, потому что в назначении переменной оболочки не должно быть пробелов. Я предлагаю str="$*"; вместо этого. Обратите внимание, в частности, на точку с запятой, потому что такие элементы, как

FOO=bar echo "$FOO"

НЕ будут отображать строку эха, а

FOO=bar; echo "$FOO"

. Затем value=i должно быть value=$$i, а *$value* должно быть *$$value*, поскольку make в противном случае будет думать, что вы ссылаетесь на переменную make , когда вы имели в виду переменную shell .

Кроме этого, ваша сборка выглядит слишком сложной. Время реорганизовать сборку для упрощения c. Сборка, требующая пользовательского ввода, является мерзостью (не может запустить ее из cron, не может запустить ее из-за непрерывной интеграции, нуждается в говорящей обезьяне) Вы должны параметризовать вашу сборку с помощью переменной make, чтобы вы могли сказать

 make BUILD=usb   # or BUILD=flash or whatever.

Может быть, этот GNUmakefile намного проще:

test_c = echo testing...

$(TGTBUILD)/%f.c: $(CURDIR)/test/%.trm
ifeq (${BUILD},usb)
        $(test_c)
else
        echo BUILD is not usb
endif
...