Встраивание bash-скрипта в make-файл - PullRequest
0 голосов
/ 29 ноября 2018

Я хочу включить условный оператор в make-файл:

SHELL=/bin/bash
all: 
        $(g++ -Wall main.cpp othersrc.cpp -o hello)
        @if [[ $? -ne -1 ]]; then \
          echo "Compile failed!"; \
          exit 1; \
        fi

Но получаю ошибку:

/ bin / bash: -c: строка 0: условный двоичный файложидается оператор / bin / bash: -c: строка 0: синтаксическая ошибка около -1' /bin/bash: -c: line 0: if [[-ne -1]];then \ 'makefile: 3: рецепт для цели' all 'не выполнен make: *** [all] Ошибка 1

Как это исправить?

1 Ответ

0 голосов
/ 29 ноября 2018

Обратите внимание, что каждая строка рецепта make-файла работает в отдельной оболочке, поэтому $? предыдущей строки недоступно, если вы не используете опцию .ONESHELL.

Aисправить без .ONESHELL:

all: hello
.PHONY: all

hello: main.cpp othersrc.cpp
    g++ -o $@ -Wall main.cpp othersrc.cpp && echo "Compile succeeded." || (echo "Compile failed!"; false)

с .ONESHELL:

all: hello
.PHONY: all

SHELL:=/bin/bash
.ONESHELL:

hello:
    @echo "g++ -o $@ -Wall main.cpp othersrc.cpp"
    g++ -o $@ -Wall main.cpp othersrc.cpp
    if [[ $$? -eq 0 ]]; then
        echo "Compile succeded!"
    else
        echo "Compile failed!"
        exit 1
    fi

Когда необходимо передать $ в команду оболочки, она должна быть заключена в кавычки $$ вmakefile (make взимает с вас доллар за прохождение одного доллара, в основном).Отсюда $$?.

...