Tag
Dirty Oerti hat geschrieben:ich denke aber, dass das Thema wohl eher hier rein passt. (Make kann man wohl schon als eine Art Programmier, bzw Skriptsprache ansehen^^)
Schon, aber eigentlich ist es Tool, gehört also zu "Software". Aber du hast recht, das ist grauzone. Lassen wirs mal drin.
Gleich mal vorweg: Ich habe vor mein Projekt auf CMake umzustellen, weil GNU Make einfach zu kompliziert anstrengend und nervig ist. GNU Autoconf/Autotools will ich auf keinen Fall lernen, weil es da wirklich Horrorgeschichten dazu gibt...
Soviel zu der Sache.
Also ich habe für mein Projekt jetzt mittlerweile ein halbwegs akzeptables build- system für GNU Make aufgebaut. Du kannst ja mal hier durchbrowsen:
http://git.berlios.de/cgi-bin/gitweb.cg ... ;a=summary
Das Programm selbst ist (noch) Müll, aber wenigstens funktionieren die Makefiles
Also ich habe das so gelöst:
* /build/config.mak:
Eine Datei, die alle "Build-Einstellungen" enhätl. Das sind: Verzeichnisse, Compiler Flags, Linker Flags, optionen... Dieses wird von der build/global.mak eingebunden.
* /build/global.mak:
Globale Makefile datei. Wird von allen anderen Makefiles eingebunden, "baut" die Compiler und Linker flags zusammen.
* /Makefile: "Bequemlichkeits" Makefile, ruft einfach alle Makefiles der Programme auf (client, server, common).
* /src/client, server, common/Makefile: Ruft die Makefiles der einzelnen "Komponenten" (gui, network, ...) auf
Die Komponenten-Makefiles erstellen .o files, die Programm- makefiles erstellen Programme (oder eine .a von /src/common).
Das "durchsuchen" der Verzeichnisse nach allen ".cpp" files geht so:
Code: Alles auswählen
# create a variable that contains all source files
# first expand the wildcard in the working directory
SOURCES := $(wildcard *.cpp)
# finally create the names for the object file
OBJECTS := $(patsubst %.cpp,%.o,$(SOURCES))
nuke-ms-serv: $(OBJECTS)
$(CXX) $(CXXFLAGS) -o $@ $^ $(LDFLAGS) -lnukems
Zuerst speicherst du die Namen aller .cpp's in dem Verzeichnis in die Variable "SOURCE". Dann ersetzt du einfach ".cpp" durch ".o" und speicherst das ergebnis in "OBJECTS". Anschließend gibst du nur das Target für das "Hauptprogramm" an, dass alles linkt. Die Objektdateien sollten automatisch, durch implizite Regeln erstellt werden, solange die CXXFLAGS stimmen.
Das ganze System hat eine Schwäche: ich kann nicht beliebig viele Unterverzeichnisse haben, die .o Dateien enthalten, da die Unterprozesse von Make keine Variablen "zurückgeben" können.
Alles irgendwie nervig... ziemlich viel Frickelei und ich habe so das Gefühl dass das ganze ein Kartenhaus ist, dass ganz leicht zusammenfällt. Also ich steige auf CMake um, wenn ich Zeit dazu habe.
Ach ja, das "aufrufen" eines Makefiles sieht zum Beispiel so aus:
So, ich hoffe ich konnte dir helfen...
"Feel free to" durchstöbern meiner Makefiles, und stell Fragen wenn was nicht klar ist. Oder stell am liebsten sofort viele Fragen
ps.: GNU Make suxx

Haters gonna hate, potatoes gonna potate.