169 votes

Comment puis-je vérifier si le fichier existe dans Makefile afin de pouvoir le supprimer ?

Dans la section propre de mon Makefile, j'essaie de vérifier si le fichier existe avant de le supprimer définitivement. J'utilise ce code mais je reçois des erreurs.

Qu'est-ce qui ne va pas ?

 if [ -a myApp ]
 then
     rm myApp
 fi

Je reçois ce message d'erreur

 if [ -a myApp ]
 /bin/sh: Syntax error: end of file unexpected (expecting "then")
 make: *** [clean] Error 2

230voto

holms Points 1256

C'est étrange de voir autant de gens utiliser des scripts shell pour ça. Je cherchais un moyen d'utiliser la syntaxe makefile native, parce que j'écris ceci en dehors de toute cible. Vous pouvez utiliser la fonction wildcard pour vérifier si le fichier existe :

 ifeq ($(UNAME),Darwin)
     SHELL := /opt/local/bin/bash
     OS_X  := true
 else ifneq (,$(wildcard /etc/redhat-release))
     OS_RHEL := true
 else
     OS_DEB  := true
     SHELL := /bin/bash
 endif 

Mise à jour :

J'ai trouvé un moyen qui fonctionne vraiment pour moi :

ifneq ("$(wildcard $(PATH_TO_FILE))","")
    FILE_EXISTS = 1
else
    FILE_EXISTS = 0
endif

78voto

cnst Points 1699

La deuxième réponse en haut mentionne ifeq, cependant, il omet de mentionner que ce ifeq doit être au même niveau d'indentation dans le makefile que le nom de la cible, par exemple, pour télécharger un fichier seulement s'il n'existe pas actuellement, le code suivant pourrait être utilisé :

download:
ifeq (,$(wildcard ./glob.c))
    curl … -o glob.c
endif

# THIS DOES NOT WORK!
download:
    ifeq (,$(wildcard ./glob.c))
        curl … -o glob.c
    endif

54voto

Mark Wilkins Points 29291

Il peut avoir besoin d'une barre oblique à la fin de la ligne pour continuer (bien que cela dépende peut-être de la version de la marque) :

if [ -a myApp ] ; \
then \
     rm myApp ; \
fi;
       

34voto

Jeroen Points 4979

Ou mettez-le simplement sur une ligne, comme make l'aime :

if [ -a myApp ]; then rm myApp; fi;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X