Ich habe ein ziemlich großes Makefile, das eine Reihe von Zielen im laufenden Betrieb erstellt, indem Namen aus Variablen berechnet werden. (zB foo $ (VAR): $ (PREREQS)). Gibt es eine Möglichkeit, wie gnu make davon überzeugt werden kann, eine Liste von Zielen auszuspucken, nachdem diese Variablen erweitert wurden?
Ich möchte in der Lage sein, die Ziele für ein beliebiges Makefile zu erhalten. Ich versuche, eine Vervollständigungsfunktion für meine Shell zu schreiben.
make -pn | sed -rn '/^[^# \t\.%].*:[^=]?/p'
make -pnr
. Das-r
entfernt implizite Regeln.Entnommen aus der Vervollständigung von make arg, die wie ein Zauber wirkt.
quelle
~/bin
anstatt einen Alias zu verwenden. Funktioniert super; Vielen Dank!alias mkl="make -qp | awk -F':' '/^[a-zA-Z0-9][^\$#\/\t=]*:([^=]|\$)/ {split(\$1,A,/ /);for(i in A)print A[i]}' | sort"
der Ihnen 2 Minuten des Zitierens von Spielen| sort -u
sieht nützlicher aus :)Ich bin mir nicht sicher, ob dies nur eine Gnu-Sache ist, aber das funktioniert gut:
make help
quelle
Mehrere Antwortende haben vorgeschlagen
make -pn
, die Datenbank mit Regeln zu drucken, aber nichts auszuführen - mehr oder weniger. Das Problem bei diesem Ansatz ist, dass-n
immer noch alle rekursiven Marken aufgerufen werden und immer noch viel mehr Arbeit als nötig ausgeführt wird, da jeder Befehl ausgedruckt wird, den er in einem regulären Build aufgerufen hätte. Eine effizientere Lösung wäre, ein triviales Makefile, dummy.mk, mit folgenden Inhalten zu erstellen:Rufen Sie nun make as auf
make -p -f Makefile -f dummy.mk __all_targets__
. Bei jedem wesentlichen Build ist der Unterschied in der Menge der von make erzeugten Ausgabe signifikant. Beispielsweise:Die Ausführungszeit war ebenfalls dramatisch besser - 2,063 Sekunden für die erste Version, 0,059 Sekunden für die zweite.
quelle
time make -pn | wc -l
":1338738 real 0m47.754s.
"time make -f Makefile -f dummy.mk -pn __all_targets__ | wc -l
" :938621 real 0m40.219s
.make
scheint etwas ähnliches, aber freundliches vorzuschlagen, nämlichmake -p -f/dev/null
-f /dev/null
wird verhindert, dassmake
die regulären Makefiles analysiert werden, sodass Sie nur einen Ausdruck der integrierten Regeln erhalten. Deshalb spezifiziert meine Lösung-f Makefile -f dummy.mk
. Aber das ist nicht genug , um entweder, weil mit-n
,make
wird fortgesetzt , und tatsächlich beginnt auch die Regeln in der Make - Datei ausgeführt wird . Leider sind mir keine Änderungen bekannt, die die ursprünglich vorgestellte Lösung vereinfachen könnten.-n
..."Schauen Sie sich die Bash- Vervollständigung für make auf GitHub an.
quelle
Bearbeiten: Zu Ihrer Information: Das Debian-Bash-Abschluss-Git-Repository in einer anderen Antwort enthält jetzt eine erweiterte Version dieses Skripts, die auf Anwendungsfälle für den Bash-Abschluss zugeschnitten ist.
Dies ist ein viel vollständigeres Skript als das Debian-Bash-Vervollständigungsskript, da es Ergebnisse für generierte Regeln liefert, nach denen die Frage fragt, und die am besten bewertete Antwort (Debian-Bash-Vervollständigungsskript auf dem Debian-Git-Server) nicht weit genug geht.
Dies ist nicht das ursprüngliche Skript, mit dem ich verlinkt habe, aber es ist viel einfacher und ein Hauch schneller.
quelle
Dies ist der Code für Alias, der auf der Todd Hodes-Lösung basiert
quelle
Dies ergibt eine schöne Ausgabe:
quelle
Hier gibt es eine sehr schöne Lösung mit etwas Sed- und Egrep-Magie: https://gist.github.com/pvdb/777954
quelle
Ich schätze, ich bin etwas spät dran für diese Party, aber wenn Sie nach einem bestimmten Befehl suchen, können Sie es versuchen
Dies funktioniert meistens, obwohl es möglicherweise noch einige Nicht-Ziel-Dinge wie eine
vpath
Direktive enthält. Wenn Sie nicht vonmake
den integrierten Regeln abhängig sind, können Sie diesenmake -qpR
als ersten Befehl in der Pipeline verwenden.quelle
Ruby-Lösung:
quelle
Ich arbeite an Solaris 10 und einer Turbo C-Schale. Die angegebene Lösung funktioniert für mein Makefile-Projekt nicht. auch nach Änderung der obigen Befehlszeile auf tcsh-Syntax. Ich habe jedoch herausgefunden, dass Sie mit eine einfache Lösung erhalten können
Remake-Version:
ist
und einige andere unwichtige Versionsdaten
quelle
Ich habe nach der gleichen Frage gesucht und mir diesen Dreh ausgedacht:
Dadurch werden alle Kommentarzeilen, Musterregeln (Zeilen, die mit Tabulatoren beginnen) und alle Eigenheiten (Beispiel
.c.o
und%.o: %.c
Muster) entfernt.quelle
Diese Lösung in einem anderen Thread gefunden:
Sie können es auch zu Ihrem hinzufügen
Makefile
:Und ausführen
make list
.quelle
Sicher, aber wann soll es sie ausspucken?
Fügen Sie eine Zeile in die Regel ein, um den Namen des Ziels beim Ausführen der Regel zu melden:
Um sie alle auf einmal auszuspucken, können Sie ein separates PHONY-Ziel erstellen:
Und dies kann eine Voraussetzung für Ihr Standardziel sein:
BEARBEITEN:
Sie möchten eine Möglichkeit, alle möglichen Ziele eines beliebigen Makefiles anzuzeigen, was vermutlich nicht aufdringlich bedeutet. Gut...
Um dies genau zu tun und mit anspruchsvollen Makefiles fertig zu werden, z. B. mit Regeln, die durch
eval
Anweisungen erstellt wurden, müssten Sie etwas schreiben, das einem Make-Emulator nahe kommt. Unpraktisch.Um die Ziele der einfachen Regeln zu sehen, können Sie ein Makefile schreiben, das als Makefile-Scanner fungiert und mit einem beliebigen Makefile arbeitet:
Dies wäre eine beeindruckende Arbeit. Sind Sie sicher, dass das Ziel die Mühe wert ist?
quelle
quelle
:=
) falsch positive Ergebnisse .