Das erste, was Sie beachten sollten (um Missverständnisse zu vermeiden), ist, dass es sich nicht um ein einzelnes vs. mehrere Makefiles handelt. Es ist in jedem Fall eine gute Idee, das Makefile in einem Unterverzeichnis zu teilen.
Rekursive Makefiles sind in erster Linie schlecht, weil Sie Ihren Abhängigkeitsbaum in mehrere Bäume partitionieren. Dies verhindert, dass Abhängigkeiten zwischen make-Instanzen korrekt ausgedrückt werden. Dies führt auch dazu, dass (teilweise) der Abhängigkeitsbaum mehrere Male neu berechnet wird, was letztendlich ein Leistungsproblem darstellt (wenn auch normalerweise kein großer).
Es gibt ein paar Tricks, die Sie verwenden müssen, um Verwenden Sie den Single-Make-Ansatz richtig, besonders, wenn Sie eine große Codebasis haben:
Zuerst verwenden Sie GNU make (Sie bereits tun, sehe ich). GNU make hat eine Reihe von Funktionen, die die Dinge vereinfachen, und Sie müssen sich nicht um Kompatibilitäten kümmern.
Zweitens, verwenden Sie zielspezifische Variablenwerte.Dies ermöglicht es Ihnen zu haben, beispielsweise verschiedene Werte von CFLAGS für verschiedene Ziele, anstatt Sie zu zwingen, eine einzige CFLAGS in Ihrer gesamten Make haben:
main: CFLAGS=-O2
lib: CFLAGS=-O2 -g
Drittens, stellen Sie sicher VPATH/vpath auf die Verwendung volles Ausmaß unterstützt von GNU make.
Sie möchten auch sicherstellen, dass Sie nicht mehrere Quelldateien mit demselben Namen haben. Eine Einschränkung von VPATH besteht darin, dass Sie keine zielspezifischen VPATH-Definitionen haben, sodass die Namen Ihrer Quelldateien in einem einzigen "VPATH-Namespace" nebeneinander bestehen müssen.
Große Antwort, danke! Ich benutze VPATH sogar für ein Projekt mit rekursiven make-Dateien, das macht es viel einfacher, besonders für srcdir! = Builddir builds. –