Ich versuche also, Makefiles zu verstehen. Im Moment habe ich ein Projekt mit einigen Modulen, die mehr oder weniger nicht voneinander abhängig sind.
Mein Verzeichnisbaum sieht folgendermaßen aus:
root/
- Source/ <-- referenced as $(INPUTPATH)
- Build/ <-- referenced as $(BUILDPATH)
- Release/ <-- referenced as $(OUTPUTPATH)
- Makefile
Ich möchte, dass die Quelle ( .cpp/ .h) auf dem Source/, die Objekte auf dem Build/ und die ausführbare Datei auf dem Release/*.
Meine Idee war also, mehrere verschiedene Ziele zu haben und sie so zu verwenden:
all: maps auxiliars methods
@echo "linking...";\
$(CC) $(CFLAGS) $(OBJS) $(CLIBS) -o ${OUTPUTPATH}/MainProgram
dependency1: $(INPUTPATH)/foo.cpp
@echo "compiling ArbPrecision...";\
cd ${BUILDPATH};\
$(CC) $(CFLAGS) $(CINCLUDE) -c ../$?
dependency2: dependency1 $(INPUTPATH)/bar.cpp
@echo "compiling saddleConstructor...";\
cd ${BUILDPATH};\
$(CC) $(CFLAGS) $(CINCLUDE) -c ../$(INPUTPATH)/bar.cpp
maps: dependency2 $(INPUTPATH)/*Map.cpp
@echo "compiling maps...";\
cd ${BUILDPATH};\
$(CC) $(CFLAGS) $(CINCLUDE) -c ../$(INPUTPATH)/*Map.cpp
... (auxiliars and methods)
Die $CINCLUDE und CFLAGS sind nur Compilerkram wie Header und externe Bibliotheken.
Alles funktioniert fast perfekt: Bei jedem Ziel wird nach den Abhängigkeiten zu anderen Zielen und nach der *cpp in der Quelle gefragt. Wenn diese nicht vorhanden ist, ruft es das Ziel auf und kompiliert die *cpp. Die ausführbare Datei wird ohne Fehler erstellt.
Wenn ich jedoch "make" zweimal aufrufe, ist die Kompilierzeit beim ersten und zweiten Mal gleich, auch wenn ich keine Änderungen am Quellcode vornehme. Offenbar habe ich also die Abhängigkeiten nicht richtig gesetzt.
Kann mir jemand den richtigen Weg zu dieser Zusammenstellung zeigen? Ich mache irgendetwas falsch, und ich verstehe nicht, was es ist.
Danke, Jorge