Vererben von Variablen in Makefiles
-
Guten Abend
Ich habe für ein Projekt eine Hauptmakefile und in Unterordnern diverse Submakefiles. Die Submakefiles werden aus der Hauptmakefile aufgerufen. Das sieht circa wie folgend aus:
MAKE = make KERNEL = src/kernel GLOBALVARIABLE = foo all: $(MAKE) -C $(KERNEL)
Und die Submakefile:
kernel: Hier möchte ich die globale Variable GLOBALVARIABLE mit dem Inhalt foo benuetzen
Nun meine Frage, geht so eine Variabelnvererbung überhaupt , sprich das ich von der Submakefile "kernel" auf die Variable aus der Hauptmakefile zugreifen kann ?
Gruss Badesalz100
-
Wird die Variable denn erst im Hauptmakefile berechnet? Eigentlich sollten Makefiles unabhängig voneinander laufen. Kommandozeilenparameter von make kannst du mittels $(MAKEFLAGS) durchschleifen. Wenn du wirklich eine Variable an ein Submakefile weitergeben musst, dann kannst du sie als Umgebungsvariable exportierst und dann im Submake aus den Umgebungsvariablen wieder zurück liest. guckst du hier:
http://sunsite.ualberta.ca/Documentation/Gnu/make-3.79/html_chapter/make_5.html#SEC52
Und hier:
http://sunsite.ualberta.ca/Documentation/Gnu/make-3.79/html_chapter/make_5.html#SEC53Überleg dir auch mal, ob die Variablen nicht vielleicht eher so etwas wie eine globale Gesamteinstellung sind, die dann eher durch ein configure-Skript in die Makefiles geschrieben werden sollten.
-
Hallo
Zum Thema unabhängig laufen. Das war zuerst auch mein Plan, jedoch ist das Ganze nun etwas komplexer geworden und soll plattforumunabhängig erstellt werden können, sprich Makefiles bieten sich da besser an.
Die Hauptmakefile dient sozusagen als Einstellparameter (Unter anderem Compiler, Linker, Assembler, Flags, Libraries aber auch vielen anderen Sachen) aber auch als Verwaltungseinheit (Oxygen, SVN). Ein unabhängiges Funktionieren jeder einzelnen Makefile ist zweitrangig (respektive sogar unwichtig, wir trennen nur zur Übersichtlichkeit) und erhöht zudem den Aufwand erheblich (Zu viele Parameter, zu statisch in der Anpassung/Wartung)
Die beiden Links sehen gut aus, hab eine solch gut formulierte Make Referenz noch nicht gesehen - danke für den Geheimtipp, werde es mir übermorgen mal anschauen, wenn ich frei habe.
Jedoch habe ich noch eine Frage:
Überleg dir auch mal, ob die Variablen nicht vielleicht eher so etwas wie eine globale Gesamteinstellung sind, die dann eher durch ein configure-Skript in die Makefiles geschrieben werden sollten.
Wie sähe sowas konkret aus, ich kann mir darunter gerade gar nichts vorstellen, geht es einfach darum, dem Make Befehl Parameter zu übergeben ?
Vielen Dank für die aufschlussreichen Antworten,
Gruss Badesalz100
-
Badesalz100 schrieb:
Die beiden Links sehen gut aus, hab eine solch gut formulierte Make Referenz noch nicht gesehen - danke für den Geheimtipp, werde es mir übermorgen mal anschauen, wenn ich frei habe.
Das ist die Dokumentation!
Jedoch habe ich noch eine Frage:
Überleg dir auch mal, ob die Variablen nicht vielleicht eher so etwas wie eine globale Gesamteinstellung sind, die dann eher durch ein configure-Skript in die Makefiles geschrieben werden sollten.
Wie sähe sowas konkret aus, ich kann mir darunter gerade gar nichts vorstellen, geht es einfach darum, dem Make Befehl Parameter zu übergeben ?
Man hat recht oft den Fall, dass man Variablen hat, die zwischen allen Makefiles gleich sind, aber von Build zu Build verschieden sind. Zum Beispiel der Name des Compilers oder die Optimierungsoptionen. Die stehen dann vorzugsweise nicht fest im Makefile, da dieses sonst plattformabhängig wäre. Daher erzeugt man sich das Makefile erst noch anhand eines Skripts, welches die Buildoptionen in Erfahrung bringt und deren Tauglichkeit prüft. Dieses erzeugt dann die plattformabhängigen Makefiles für diesen Build. Meistens schreibt man dieses Erzeugungsskript auch nicht selber, sondern lässt auch dieses automatisch erzeugen, da Skriptsprachen oft auch plattformabhängig sind. Und auch das Skript zum Erzeugen des Skripts zum Erzeugen des Skripts erzeugt man sich oftmals automatisch aus dem Quellcode
.
Das Gesamtpaket dieses Vorgangs nennt man dann ein Buildsystem. Früher führte da praktisch nix an den GNU-Autotools vorbei, aber mittlerweile gibt es auch eine ganze Reihe bewährter Alternativen, z.B. cmake, um nur eine zu nennen.