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
Walterwenn du nicht in einem makefile verschiedene Targets definieren willst, könntest du auch mit verschiedenen makefiles arbeiten
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.
@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
Es lassen sich "make"-übliche Variablen mitgeben: make D=-DVERS1 die dann im Makefile weitergereicht werden: CFLAGS += $D
@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.
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.
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.