Forum: Compiler & IDEs Make und externe Makro-Defines


von Günter R. (galileo14)


Lesenswert?

Hallo,

ist es möglich, dem Make-Programm (make.exe) als Parameter eine 
Makro-Definition mitzugeben, die es zusätzlich zu dem, was im Makefile 
spezifiziert ist, auswertet?

Hintergrund der Frage ist folgendes: Mit meinem Quellencode kann ich 
mehrere Programmversionen (für unterschiedliche Target-Boards) erzeugen, 
indem per "Conditional Compile" diverse Code-Fragmente ausgetauscht 
werden, je nachdem, welche Makros definiert sind. Die Makros kann ich 
entweder im Code einbauen (bzw. die gerade nicht benutzten 
"auskommentieren"), was aber den Nachteil hat, daß jedesmal in den 
Sourcecode eingegriffen werden muß, wenn eine andere Version erzeugt 
werden soll. Bessere Methode: Sourcecode-extern die Makros definieren, 
beim AVR-Studio in den "Custom-Options". Aber auch hierbei müßte man in 
die Projekt-Optionen eingreifen, um z.B. alle drei relevanten Versionen 
zu erzeugen.

AVR-Studio erzeugt ja aus den Projektoptionen ein passendes Makefile und 
ruft damit "make.exe" auf. Wenn man das richtige Subdirectory aktiviert 
(i.d.R. das "default"), so kann man dort mittels einer DOS-Box 
"make.exe" aufrufen und es geschieht dasselbe wie unter AVR-Studio mit 
F7 bzw. "Build". "make.exe" kann auch aus einem Batch-File heraus 
aufgerufen werden.

Mir schwebt daher ein Batch-File vor, das etwa wie folgt aussehen 
könnte:

make clean
make -DVERS1
copy prog.hex prog1.hex
make clean
make -DVERS2
copy prog.hex prog2.hex
make clean
make -DVERS3
copy prog.hex prog3.hex

Damit hätte ich meine drei relevanten Versionen als Hex-Files erzeugt 
(das von "make" erzeugte Hex-File mag in diesem Beispiel "prog.hex" 
heißen).

Nur: "make.exe" kennt wohl keine Kommandozeilenoption "-D" (so wie 
diverse Compiler sie kennen), sodaß diese Spezifikationsmöglichkeit für 
Makros so nicht funktioniert. In das Makefile eingreifen mag ich aber 
auch nicht. Kennt jemand somit eine Möglichkeit, dem "make.exe" die 
Makros zuzuführen, ohne daß das Makefile angerührt werden muß?

Oder gibt's einen anderen Weg, der zum gleichen Ziel führt?

Danke.
Günter

von Walter (Gast)


Lesenswert?


Walterwenn du nicht in einem makefile verschiedene Targets definieren 
willst, könntest du auch mit verschiedenen makefiles arbeiten

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


Lesenswert?

Der make-Ansatz würde erfordern, dass du für jedes Target-Board
unterschiedliche Dateinamen benutzt -- einschließlich unterschiedlicher
Namen für die .o-Dateien, d.h. foo.c generiert nicht mehr foo.o,
sondern foo_board1.o, foo_board2.o usw.

Mit diesen kannst du dann die Kette von "target: prerequisite"-Regeln
aufbauen.

Wie "make" funktioniert, sollte man für sowas allerdings verstanden
haben.  AVR Studio kannst du hier als Hilfe komplett vergessen, und
auch Mfile ist für die Standardfälle gebaut.

von Günter R. (galileo14)


Lesenswert?

@Jörg:

Ich denke nicht, daß man unterschiedliche Dateinamen für die 
Zwischenfiles benötigt; ein "make"-Lauf erzeugt doch letztlich ein 
Hex-File (nichts anderes interessiert ja); wenn man dieses unter neuem 
Namen rauskopiert, wie ich es oben tun möchte, kann man sofort einen 
neuen "make"-Lauf starten und danach das gleiche wieder tun. Lediglich 
müßte man dem "make" jeweils ein Makro zuführen, das es dem makefile 
hinzufügt, damit die entsprechenden Passagen des Source-Codes zum Zuge 
kommen.

Die von mir genannten Target-Boards haben alle den gleichen Prozessor, 
nur eine geringfügig andere Hardware-Ausstattung.

Es käme also nur darauf an, ein Makro zuzuführen. In der 
make-Online-Hilfe von gnu.org 
(http://www.gnu.org/software/make/manual/make.html#Running) habe ich 
gelesen, daß man "Overrides" für Variablen setzen kann; speziell taucht 
dort die Form "make CFLAGS='-g -O'" auf; wenn auch "make 
CFLAGS+=-DVERS1" möglich wäre, wäre das die Lösung. Aber schon die 
angeführte Form funktioniert bei mir nicht, schon gar nicht die zweite; 
das verstehe ich nicht.

Ich weiß, daß Du Windows und AVR-Studio nicht magst. Aber immerhin 
erzeugt AVR-Studio ein Makefile, das mit externem make-Lauf den gleichen 
Output bringt wie sein Build (wie sollte es auch anders sein). So sollte 
obige Methode eigentlich funktionieren; nur an der Makro-Geschichte 
hapert es.

Gibt's die Online-Hilfe eigentlich auch als PDF-Files? Wenn ja, wo?

Danke für Deine Info.

Günter

von A.K. (Gast)


Lesenswert?

Es lassen sich "make"-übliche Variablen mitgeben:
   make D=-DVERS1
die dann im Makefile weitergereicht werden:
   CFLAGS += $D

von Günter R. (galileo14)


Lesenswert?

@A.K.:

Sehr herzlichen Dank! Auf besagte Weise funktioniert die 
Makro-Definition. Ich habe also im Source-Code die Makro-Definition 
entfernt, im AVR-Studio unter "Custom Options / [All files]" das "$D" 
hinzugefügt und einmal einen Build gemacht, sodaß AVR-Studio das neue 
Makefile erzeugt hat; dort steht dann das "$D" drin.

Nun konnte ich mit "make D=-DVERS1" usw. die Programme erzeugen. Somit 
funktioniert obige Methode nun.



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


Lesenswert?

Günter R. wrote:

> Ich denke nicht, daß man unterschiedliche Dateinamen für die
> Zwischenfiles benötigt; ein "make"-Lauf erzeugt doch letztlich ein
> Hex-File (nichts anderes interessiert ja); wenn man dieses unter neuem
> Namen rauskopiert, wie ich es oben tun möchte, kann man sofort einen
> neuen "make"-Lauf starten und danach das gleiche wieder tun.

Meine Ausführungen bezogen sich darauf, dass du das alles allein im
Makefile ohne irgendwelche wrapper scripts machen möchtest, also
einfach "make" oder "make all" eingegeben, und alle drei Hexfiles
fallen hintereinander raus.  Das geht, braucht aber ein wenig
Verständnis dafür, wie "make" funktioniert sowie zwingend ein
manuell editiertes Makefile, da die gängigen Templates (egal ob
das von WinAVR, Mfile oder das von AVR Studio generierte Makefile)
auf derartige Sonderwünsche nicht eingehen können.

Wenn du's natürlich rein mit einem Wrapper lösen willst, geht das
so, wie zuvor beschrieben.

von Günter R. (galileo14)


Lesenswert?

Hallo, Jörg,

Du hast natürlich schon recht; wenn man's in einem einzigen 
Makefile-Lauf machen möchte, muß man so vorgehen, wie Du's beschrieben 
hast. Das ist natürlich eleganter als meine Batch-Methode, aber wie Du 
ganz recht schreibst, muß man tiefer in die Makefile-Syntax einsteigen, 
das wollte ich aus Zeitgründen im Moment nicht tun.

Da ich normalerweise mit dem AVR-Studio arbeite und dort die 
Projektoptionen setze, ist's natürlich für mich bequem, wenn ich das 
dort erzeugte Makefile ohne Änderung auch für die Batch-Generierung 
aller Versionen nutze, und das geht jetzt.

Nochmals die Frage: gibt es die Online-Manual von gnu.org auch als 
PDF-Files zum Download? Ich konnte die nicht finden.

Günter

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


Lesenswert?

Günter R. wrote:

> Nochmals die Frage: gibt es die Online-Manual von gnu.org auch als
> PDF-Files zum Download? Ich konnte die nicht finden.

Weiß ja nicht, was du suchst, aber wenn ich mir z. B. die Seite vom
GNU make ansehe:

http://www.gnu.org/software/make/manual/

dann gibt's da einen PDF-Link:

http://www.gnu.org/software/make/manual/make.pdf

von Günter R. (galileo14)


Lesenswert?

Herzlichen Dank, Jörg, das ist es genau.

Hatte einen anderen Link (http://www.gnu.org/manual/manual.html), da 
gibts keine PDF's (bin wohl eine Ebene zu tief eingestiegen).

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.