2017-06-05 1 views
0

Je cette Makefile:/bin/sh: 1: Erreur de syntaxe: mot inattendu (attendre ")")

TMP_DIR := tmp 
RUN_OR_NOT := $(shell date '+%y%m%d%H%M') 

all: version 

version: 
    ifeq ($(shell test -d ${TMP_DIR} && echo -n "yes";),yes) 
     $(shell echo ${TMP_DIR} already exists ...) 
    else 
     $(shell mkdir -p ${TMP_DIR}) 
    endif 

Je veux d'abord vérifier, si le répertoire tmp existe ou non, et de le créer seulement, s'il n'existe pas. Cela fonctionne, mais avec une erreur étrange:

ifeq (yes,yes) 
/bin/sh: 1: Syntax error: word unexpected (expecting ")") 
Makefile:7: die Regel für Ziel „version“ scheiterte 
make: *** [version] Fehler 2 

Pourquoi cette erreur /bin/sh: 1: Syntax error: word unexpected (expecting ")") étrange? Et comment résoudre cela?

+0

Il semble que ce devrait juste être 'version: $ {TMP_DIR}' et $ {TMP_DIR}:; mkdir -p $ {TMP_DIR} '. – melpomene

+0

'mkdir -p' crée le répertoire seulement s'il n'existe pas déjà. – Beta

+0

FYI, le comportement de 'echo -n' n'est pas défini par POSIX (POSIX explicitement * autorise * un' echo' à modifier son comportement sur la base d'un drapeau '-n' - contrairement à' echo -e', qui est en violation s'il n'imprime pas '-e' sur la sortie - mais ne spécifie pas son comportement quand ce drapeau est donné). Pensez à utiliser 'printf% s foo' au lieu de' echo -n foo'. –

Répondre

5

Dans un fichier makefile, la recette est un script shell. Vous essayez de mettre des constructions comme ifeq dans votre recette. Make passera ceux à l'interpréteur de commandes et le shell lancera cette erreur car il ne comprend pas la syntaxe makefile.

Vous devez écrire votre recette en utilisant les scripts shell, pas la syntaxe makefile:

version: 
     if test -d ${TMP_DIR}; then \ 
      echo ${TMP_DIR} already exists ...; \ 
     else \ 
      mkdir -p ${TMP_DIR}; \ 
     fi 

Bien pourquoi vous souciez si le répertoire existe déjà, je ne sais pas; Je voudrais personnellement utiliser:

version: 
     mkdir -p ${TMP_DIR} 
+0

On peut ajouter: 'version: $ {TMP_DIR} \ n $ {TMP_DIR}: \ n mkdir $ {TMP_DIR}' aussi. (Le balisage de commentaire a mangé mes espaces, mais j'espère que vous savez ce que je veux dire) – ArturFH