GNU make bedingte Funktion $(, wenn ...) innerhalb einer benutzerdefinierten Funktion immer true ergibt

Ich versuche zu schreiben ein machen Funktion touch/eine leere Datei anlegen und/oder festlegen der Berechtigungen, Benutzer und Gruppen, wo möglich, oder warnen, wenn nicht. Aber jeder bedingte schauen Sie in meine Funktion scheint zu true ausgewertet werden.

Den essentials von meinem Makefile sind

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

Läuft make test Ausgänge

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)

Ich hab mir überlegt/versucht, die folgenden:

  • $(if ...) wird ausgewertet auf "compile-Zeit", bevor die Funktion mit einem parameter aufgerufen. Aber, die hart-codiert ifeq "foo" "bar" gibt auch ein ungültiges Ergebnis. Darüber hinaus $(info ...) richtig bewertet $(fileName) auf "compile-Zeit".
  • Die Dokumentation nicht wirklich geben Beispiele, so dass zusätzlich zu $(if ifeq...) ich auch versucht $(ifeq ...), das schien ignoriert zu werden.
  • "Nicht-funktionalen" if (d.h., die ifeq ohne die $(if...)) innerhalb einer Funktion gibt /bin/sh: ifeq: command not found.

Kann jemand helfen, herauszufinden, warum meine Bedingungen nicht verhält, wie ich erwarte (oder warum erwarte ich, dass die falsche Sache)?

Einschränkung: ich weiß, es gibt immer noch bugs, die ausgearbeitet werden, wenn die Datei nicht vorhanden ist, aber das sollte trivial sein, im Vergleich zu dieser Hürde.

  • Die GNU website, obwohl es schön aussieht, ist so lapidar, dass Sie fast sinnlos ist es nicht. Sie sagen, eine Funktion vorhanden ist, und nicht geben Sie irgendein Beispiel, wie man es verwenden, um so zu belästigen Sie mit ihm.
InformationsquelleAutor N13 | 2012-01-25
Schreibe einen Kommentar