Comment puis-je vérifier si le fichier existe dans le Makefile si je peux le supprimer?
Dans la partie propre de mon Makefile
je suis en train de vérifier si le fichier existe avant de le supprimer définitivement. J'ai utiliser ce code mais je recevoir des erreurs.
Quel est le problème avec elle?
if [ -a myApp ]
then
rm myApp
fi
J'obtiens ce message d'erreur
if [ -a myApp ]
/bin/sh: Syntax error: end of file unexpected (expecting "then")
make: *** [clean] Error 2
- Est myApp une variable ou un nom de fichier?
- monapp est pour myApplication c'est à dire le nom de fichier par le processus de construction.
- Si vous voulez juste pour éviter de faire barrage si le fichier n'existe pas,
rm -rf myApp
pourrait être une alternative. Ou précédant la commande avec un tiret (-rm myApp
) à faire pour faire ignorer l'erreur de rm (il sera cependant imprimer un vilain message). - Votre problème est que faire des traite chaque ligne dans une règle distincte de commande et envoie individuellement à la coque. C'est comme courir juste "si [ -a myApp]" sur son propre. Si vous obtenez cette erreur, vous avez besoin d'une solution qui a rejoint les lignes en un seul (à l'aide ) ou qui se termine avec chaque ligne indépendante de l'autre. Il ya maintenant plusieurs de ces ci-dessous.
Vous devez vous connecter pour publier un commentaire.
La deuxième réponse sommet mentionne
ifeq
, cependant, il ne mentionne que ceux-ci doivent être sur le même niveau que le nom de la cible, par exemple, pour télécharger un fichier seulement si il n'existe pas encore, le code suivant peut être utilisé:if fi
partie, je suppose qu'il était censé démontrer quelque chose d'autre, je ne sais pas trop comment il a fini dans la réponse, TBH. \_(ツ)_/C'est étrange de voir tant de gens à l'aide de scripts shell pour cela. Je cherchais un moyen d'utiliser le natif makefile syntaxe, parce que je suis en train d'écrire ceci en dehors de tout objectif. Vous pouvez utiliser le
wildcard
fonction pour vérifier si le fichier existe:Mise à jour:
J'ai trouvé un moyen qui est vraiment pour moi:
yum := $(shell { type yum; } 2>/dev/null)
et avecifdef
vous pouvez vérifier si la variable vide ou pas, et puis de définir quelque chose commeRHEL:=true
Makefile:133: *** unterminated call to function `wildcard': missing `)'. Stop.
$(wildcard pattern)
la réalité. Voir le lien.FILE_EXISTS := $(or $(and $(wildcard $(PATH_TO_FILE)),1),0)
directives only work if they're not indented
avec onglets. De Plus, ils courent au makefile analyse de scène, pas dans le "runtime" (cible de l'exécution de l'étape.Il peut avoir besoin d'une barre oblique à la fin de la ligne, pour la suite (bien que peut-être cela dépend de la version de make):
make
une nouvelle ligne serait une nouvelle commande bash. Le principal inconvénient de ce, autre que la contrariété d'avoir beaucoup de\
à la fin des lignes, c'est que chaque commande doit être dénoncé avec la;
qui autrement serait implicite dans bash.inside an action command
phase, alors que l' @holms réponse est de l'attaquer aumakefile parsing
phase. Donc, la réponse est la meilleure en fonction de ce que vous avez besoin.Le problème, c'est quand vous divisez votre commande sur plusieurs lignes. Ainsi, vous pouvez soit utiliser le
\
à la fin des lignes pour la suite comme ci-dessus ou vous pouvez tout mettre sur une seule ligne avec la&&
opérateur en bash.Ensuite, vous pouvez utiliser un
test
commande pour tester si le fichier n'existe pas, par exemple:ou ne le fait pas:
La
test
est équivalent à[
de commande.et il travail comme dans votre exemple original.
Voir:
help [
ouhelp test
pour plus de la syntaxe.-s
est un cas particulier pourexists and has a size greater than zero
. La question écrite est de taille agnostique, donc l'existence doit être vérifiée en utilisanttest -e
d'un fichier ou d'-d
pour un répertoire. Fichiers vides peuvent être particulièrement utiles en tant que par défaut d'un meilleur terme) indicateurs/les sentinelles, qui pourrait être tout à fait pertinent pourmake
.-f
par défaut, comme il est plus courant d'utiliser.test
sur Windows?|| true
à la fin si la commande retourne true si le fichier n'existe pas.||
, donc si-f
seront mis en échec n'existe pas (||
), puis de lancer la commande. Est-il judicieux?Ou tout simplement le mettre sur une seule ligne, comme
make
il aime:Manque un point-virgule
Cependant, je suppose que vous êtes la vérification de l'existence avant la suppression, pour éviter un message d'erreur. Si oui, vous pouvez simplement utiliser
rm -f myApp
qui "forces" supprimer, c'est à dire n'a pas d'erreur si le fichier n'existe pas.des résultats de l'exécution:
echo -n yes
changements de la réussite detest
dans la chaîneyes
sans NL. Leifeq
peut le comparer avec le codage en duryes
. Tous les parce queifeq
veut une chaîne de caractères à comparer à pas un succès, le statut d'une commande shell.Une solution en ligne:
Une solution en ligne avec l'erreur de l'action:
Exemple utilisé dans mon
make clean
directives:Et
make clean
fonctionne toujours sans aucun message d'erreur!-rm myfile
le chef de dash-dire faire d'ignorer les erreurs.Les réponses comme celle de @marc-wilkins à l'aide de \ continuer de lignes et de ; de les terminer dans la coque, ou comme ceux de @kenorb changer cela à l'un de ligne sont bon et va résoudre ce problème.
il y a une simple réponse au problème d'origine (comme @alexey-polonsky souligné). Utilisez l'option-f de rm, de sorte qu'il ne sera pas déclencher une erreur
c'est plus simple, plus rapide et plus fiable. Faut juste faire attention à ne pas finir avec une barre oblique et d'une variable vide
rm-f /$(myAppPath)#NE JAMAIS faire CELAvous pourriez finir par la suppression de votre système.
rm
à tous; BTW, je suis assez sûr querm -f /$(myAppPath)
de ne pas faire de dégâts, soit, parce que/
est un répertoire, et le-r
est manquant."Si README.md n'existe pas, ne rien faire (et à la sortie avec succès). Sinon, ajouter du texte à la fin."
Si vous utilisez
&&
au lieu de||
puis de générer une erreur si le fichier n'existe pas: