Forum: Compiler & IDEs make Kommandozeile


von Eddy C. (chrisi)


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?

: Bearbeitet durch User
von Peter II (Gast)


Lesenswert?

Eddy C. schrieb:
> Hat jemand eine Idee?

wie machen das mit einer umgebungsvariable.
1
set Version=xyz
2
make ...

anhängig von der Variable werden dann verschiedene Defines gesetzt.

von Yalu X. (yalu) (Moderator)


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.

: Bearbeitet durch Moderator
von fop (Gast)


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.

von Eddy C. (chrisi)


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!

von Paul B. (paul_baumann)


Lesenswert?

Eddy C. schrieb:
> make apple              // Apple erzeugen
> make orange             // Orange erzeugen

Na, da hat's doch gefruchtet.
;-)

MfG Paul

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.