make Kommandozeile

#4347879
Lesenswert?

Liebe Gemeinde,

Folgende Situation:

Ich arbeite an einer Firmware, welche per make in mehreren Version 
übersetzt werden kann. Daher lauten die Aufrufe zum Übersetzen z.B.:
1
make             // Alle Versionen übersetzen
2
make all         // Alle Versionen übersetzen
3
make version1    // Nur version1 übersetzen
4
make version2    // Nur version2 übersetzen

Um eine bestimmte Version direkt aus make heraus zu programmieren, gibt 
es eigene Ziele, über welche ich dann z.B. wie folgt programmieren kann:
1
make flashversion1   // Übersetze und programmiere Version1
2
make flashversion2   // Übersetze und programmiere Version2

In der make-Datei sind die Regeln für flashversion1 und flashversion2 
jeweils explizit hingeschrieben, was bei vielen Versionen recht viel 
Redundanz mit sich bringt.

Meine Frage lautet daher:

Kann man ein Makefile so aufbauen, dass sich (idealerweise) folgender 
Aufruf ergibt:
1
make flash version1   // Übersetze und programmiere version1
2
make make version1    // Übersetze version1

Also quasi ein vorangestellter Aktionstoken.


Hat jemand eine Idee?
Moderator #4347906
Lesenswert?

Du kannst eine implizite Regel nach folgendem Muster erstellen:

1
flash%:
2
  echo "target = $@"
3
  echo "stem   = $*"

Diese Regel wird für alle Targets angeandt, die mit "flash" beginnen.

In $@ steht dann wie üblich das Target und in $* der Teilstring davon,
der dem % in der impliziten Regel entspricht:

1
$ make flashversion1
2
target = flashversion1
3
stem   = version1

Wichtig dabei ist natürlich, dass der Präfix "flash" nur für diesen
Zweck verwendet wird. Eine Quellcodedatei namens "flashfuncs.c" kann zu
Problemen führen. Deswegen ist es besser, das Pattern "%.flash" anstelle
von "flash%" zu benutzen.
Gast #4348046
Lesenswert?

Man kann auch beim Aufruf von make Variablen setzen. Z.B. :
1
make all CFG=Release
Dann ergibt $(CFG) im Makefile den Text Release, ohne dass man nach dem 
Ende von make eine Umgebungsvariable rumdümpeln hat.
#4349538
Lesenswert?

Ich habe mit Yalu's Vorschlag experimentiert, folgender einfacher 
(rekursiver) Lösungsansatz:
1
.PHONY: all
2
all: apple orange
3

4
.PHONY: apple
5
apple: apple.hex
6

7
.PHONY: orange
8
orange: orange.hex
9

10
# ****** Start of magic ******
11

12
.PHONY: %.flash
13
%.flash:
14
    make $*
15
    @echo flash $*.hex
16

17
# ****** End of magic ********
18

19
# Create concrete files
20
apple.hex:
21
    echo I am an apple >$@
22

23
orange.hex:
24
    echo I am an orange >$@

Die Aufrufe sehen dann aus wie folgt:
1
make                    // Alle Versionen übersetzen
2
make all                // Alle Versionen übersetzen
3
make apple              // Apple erzeugen
4
make orange             // Orange erzeugen
5
make apple.flash        // Apple erzeugen und programmieren

aber auch:
1
make orange apple.flash // Orange erzeugen, Apple erzeugen und programmieren

Danke an Alle für die Vorschläge!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren