GNU macht bedingte Funktion $ (if ...) innerhalb einer benutzerdefinierten Funktion wird immer als wahr ausgewertet

7

Ich versuche, eine make-Funktion zu schreiben, um eine leere Datei zu berühren / zu erstellen und / oder die Berechtigungen, den Benutzer und die Gruppe, wenn möglich, zu setzen oder zu warnen, falls nicht. Jedoch scheint jede bedingte Überprüfung innerhalb meiner Funktion wahr zu sein.

Das Wesentliche an meinem Makefile ist

%Vor%

Ausführen von make test outputs

%Vor%

Ich habe folgendes versucht / versucht:

  • $ (wenn ...) wird zur "Kompilierzeit" ausgewertet, bevor die Funktion mit einem Parameter aufgerufen wird. Aber das hartcodierte ifeq "foo" "bar" gibt auch ein ungültiges Ergebnis. Darüber hinaus bewertet $(info ...) korrekt $(fileName) bei "Kompilierzeit".
  • Die Dokumentation enthält keine Beispiele, also zusätzlich zu $(if ifeq...) , ich habe auch $(ifeq ...) ausprobiert, was anscheinend ignoriert wurde.
  • "Nicht funktional" if (d. h. ifeq ohne $(if...) ) innerhalb einer Funktion ergibt /bin/sh: ifeq: command not found .

Kann jemand helfen zu erkennen, warum meine Kondition nicht so ist, wie ich es erwarte (oder warum ich das falsche Ding erwarte)?

Vorbehalt: Ich weiß, dass es noch Fehler gibt, die ausgearbeitet werden müssen, wenn die Datei nicht existiert, aber das sollte im Vergleich zu dieser Hürde trivial sein.

    
N13 25.01.2012, 19:07
quelle

4 Antworten

31

$(if ...) bedingte Funktion wird beim ersten als true ausgewertet Das Argument ist nicht leer. In Ihrem Fall ist die Bedingung ein Literaltext: ifeq "foo" "bar" , der offensichtlich nicht leer ist.

ifeq / ifneq conditionals sind in der Tat Richtlinien, funktioniert nicht. Sie können nicht innerhalb der Variablendefinition und in Funktionen verwendet werden.

Zurück zu Ihrem Beispiel, um die Zeichenfolge für die Gleichheit innerhalb der Bedingung zu testen, verwenden Sie Funktionen wie filter und findstring :

%Vor%

BTW könnte zur besseren Lesbarkeit auch in ein Inline-Formular umgewandelt werden:

%Vor%     
Eldar Abusalimov 25.01.2012, 19:24
quelle
4

Ich habe dieses Problem erkannt und festgestellt, dass Sie das Ergebnis der "Filter" -Funktion im "Bedingung" -Teil der "if" -Funktion verwenden können. Hier ist ein Beispiel, das nützlich ist, um ein PDF entweder unter Linux (mit "evince") oder in OSX mit "open" zu öffnen.

%Vor%     
user5122888 16.07.2015 09:18
quelle
1

Sie scheinen die Arbeitsweise von $(if falsch zu verstehen. Aus den Make-Info-Dokumenten:

  

$ (wenn BEDINGUNG, DANN-TEIL [, SONST-TEIL]) '        Die Funktion 'if' bietet Unterstützung für bedingte Erweiterungen in a        funktionaler Kontext

     

Das erste Argument CONDITION hat zuerst alle vorhergehenden und        Nachgestellte Leerräume entfernt, dann wird erweitert. Wenn es erweitert wird        jede nicht leere Zeichenfolge, dann wird die Bedingung als wahr betrachtet.        Wenn es zu einer leeren Zeichenfolge erweitert wird, wird die Bedingung berücksichtigt        falsch sein.

In allen Ihren Beispielen ist Ihre Bedingung etwas wie ifeq SOMETHING OTHERTHING - was eine nicht leere Zeichenkette ist (von ifeq unabhängig von den anderen Dingen) und daher als wahr behandelt wird.

    
Chris Dodd 25.01.2012 19:28
quelle
0

Wenn Sie überprüfen möchten, ob Ihre Betriebssystemversion Linux oder eine andere ist und wenn es sich um Linux handelt, dann möchten Sie eine Nachricht drucken, dann können Sie folgende Schritte ausführen:

%Vor%

, bevor ich mit ifeq versucht habe, aber es hat nur den else-Teil gedruckt. Mein Betriebssystem ist Linux, ubuntu.

Wenn jemand diese Antwort gefunden hat, sollte sie geändert werden, damit sie auch eine bessere Antwort geben können.

    
amit pandya 01.09.2017 11:05
quelle

Tags und Links