Hallo zusammen
Bin neu hier und möchte alle erst einmal grüssen.
Ich arbeite mich zur Zeit in die Materie "Atmel AVRs" ein (ohne Arduino
Env.) und beschäftige mich im Rahmen dessen mit make und makefiles, dh.
ich versuche makefiles zu verstehen.
Im Dateianhang habe ich ein Makefile (Quelle: “Make: AVR Programming by
Elliot Williams (MAKE). Copyright 2014 Elliot Williams,
978-1-4493-5578-4.”), bei welchem ich u.A. den Sinn dieser Zeile (95)
nicht erkenne:
all: $(TARGET).hex
Also, ich meine zu verstehen, dass das Target "all" in Abhängigkeit zu
einem hex file steht, welches via Variable TARGET defniert ist.
Aber was macht das für einen Sinn wenn darunter keine Regel steht?
"all" ist scheinbar auch nirgends eine Abhängigkeit?
Bitte um Nachsicht, wenn das ein doofe Frage ist, aber ich habe trotz
Recherche nix passendes gefunden.
Viele Grüsse
Roman
Das sind Aliase. Dem Target reicht es, wenn alle Abhängigkeiten
vorhanden sind - weitere Aktionen sind nicht erforderlich. Gerade "all"
wird häufig als generisches Target benutzt. Als Abhängigkeiten ist alles
aufgeführt, was bei "make all" erstellt werden soll.
Dieses Target (und alle anderen, die unter .PHONY aufgelistet sind) ist
dazu gedacht, direkt mit Make aufgerufen zu werden: "make all", "make
flash", etc.
Wenn du "make all" aufrufst, dann denkt es sich "um 'all' zu erzeugen,
muss ich vorher '$(TARGET).hex' erzeugen", und tut das. Und dann wird
das Target 'all' erzeugt, indem die (leere) Befehlsliste abgearbeitet
wird. (Und durch das .PHONY meckert Make dann nicht, dass die Datei
fehlt.)
Für diese Pseudo-Targets gibt es Standards
(https://www.gnu.org/prep/standards/html_node/Standard-Targets.html),
aber bei Mikrocontroller-Projekten sind nicht alle sinnvoll.
Wenn du Make ohne Parameter aufrufst, erzeugt es das erste Target im
Makefile; deshalb ist es üblich, 'all' als erste Regel zu schreiben.
> all: $(TARGET).hex
Das ist sehr wohl eine Regel. Sie beschreibt allerdings nur eine
Abhängigkeit und keine Aktion, um diese Abhängigkeit aufzulösen. Das ist
in diesem Fall auch nicht nötig, denn "all" ist ein Pseudo-Target und
keine Datei, die mittels einer Aktion erstellt werden müsste.
Die Datei $(TARGET).hex hängt aber direkt oder indirekt von weiteren
Dateien ab. Das steht in dieser Regel:
1
%.hex: %.elf
2
$(OBJCOPY) -j .text -j .data -O ihex $< $@
Diese Regel enthält nun auch eine Aktion (nämlich $(OBJCOPY) ...) die
die Hex-Datei erstellt.
Ich nochmals...
Hat einer von euch eine Ahnung, was es mit Zeile 77 auf sich hat?:
%.o: %.c $(HEADERS) Makefile
Was bedeutet der Ausdruck "Makefile" als letzte der Abhängigkeiten?
Grüsse
Roman
Roman K. schrieb:> Was bedeutet der Ausdruck "Makefile" als letzte der Abhängigkeiten?
Wenn sich das Makefile ändert (das z.B. einige Defines enthält),
triggert die Regel fürs Object-Files.
Ciao, Martin
Ok..., das ging jetzt etwas zu schnell für mich...
Meinst du mit "...wenn sich das Makefile ändert" dass es sich ändern
kann, während es verarbeitet wird?
Oder meinst du damit, das make beim nächsten Start merkt, wenn das
Makefile nicht mehr das gleiche ist wie bei letzten Start? Und wenn es
so wäre, woher weiss make, dass sich das Makefile seit dem letzen Aufruf
verändert hat? Hält make die "Versionen" (oder irgend ein hash) vom
Makefile irgendwo fest?
Grüsse
Roman
Roman K. schrieb:> woher weiss make, dass sich das Makefile seit dem letzen Aufruf> verändert hat?
So wie bei allen anderen Abhängigkeiten auch: durch den
Zeitstempelvergleich der abhängigen Dateien zu denen, von denen sie
abhängig sind.
D.h. wenn das (Datei), was rechts vom Doppelpunkt steht, einen
"frischeren" Zeitstempel hat, als das, was links davon steht, wird die
Regel abgearbeitet.
Roman K. schrieb:> Meinst du mit "...wenn sich das Makefile ändert" dass es sich ändern> kann, während es verarbeitet wird?
Es ändert sich, weil du es editiert hast.
Markus F. schrieb:> So wie bei allen anderen Abhängigkeiten auch: durch den> Zeitstempelvergleich der abhängigen Dateien zu denen, von denen sie> abhängig sind.>> D.h. wenn das (Datei), was rechts vom Doppelpunkt steht, einen> "frischeren" Zeitstempel hat, als das, was links davon steht, wird die> Regel abgearbeitet.
Ja, klingt eigentlich logisch. Ich Dummbatz...
Auf jeden Fall vielen Dank, euer Input ist echt wertvoll!
Grüsse