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, la ifeq 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