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., dieifeq
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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
$(, wenn ...)
- Funktion bedingte ausgewertettrue
wenn das erste übergebene argument, um es nicht leer ist. In den Fall ist der Zustand wörtliche text:ifeq "foo" "bar"
, die, offensichtlich, nicht leer ist.ifeq
/ifneq
- Bedingungen sind in der Tat Richtlinien, nicht Funktionen. Sie können nicht im inneren eingesetzt werden-variable definition und Funktionen.Zurück zu deinem Beispiel zu test-string für die Gleichheit in der Bedingung verwenden, Funktionen wie
- filter
undfindstring
:BTW auch dies könnte sich in ein inline-form für bessere Lesbarkeit:
Stand ich vor diesem problem und ich fand Sie verwenden können, das Ergebnis der "filter" - Funktion in den "Zustand" Teil von "wenn" - Funktion. Hier ein Beispiel, das nützlich für das öffnen einer pdf-Datei entweder in Linux (mit "evince") oder in OSX mit "öffnen")
Scheinen Sie zu sein Missverständnis der Art und Weise
$(if
funktioniert. Aus dem info-docs:In alle Ihre Beispiele, Ihre Bedingung ist so etwas wie
ifeq SOMETHING OTHERTHING
-- das ist ein nicht-leerer string ist (von derifeq
unabhängig davon, was die anderen Dinge sind), und so wird als true behandelt.wenn Sie überprüfen möchten, dass Ihre OS-version ist linux oder anderen und wenn es dann Linux, das Sie drucken möchten einige Nachricht dann u können, befolgen Sie diese Schritte:
bevor ich versuchte, mit ifeq aber es hat gedruckt, wird der else-Teil nur.
mein OS ist Linux ubuntu.
Wenn jemand fand diese Antwort sollte geändert werden, so können Sie eine bessere Antwort für das auch.