2009-12-08 8 views
43

Je veux détecter une condition dans mon makefile où un outil est la mauvaise version et forcer le make to fail avec un message d'erreur indiquant que l'élément n'est pas la bonne version.Comment forcer une erreur dans un fichier gnumake

Quelqu'un peut-il donner un exemple de cela?

J'ai essayé ce qui suit, mais ce n'est pas la bonne syntaxe:

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

Merci.

+0

Vous voudrez peut-être pour vérifier cela par rapport à 1.4, j'ai 1.4.4 installé et la sortie '--version' contient beaucoup plus que le numéro de version Essayez quelque chose comme' ifeq "$ (shell svn --version | sed -nE -e '/ version/s /^.* ([0-9] + \. [0-9] \ +) \ .. * $$/\ 1/p ') "" 1.4 "' à la place –

+0

Mon sed n'accepte pas le -E: "sed: option invalide - E" – WilliamKF

+1

Faut-il faire? J'ai tendance à écrire ces tests dans configure. –

Répondre

54

De l'manual:

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

Cela se traduira par make à une erreur fatale:

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

En guise de note, je voulais sortir un message d'erreur multiligne. , vous pouvez 'définir err_mesg = mesage d'erreur multiline ... endef', et ensuite,' $ (erreur $ (err_mesg)) '.Faire gardera et sortira' err_mesg' comme il a été écrit – Alberto

+0

Piège mineur: si dehors d'une recette, il ne peut pas y avoir d'espace avant le '$' –

3

Les besoins conditionnels une attention aussi.

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

Alors que $ (erreur ... travaux, parfois il est plus facile d'utiliser une règle qui ne

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 

Ensuite, vous faites test_svn_version une condition sine qua non de votre cible de haut niveau.

+0

Cela ne fonctionne pas, je reçois: /bin/sh: -c: ligne 0: EOF inattendue lors de la recherche de correspondant ') ' /bin/sh : -c: ligne 1: erreur de syntaxe: fin inattendue de fi le – WilliamKF

+1

@WilliamKF - Il y a un espace parasite après un \ à la fin d'une ligne qui cause ce problème. J'ai également réparé le disparu | –