Ich spiele zurzeit ein bisschen mit einem AT91SAM7S256 herum, und es funktioniert eigentlich auch alles so wie ich mir das vorstelle. Ich habe das USB-CDC-Beispiel von Atmel als Grundlage genommen. Das dort mitgelieferte Makefile macht jedoch ein Problem. Irgendwie will er bei jedem Aufruf von make all sämtliche Quelltextdateien erneut kompilieren, auch wenn zwischendurch keine einzige Datei verändert wurde. Da die Atmel-USB-Bibliothek recht umfangreich ist dauert das Kompilieren doch eher lang und damit stört das etwas. Ich kenne mich mit makefiles nicht besonders toll aus (für AVR-Geschichten mit ein paar .c-Dateien hat es bisher immer gereicht), vielleicht hat ja hier jemand einen Tipp was man am makefile (siehe Anhang) ändern muss? Für mich sieht das eigentlich so aus als ob er nur die veränderten Dateien neu kompilieren sollte. Ich verwende yagarto 20091223 (aus eclipse heraus, aber auf der shell das gleiche Verhalten) mit GNU make 3.81 unter Windows 7 32bit.
make basiert auf dem Vergleich der Datumsstempel von Dateien. Also sieh dir mal das Filedatum deiner Dateien an. Wenn zb. deine C-Files das Datum 24.12.2100 tragen, dann ist klar, dass make diese Dateien immer wieder erneut kompilieren wird. Den das Ergebnis, das Object-File, wird immer das heutige Datum (+Uhrzeit) tragen, Weihnachten im Jahr 2100 ist aber trotzdem 'neuer' als heute, also wird im nächsten make-Durchgang erneut kompiliert.
oder die Systemzeit vom Rechner ist falsch gestellt?
Vielen Dank für die Antworten. Ich habe mal nachgeschaut, die Quelltextdateien sind alle vom 31.1.2010, die Object-Files sind von heute, die PC-Uhr stimmt auch.
Vielleicht wurden dann Zwischendateien (*.o etc.) entfernt?
Habe hier (CodeSourcery g++) mit ATMEL Makefiles für den AT91SAM9G45 genau das gleiche Problem. Schätze dass das am ATMEL Makefile liegt, evtl. an den zwei Targets sram und ddram oder so...bin noch nicht dahintergestiegen...
Mir kommen diese Zeilen suspekt vor: $$(C_OBJECTS_$(1)): $(OBJ)/$(1)_%.o: %.c Makefile $(OBJ) $(BIN) $(CC) $(CFLAGS) -D$(1) -c -o $$@ $$< $$(ASM_OBJECTS_$(1)): $(OBJ)/$(1)_%.o: %.S Makefile $(OBJ) $(BIN) $(CC) $(ASFLAGS) -D$(1) -c -o $$@ $$< Warum ist da eine Abhängigkeit von den OBJ und den BIN Dateien angegeben, wenn doch nur die C Source Files neu kompiliert werden? Murkser
Tatsächlich, make --debug sagt auch "bin" is newer, "obj" is newer. Mit "--assume-old bin --assume-old obj" aufgerufen compiliert er nicht mehr alles, will aber trotzdem noch die Targets "ddram" und "sram" (aus $(MEMORIES)) als Datei erstellen -> die gibts natürliche nicht. Also linkt er nochmal.
roffez schrieb: > Tatsächlich, make --debug sagt auch "bin" is newer, "obj" is newer. Objektverzeichnisse sollten lediglich auf Existenz geprüft werden, nicht auf Datum, da das Erzeugen von Objektdateien das Datum des Verzeichnisses aktualisiert. In deinem Fall wäre daher vermutlich die folgende Schreibweise angebracht (bemerke das pipe Zeichen ;)
1 | $$(C_OBJECTS_$(1)): $(OBJ)/$(1)_%.o: %.c Makefile | $(OBJ) $(BIN) |
Siehe auch: http://www.gnu.org/software/make/manual/html_node/Prerequisite-Types.html#Prerequisite-Types -- Marcus
Vielen Dank, das Pipe-Symbol macht einen wesentlichen Unterschied, jetzt wird nur noch das kompiliert, was kompiliert werden soll. Fürs Verständnis: die alte make-Regel hat vorausgesetzt, dass alle Binärdateien (da der enthaltende Ordner aufgeführt ist), die zugehörige .c-Datei und das Makefile älter als die jeweilige .o-Datei sind? Und jetzt wird nur noch geprüft, dass das Makefile und die zugehörige .c-Datei älter sind und dass die Ordner bin und obj bereits erstellt wurden?
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.