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; ./configure
pre_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.
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? –
Ich brauche eine zweite Gruppe von Zwischendateien, da es wie läuft './pre_proc2.pl in_file> out_file' – Jean
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? –