2009-12-08 2 views
43

Я хочу обнаружить условие в своем make-файле, где инструмент является неправильной версией, и заставить make сбой с сообщением об ошибке, указывающим, что элемент не является правильной версией.Как заставить ошибку в файле gnumake

Может ли кто-нибудь привести пример?

Я попытался следующие, но это не правильный синтаксис:

ifeq "$(shell svnversion --version | sed s/[^0-9\.]*://)" "1.4" 
$error("Bad svnversion v1.4, please install v1.6") 
endif 

Спасибо.

+0

Вы можете чтобы проверить это на 1.4. У меня установлен 1.4.4, а вывод '--version' содержит намного больше, чем номер версии. Попробуйте что-то вроде' ifeq '$ (shell svn -version | sed -nE -e'/version/s /^.* ([0-9] + \. [0-9] \ +) \ .. * $$/\ 1/p ') "" 1.4 "вместо –

+0

My sed не принимает -E: «sed: недействительный вариант - E» – WilliamKF

+1

Нужно ли это делать? Я предпочитаю писать эти тесты в configure. –

ответ

54

Из manual:

$(error Bad svn version v1.4, please install v1.6) 

Это приведет make к фатальной ошибке:

$ make 
Makefile:2: *** Bad svn version v1.4, please install v1.6. Stop. 
+2

В качестве примечания я хотел вывести многострочное сообщение об ошибке. , вы можете 'define err_mesg = ваш multiline error mesage ... endef', а затем' $ (error $ (err_mesg)) '. Make будет хранить и выводить' err_mesg', как было написано. – Alberto

+0

Незначительная ловушка: если снаружи из рецепта, перед '' ' –

3

условные потребности некоторое внимание тоже.

 
ifeq ($(shell svnversion --version | sed s/[^0-9\.]*://), 1.4) 
    $(error Bad svnversion v1.4, please install v1.6) 
endif 
6

В то время как $ (ошибка ... работ, иногда его проще использовать правило, которое терпит неудачу

test_svn_version: 
     @if [ $$(svn --version --quiet | \ 
       perl -ne '@a=split(/\./); \ 
          print $$a[0]*10000 + $$a[1]*100 + $$a[2]') \ 
       -lt 10600 ]; \ 
     then \ 
      echo >&2 "Svn version $$(svn --version --quiet) too old; upgrade to v1.6"; 
      false; \ 
     fi 

Тогда вы сделаете test_svn_version необходимым условием вашей цели верхнего уровня.

+0

не может быть пробела. Это не работает. Я получаю: /bin/sh: -c: строка 0: неожиданный EOF при поиске соответствия') ' /bin/sh : -c: строка 1: синтаксическая ошибка: неожиданный конец fi le – WilliamKF

+1

@WilliamKF - есть ложное пространство после \ в конце строки, которая вызывает эту проблему. Я также исправил недостающие | –

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