Forum: Compiler & IDEs Makefile: Target ohne Regel?


von Roman K. (rk_aus_s)


Angehängte Dateien:

Lesenswert?

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
von asdfasd (Gast)


Lesenswert?

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.

von Clemens L. (c_l)


Lesenswert?

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.

von Yalu X. (yalu) (Moderator)


Lesenswert?

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

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

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

von Roman K. (rk_aus_s)


Lesenswert?

Vielen Dank!
Habe mich gestern Abend nochmals daran gemacht, und mithilfe eurer 
Erklärungen bin ich nun wieder ein paar Schritte weiter.

Grüsse.

von Roman K. (rk_aus_s)


Lesenswert?

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

von Martin H. (horo)


Lesenswert?

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

von Roman K. (rk_aus_s)


Lesenswert?

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
von Markus F. (mfro)


Lesenswert?

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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von Roman K. (rk_aus_s)


Lesenswert?

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