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
:
Bearbeitet durch User
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.
...wobei avrdude auch ELF versteht, der Zwischenschritt über IHEX ist nicht mehr nötig. Das Makefile kann man also von
1 | %.hex: %.elf |
2 | $(OBJCOPY) -j .text -j .data -O ihex $< $@ |
3 | |
4 | %.eeprom: %.elf |
5 | $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ |
6 | |
7 | ... |
8 | |
9 | all: $(TARGET).hex |
10 | |
11 | ... |
12 | |
13 | flash: $(TARGET).hex |
14 | $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< |
15 | |
16 | flash_eeprom: $(TARGET).eeprom |
17 | $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< |
vereinfachen zu:
1 | ... |
2 | |
3 | all: $(TARGET).elf |
4 | |
5 | ... |
6 | |
7 | flash: $(TARGET).elf |
8 | $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< |
9 | |
10 | flash_eeprom: $(TARGET).elf |
11 | $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< |
Vielen Dank! Habe mich gestern Abend nochmals daran gemacht, und mithilfe eurer Erklärungen bin ich nun wieder ein paar Schritte weiter. Grüsse.
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
:
Bearbeitet durch User
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
:
Bearbeitet durch User
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.