2016-07-21 7 views
0

При попытке проверить отказ команды в Makefile (в данном случае jekyll build relative) переменная $$? должна содержать код выхода последней команды. При тестировании этот код показан как 127. Однако я хотел бы присвоить его переменной LAST_EXIT, так что следующий оператор if может проверить, была ли выполнена или не выполнена выполняемая команда.Как присвоить значение переменной в Makefile?

Проблема в том, что LAST_EXIT никогда не получает значение, назначенное ему, как показано в приведенном ниже коде. Любые предложения по устранению этой проблемы?

Код:

LAST_EXIT = 0 

all: 
    @echo "Building the website... Running command:" 
    - jekyll build relative || LAST_EXIT=$$? 
    - jekyll build relative || echo $$? and $(LAST_EXIT) 
ifeq ($(LAST_EXIT), 0) 
    #echo a message indicating success 

Выход:

jekyll build relative || LAST_EXIT=$? 
/bin/sh: jekyll: command not found 
jekyll build relative || echo $? and 0 
/bin/sh: jekyll: command not found 
127 and 0 

ответ

0

Есть две проблемы с вашим подходом.

1) Сделать разрешающим условные части файла makefile до того, как он выполнит какое-либо правило. Это:

all: 
    LAST_EXIT=0 
ifeq ($(LAST_EXIT), 0) 
    #echo a message indicating success 
endif 

не сообщит успех (если не установлено значение LAST_EXIT где-то выше правила).

2) Каждая команда в рецепте выполняется в своей собственной подоболочке; значения переменных оболочки являются не сохраняется от одной строки к следующему:

all: 
    LAST_EXIT=5; echo the value is $$LAST_EXIT 
    @echo now the value is $$LAST_EXIT 

Это должно работать:

all: 
    - jekyll build relative || LAST_EXIT=$$?; \ 
    if [ $$LAST_EXIT == 0 ]; then echo success!; fi 
+0

Спасибо за вашу помощь, я думаю, что я использую другую систему, чем вы в re, поэтому запуск кода Makefile привел к этой ошибке: '/ bin/sh: line 0: [: ==: unary operator expected' Я решил решить эту проблему, просто написав скрипт, который проверяет, установлен ли Jekyll или нет. Формат 'if ... fi' отлично работает в моем скрипте bash, хотя мне пришлось изменить тест равенства. –

0

Мое решение этой проблемы вызова следующий сценарий в Makefile, чтобы проверить Джекила : (называется ./{scriptName}

#!/bin/bash 

LINEBREAK="*****************************************************************" 
VERSION=0 

echo "Checking Jekyll..." 
VERSION=$(jekyll --version) 

if test "$?" == "0" 
then 
    echo "$VERSION is installed on this system..." 
else 
    echo "$LINEBREAK" 
    echo "Oops! It looks like you don't have Jekyll yet, lets install it!" 
    echo "Running command: \"sudo gem install jekyll\"" 
    echo "$LINEBREAK" 
    sudo gem install jekyll 
    if test "$?" != "0" 
    then 
      echo "$LINEBREAK" 
      echo "Jekyll install failed... It needs to be installed as a super-user on your system, which" 
      echo "requires your password. You can run \"sudo gem install jekyll\" yourself to install Jekyll." 
      echo "You can also see their website at: \"https://jekyllrb.com/docs/installation/\" for more information" 
      echo "$LINEBREAK" 
      exit 113 
    else 
      echo "$LINEBREAK" 
      echo "Jekyll has been installed on this system..." 
      echo "Proceeding to build..." 
      echo "$LINEBREAK" 
    fi 
fi 

exit 0 
Смежные вопросы