2016-04-27 5 views
0

Könnte jemand klären, wie dieser Code funktioniert?Clarify Makefile Syntax

PRE_PROC_EXE  := $(shell which pre_proc.pl) 
PRE_PROC2_EXE  := $(shell which pre_proc2.pl) 

$(filter $(TMP_DIR)/%.c,$(FILES)):$(TMP_DIR)/%.c: $(SRC_DIR)/%.c 
    $(PRE_PROC_EXE) < $< > [email protected] 

Ich habe versucht, einen weiteren Schritt in der Pre-Verarbeitung auf die Dateien für Schritt ein (mit PRE_PROC2_EXE) erzeugt hinzuzufügen. Wie mache ich das?

+0

Möchten Sie 'PRE_PROC2_EXE' im selben Rezept oder in einem eigenen Rezept verwenden? Nimmt es gestreamte Eingabe oder Dateien direkt auf? Möchten Sie eine zweite Gruppe von Zwischendateien? –

+0

Ich brauche eine zweite Gruppe von Zwischendateien, da es wie läuft './pre_proc2.pl in_file> out_file' – Jean

+0

Wollen Sie eine zweite make-Regel? Das würde einen anderen Satz von Einträgen in '$ (FILES)' oder einer anderen make-Variablen, etc. benötigen oder wollen Sie einfach beide Befehle in dieser einen Regel ausführen? –

Antwort

1

Wie funktioniert das? Es funktioniert durch Magie! - Meiner Meinung nach ist das ein schreckliches Makefile (praktische Bemerkungen am Ende).

make ist ein einfaches System, mit einfacher Syntax, die eine Sache gut macht. Im Laufe der Jahre hat es jedoch (und ja, ich sehe dich, GNU Make) eine Kruste aus komplizierten Funktionen mit komprimierter Syntax und einem umfangreichen Handbuch, die zusammen einige Makefiles wie Linienrauschen aussehen lassen. Wie hier.

Manchmal haben Sie mehr oder weniger kluge Dinge zu tun, ein bisschen Software zu bauen, aber (meiner Meinung und Erfahrung) diese viel mehr natürlich und verständlich behandelt durch Raffinesse zu den Regeln hinzufügen, nicht die Makefile-Syntax selbst. Auf diese Weise lassen Sie die Struktur des Makefile vernünftig verständlich, was wichtig ist, wenn Sie verstehen und anpassen müssen, wie die Software aufgebaut ist.

Ich schreibe ziemlich komplizierte Makefiles, aber benutze nur gelegentlich einen Filter so kompliziert wie patsubst (aber ich benutze generell GNU Make - BSD/POSIX Make ist eine Askese zu weit).

Sie können auch Hilfswerkzeuge verwenden, um bestimmte Teile des Schwertransports durchzuführen. Zum Beispiel könnten Sie autoconf verwenden Sie das Werkzeug-Suche zu tun, schreiben

[email protected][email protected] 
[email protected][email protected] 

in einem Makefile.in, und schreiben Sie eine configure.ac die

dnl Process this file with autoconf 
AC_INIT(fooprog, 0.1-SNAPSHOT, [email protected]) 

AC_PATH_PROG(PRE_PROC_EXE, pre_proc.pl, NOT_FOUND) 
AC_PATH_PROG(PRE_PROC_EXE2, pre_proc2.pl, NOT_FOUND) 

AC_CONFIG_FILES([Makefile]) 
AC_OUTPUT 

Dann schließt autoconf; ./configurepre_proc{,2}.pl finden würde und ersetzen sie in eine neue Makefile. autoconf ist ein wenig gewöhnungsbedürftig, zum ersten Mal, aber es ist ziemlich natürlich, sobald man sich daran gewöhnt hat.

Rückkehr zu Ihrem speziellen Beispiel, ich habe wenig Ahnung, was das Ziel hat (zwei Doppelpunkte? Ich will nicht wissen, ...), aber Sie könnten in der Lage sein, um die Regel zu

$(PRE_PROC_EXE) < $< | $(PRE_PROC_EXE2) > [email protected] 
einzustellen

, um die Eingabe *.c Dateien über beide Präprozessoren zu übergeben.

+0

Lol ..' make einige Makefiles sehen aus wie Line-Noise' Das ist genau das, was ich dachte. – Jean

1

$(shell) ist eine make-Funktion, die einen Shell-Befehl ausführt und die Ausgabe zurückgibt.

So PRE_PROC_EXE enthält die Ausgabe von which pre_proc.pl ausgeführt und PRE_PROC2_EXE enthält die Ausgabe von which pre_proc2.pl läuft. (Ich werde darauf hinweisen, dass which nicht portabel ist, nicht garantiert zu existieren und hat keine Spezifikation für sein Verhalten, so dass Sie sich nicht auf seine Ausgabe verlassen können, so dass es so zu verwenden ist keine gute Idee.)

Der Rest ist ein Static Pattern Rule, die auf die Einträge in $(FILES) betreibt, die die $(TMP_DIR)/%.c Muster (von $(filter $(TMP_DIR)/%.c,$(FILES))) und wendet das Rezept auf sie unter Verwendung der passenden $(SRC_DIR)/%.c Datei als Voraussetzung ($<) und die passende $(TMP_DIR)/%.c Datei als das MATCH Ziel ([email protected]).

In Bezug auf die Anwendung PRE_PROC2_EXE auf diese, die nicht leicht beantwortbar ist, wie Sie nicht erläutert haben, wie das Skript funktioniert oder wie Sie es anwenden müssen.