Makefile: Target ohne Regel?

OP #5139828
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
Angehängte Dateien:
Gast #5139878
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.
#5139887
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.
Moderator #5139888
> 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.
Persönliche Seite #5140315
...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:$<
OP #5140952
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
#5140963
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.
OP #5141004
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.