GNU make conditionnelle fonction $(si ...) à l'intérieur d'une fonction définie par l'utilisateur prend toujours la valeur true
Je suis en train d'écrire une fonction de touche/créer un fichier vide et/ou définir les autorisations, d'utilisateur et de groupe, si possible, ou avertir si pas. Cependant, chaque contrôle conditionnel dans ma fonction semble avoir la valeur true.
L'essentiel de mon Makefile sont
INSTALL_USER := fileUser
INSTALL_GROUP := fileGroup
.PHONY: test
test:
$(call touchFile,~/test.ini)
define touchFile
$(eval fileName := $(strip $(1)))
-touch $(fileName)
-chmod -c 664 $(fileName)
$(info filename info $(fileName))
$(info $(shell stat -c "%a %U:%G" $(fileName)))
$(if ifeq "foo" "bar", @echo match is broken, @echo match works)
$(if ifneq "foo" "bar", @echo match works, @echo match is broken)
$(if ifneq ($(shell stat -c %a $(fileName)),664), $(warning Error - $(fileName) does not have expected permissions of 664))
-chgrp -c $(INSTALL_GROUP) $(fileName)
$(if ifneq ($(shell stat -c %G $(fileName)),$(INSTALL_GROUP)), $(warning Error - $(fileName) does not belong to $(INSTALL_GROUP) group))
-chown -c $(INSTALL_USER) $(fileName)
$(if ifneq ($(shell stat -c %U $(fileName)),$(INSTALL_USER)), $(warning Error - $(fileName) does not belong to $(INSTALL_USER) user))
endef
De course make test
sorties
filename info ~/test.ini
664 myUserName:myGroup
Makefile:7: Error - ~/test.ini does not have expected permissions of 664
Makefile:7: Error - ~/test.ini does not belong to common group
Makefile:7: Error - ~/test.ini does not belong to netserve user
touch ~/test.ini
chmod -c 664 ~/test.ini
match is broken
match works
chgrp -c fileGroup ~/test.ini
changed group of `/home/myUserName/test.ini' to fileGroup
chown -c fileUser ~/test.ini
chown: changing ownership of `/home/myUserName/test.ini': Operation not permitted
make: [test] Error 1 (ignored)
Que j'ai vu/essayé le suivant:
- $(si ...) est évalué à la "compilation", avant que la fonction est appelée avec un paramètre. Mais, codées en dur
ifeq "foo" "bar"
donne également un résultat non valide. En outre,$(info ...)
évalue correctement la$(fileName)
à "au moment de la compilation". - La la documentation n'est pas réellement donner des exemples, donc, en plus de
$(if ifeq...)
, j'ai aussi essayé$(ifeq ...)
, qui semble être ignoré. - "Non fonctionnel"
if
(c'est à dire, laifeq
sans$(if...)
) à l'intérieur d'une fonction donne/bin/sh: ifeq: command not found
.
Quelqu'un peut-il aider à identifier la cause de mes conditions ne sont pas se comporter comme prévu (ou pourquoi je m'attends à quelque chose de mal)?
Mise en garde: je sais qu'il y a encore des bugs à régler si le fichier n'existe pas, mais qui doit être négligeable par rapport à cet obstacle.
Le site web de GNU, même si il a l'air sympa, est de sorte succinct pour être presque inutile, n'est-ce pas. Ils vont vous raconter une fonction existe, et puis pas vous donner un exemple sur la façon de l'utiliser, de manière à vous harceler avec ça.
OriginalL'auteur N13 | 2012-01-25
Vous devez vous connecter pour publier un commentaire.
$(si ...)
conditionnel fonction évalue àtrue
quand le premier argument passé est non-vide. Dans votre cas la condition est littérale du texte:ifeq "foo" "bar"
, qui est, bien évidemment, non-vide.ifeq
/ifneq
conditions sont en fait des directives et non des fonctions. Ils ne peuvent pas être utilisés à l'intérieur de la définition des variables et des fonctions.Revenir à votre exemple, pour la chaîne de test pour l'égalité à l'intérieur de la condition d'utiliser des fonctions comme
filtre
etfindstring
:BTW, ce qui pourrait également être transformé en un en ligne forme pour une meilleure lisibilité:
merci!!!!
OriginalL'auteur Eldar Abusalimov
J'ai été confronté à ce problème et je l'ai trouvé, vous pouvez utiliser le résultat de la fonction "filtre" dans la "condition" de la partie "si" de la fonction. Voici un exemple utile pour l'ouverture d'un fichier pdf soit sous Linux (avec "evince"), ou dans OSX avec "open")
OriginalL'auteur user5122888
Vous semblez être de l'incompréhension de la façon
$(if
œuvres. De le faire les docs de l'info:Dans tous les exemples, votre état de santé est quelque chose comme
ifeq SOMETHING OTHERTHING
-- ce qui est une chaîne non vide (à partir de laifeq
indépendamment de ce que les autres choses sont), et est donc traitée comme vrai.OriginalL'auteur Chris Dodd
si vous voulez vérifier que votre version de l'OS est linux ou autre, et si c'est Linux, alors vous voulez imprimer une partie de message alors u pouvez suivre ces étapes:
avant j'ai essayé avec ifeq mais il a imprimé l'autre partie.
mon système d'exploitation est Linux, ubuntu.
Si quelqu'un a trouvé cette réponse devrait être modifié, de sorte qu'ils peuvent donner une meilleure réponse à cela aussi.
OriginalL'auteur amit pandya