Wie übergebe ich ein Argument von der Kommandozeile an Makefile?
Ich verstehe, dass ich es tun kann
$ make action VAR="value"
$ value
mit Makefile
VAR = "default"
action:
@echo $(VAR)
Wie erhalte ich das folgende Verhalten?
$ make action value
value
?
Wie wäre es mit
$make action value1 value2
value1 value2
command-line
parameters
makefile
arguments
Meng Lu
quelle
quelle
Antworten:
Sie sollten dies wahrscheinlich nicht tun. Sie brechen das Grundmuster, wie Make funktioniert. Aber hier ist es:
EDIT:
Um den ersten Befehl zu erklären,
$(MAKECMDGOALS)
ist die Liste der "Ziele", die in der Befehlszeile angegeben sind, z. B. "Aktionswert1 Wert2".$@
ist eine automatische Variable für den Namen des Ziels der Regel, in diesem Fall "Aktion".filter-out
ist eine Funktion, die einige Elemente aus einer Liste entfernt. Also$(filter-out bar, foo bar baz)
kehrt zurückfoo baz
(es kann subtiler sein, aber wir brauchen hier keine Subtilität).Fügen Sie diese zusammen und geben Sie
$(filter-out $@,$(MAKECMDGOALS))
die Liste der Ziele zurück, die in der Befehlszeile angegeben sind, außer "Aktion", möglicherweise "Wert1 Wert2".quelle
$(shell echo $(MAKECMDGOALS) | sed 's!^.* $@ !!')
um alle Ziele vorher wegzulassen und nur Folgendes als Argumente zu betrachten:make target1 target2 action value1 value2
%:
und@:
kann keine Informationen darüber finden, was diese "Anweisungen" (oder wie auch immer sie genannt werden) tun. Könnten Sie bitte erklären?%:
und@:
ist eine Regel . Der Zielname%
bedeutet, dass es sich um eine Regel handelt, die mit allem übereinstimmt . Das heißt, wenn Make keine andere Möglichkeit findet, das Objekt zu erstellen, das Sie erstellen sollen, wird diese Regel ausgeführt. Das@:
ist ein Rezept ; Die:
Mittel tun nichts und die@
Mittel tun es still.%:
es sich tatsächlich um% :
einen Zielnamen vom Typ Wildcard handelte. Ich sehe auf dieser Handbuchseite jedoch nichts in Bezug auf@:
... es deutet darauf hin, dass eine "Nichtstun" -Regel einfach ein ";
Nach der Zielspezifikation" haben würde , also wäre es nicht genauer zu schreiben% : ;
als die "Platzhalter" -nichts "Regel?filter-out
funktioniert nicht, wenn die Aktion eine Abhängigkeit des in der Befehlszeile angegebenen Ziels ist, da$@
der Name der Abhängigkeit festgelegt wird und nicht das ursprüngliche Argument, das in der Befehlszeile aufgerufen wird. StattdessenMAKECMDGOALS
@ args=($(MAKECMDGOALS)); args=("$${args[@]:1}")
Hier ist eine generische Arbeitslösung, die auf @ Beta basiert
Ich benutze GNU Make 4.1
SHELL=/bin/bash
auf meinem Makefile, also YMMV!Dies ermöglicht es uns, zusätzliche Argumente zu akzeptieren (indem wir nichts tun, wenn wir einen Job erhalten, der nicht übereinstimmt, anstatt einen Fehler auszulösen).
Und dies ist ein Makro, das die Argumente für uns erhält:
Hier ist ein Job, der diesen nennen könnte:
Das Ergebnis wäre:
Hinweis! Sie sind möglicherweise besser dran, wenn Sie ein "Taskfile" verwenden, ein Bash-Muster, das ähnlich funktioniert, nur ohne die Nuancen von Maketools. Siehe https://github.com/adriancooney/Taskfile
quelle
tab
vorher@echo
keine gibtspace
.Viel einfacher Ansatz. Betrachten Sie eine Aufgabe:
Wenn ich es jetzt nennen möchte, führe ich einfach so etwas aus wie:
AT="build assets" make provision
oder nur:
make provision
In diesem FallAT
handelt es sich um eine leere Zeichenfolgequelle
versuche das nicht zu tun
Erstellen Sie stattdessen ein Skript:
und mach das:
Für weitere Erklärungen, warum dies und Vorbehalte gegen Makefile-Hackery tun, lesen Sie meine Antwort auf eine andere sehr ähnliche, aber scheinbar nicht doppelte Frage: Übergeben von Argumenten an "make run"
quelle