Forum: Compiler & IDEs MAKE: Auch ohne Änderungen werden immer alle Dateien kompiliert, warum?


von Thomas F. (tza)


Angehängte Dateien:

Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Klaus W. (mfgkw)


Lesenswert?

oder die Systemzeit vom Rechner ist falsch gestellt?

von Thomas F. (tza)


Lesenswert?

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.

von Klaus W. (mfgkw)


Lesenswert?

Vielleicht wurden dann Zwischendateien (*.o etc.) entfernt?

von roffez (Gast)


Lesenswert?

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...

von Murkser (Gast)


Lesenswert?

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

von roffez (Gast)


Lesenswert?

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.

von Marcus H. (mharnisch) Benutzerseite


Lesenswert?

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

von Thomas F. (tza)


Lesenswert?

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
Noch kein Account? Hier anmelden.