mikrocontroller.net

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


Autor: Thomas Faust (tza)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oder die Systemzeit vom Rechner ist falsch gestellt?

Autor: Thomas Faust (tza)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht wurden dann Zwischendateien (*.o etc.) entfernt?

Autor: roffez (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Murkser (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: roffez (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Marcus Harnisch (mharnisch) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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 ;)
$$(C_OBJECTS_$(1)): $(OBJ)/$(1)_%.o: %.c Makefile | $(OBJ) $(BIN)

Siehe auch:
http://www.gnu.org/software/make/manual/html_node/...

--
Marcus

Autor: Thomas Faust (tza)
Datum:

Bewertung
0 lesenswert
nicht 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?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.