Как использовать команду оболочки в GNU Make для вывода строки - PullRequest
0 голосов
/ 21 июня 2019

У меня есть следующие строки в моем make-файле:

.PHONY : clean
clean:
    @echo "Running Clean"
    $(shell if [ -e exe ]; then rm exe; else echo "no files"; fi)

Когда я запускаю:

make clean

Я получаю следующий вывод на оболочке

Running Clean
no files
make: no: Command not found
Makefile:22: recipe for target 'clean' failed
make: *** [clean] Error 127

Есть предложения?

Ответы [ 2 ]

2 голосов
/ 21 июня 2019

Проблема в использовании $(shell ...). То, что вы хотите:

.PHONY : clean
clean:
    @echo "Running Clean"
    @if [ -e exe ]; then rm exe; else echo "no files"; fi

Что касается объяснения того, что идет не так - когда вы впервые запускаете чистую цель, make раскроет все переменные и функции make в рецептах до того, как начнет их запускать - потому что $(shell ...) имеет только одну $ это считается функцией make. Make запускает команду, которая выводит no files в stdout и заменяет вызов этой строкой, а затем начинает выполнение рецептов ... Итак, теперь make видит следующее:

clean:
    @echo "Running Clean"
    no files

Когда он пытается запустить no files, из-за отсутствия @ он выводит строку на экран, а затем передает команду оболочке. Поскольку оболочка не распознает ключевое слово no, она выводит ошибку, которую вы видите. В этом случае происходит самопроизвольный сбой, поскольку оболочка вернула ошибку.

0 голосов
/ 21 июня 2019

Привет всем, я тот же парень, который задал этот вопрос, но я нашел ответ сразу после того, как опубликовал это, думаю, я оставлю это (если только это не противоречит этикету stackoverflow) на случай, если у кого-то еще возникнут такие же проблемы,Моим решением было повторение строки в стандартный вывод.

$(shell if [ -e exe ]; then rm exe; else echo "no files" >&2; fi)
...