Ich muss einige make-Regeln nur bedingt ausführen, wenn der installierte Python größer als eine bestimmte Version ist (z. B. 2.5).
Ich dachte, ich könnte so etwas wie Folgendes ausführen:
python -c 'import sys; print int(sys.version_info >= (2,5))'
und dann die Ausgabe ('1' wenn ok, '0' sonst) in einer ifeq
make-Anweisung verwenden.
In einem einfachen Bash-Shell-Skript ist es nur:
MY_VAR=`python -c 'import sys; print int(sys.version_info >= (2,5))'`
Aber das funktioniert in einem Makefile nicht.
Irgendwelche Vorschläge? Ich könnte jede andere sinnvolle Problemumgehung verwenden, um dies zu erreichen.
Antworten:
Verwenden Sie das
shell
eingebaute Make wie inMY_VAR=$(shell echo whatever)
quelle
$
.Das Einwickeln der Aufgabe in eine
eval
funktioniert für mich.quelle
.PHONY always make these targets
ist es da.Hier ist ein etwas komplizierteres Beispiel mit Rohrleitungen und Variablenzuweisung innerhalb des Rezepts:
quelle
PODNAME
den Einsatznamen zu ermitteln:$(eval PODNAME=$(shell sh -c "kubectl get pod -l app=sqlproxy -o jsonpath='{.items[0].metadata.name}'"))
Ich schreibe eine Antwort, um die Sichtbarkeit der tatsächlichen Syntax zu erhöhen, die das Problem löst. Leider kann das, was jemand als trivial ansieht, für jemanden, der nach einer einfachen Antwort auf eine vernünftige Frage sucht, zu einem erheblichen Problem werden.
Fügen Sie Folgendes in die Datei "Makefile" ein.
Das Verhalten, das Sie sehen möchten, ist das folgende (vorausgesetzt, Sie haben kürzlich Python installiert).
Wenn Sie den obigen Text kopieren und in das Makefile einfügen, erhalten Sie diesen? Wahrscheinlich nicht. Sie werden wahrscheinlich einen Fehler wie den hier gemeldeten erhalten:
Makefile: 4: *** fehlendes Trennzeichen. Halt
Warum: Obwohl ich persönlich einen echten Tab verwendet habe, konvertiert Stack Overflow (der versucht, hilfreich zu sein) meinen Tab in eine Reihe von Leerzeichen. Sie, frustrierter Internet-Bürger, kopieren dies jetzt und denken, dass Sie jetzt denselben Text haben, den ich verwendet habe. Der Befehl make liest nun die Leerzeichen und stellt fest, dass der Befehl "all" falsch formatiert ist. Kopieren Sie also den obigen Text, fügen Sie ihn ein und konvertieren Sie das Leerzeichen vor "@echo" in eine Registerkarte. Dieses Beispiel sollte hoffentlich endlich für Sie funktionieren.
quelle
Vorsicht vor solchen Rezepten
Es macht zwei Dinge falsch. Die erste Zeile im Rezept wird in einer von der zweiten Zeile getrennten Shell-Instanz ausgeführt. Die Variable geht in der Zwischenzeit verloren. Das zweite, was falsch ist, ist, dass das
$
nicht entkommen ist.Beide Probleme wurden behoben und die Variable ist verwendbar. Der Backslash kombiniert beide Zeilen, um in einer einzigen Shell ausgeführt zu werden. Daher funktioniert die Einstellung der Variablen und das Lesen der variablen Nachwörter.
Mir ist klar, dass im ursprünglichen Beitrag gesagt wurde, wie die Ergebnisse eines Shell-Befehls in eine MAKE-Variable übernommen werden, und diese Antwort zeigt, wie man sie in eine Shell-Variable umwandelt. Aber andere Leser können davon profitieren.
Eine letzte Verbesserung: Wenn der Verbraucher erwartet, dass eine "Umgebungsvariable" festgelegt wird, müssen Sie sie exportieren.
würde dies im Makefile brauchen
Hoffe das hilft jemandem. Im Allgemeinen sollte man es vermeiden, echte Arbeit außerhalb von Rezepten zu leisten, denn wenn jemand das Makefile mit der Option '--dry-run' verwendet, um nur zu sehen, was es tun wird, hat es keine unerwünschten Nebenwirkungen. Jeder
$(shell)
Aufruf wird zur Kompilierungszeit ausgewertet, und es könnte versehentlich echte Arbeit geleistet werden. Überlassen Sie die eigentliche Arbeit, wie das Generieren von IDs, nach Möglichkeit dem Inneren der Rezepte.quelle
Mit GNU Make können Sie die Ausgabe beliebiger Befehlszeilenaufrufe verwenden
shell
undeval
speichern, ausführen und zuweisen. Der Unterschied zwischen dem folgenden Beispiel und denen, die verwendet werden,:=
besteht darin, dass die:=
Zuweisung einmal (wenn sie auftritt) und für alle erfolgt. Rekursiv erweiterte Variablen, mit=
denen gesetzt wird, sind etwas "fauler"; Verweise auf andere Variablen bleiben bestehen, bis auf die Variable selbst verwiesen wird, und die nachfolgende rekursive Erweiterung findet jedes Mal statt, wenn auf die Variable verwiesen wird , was wünschenswert ist, um "konsistente, aufrufbare Snippets" zu erstellen. Weitere Informationen finden Sie im Handbuch zum Einstellen von Variablen .quelle
$(SET_ID)
eineif
Klausel lebt , die falsch ist, sie immer noch aufgerufen wird .Im folgenden Beispiel habe ich den Pfad des Makefile-Ordners in gespeichert
LOCAL_PKG_DIR
LOCAL_PKG_DIR
Zielen und diese dann in Zielen verwendet.Makefile:
Terminalausgang:
quelle