www.mikrocontroller.net

Forum: Compiler & IDEs Makefile macht mich wahnsinnig - Variable Override?


Autor: Michael Z. (incunabulum)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin!

Bis jetzt verwende ich eine gemeinsame Sammlung an Quellen für mehrere 
Projekte auf verschiedenen AVR Chips (mega16, mega8 etc). Diese werden 
für jedes Projekt über EXTRAINCDIRS und VPATH eingebunden. Klappt prima. 
Ändere ich etwas an den gemeinsamen Quellen, so muss ich allerdings für 
jede Plattform testen, ob dies damit auch funktioniert. Das stört auf 
Dauer!

Daher gibt es ein kleines Python-Skript, welches dynamisch aus einem 
generischen Testmakefile für verschiedene Targets automatisiert 
compiliert. Und nun das Problem:

Im Makefile habe ich Definitionen wie z. B.:
CPPSRC =   libavr/tools/EepEnduranceStore.cpp \
    libavr/drivers/lcds/DogSpi.cpp \
    libavr/drivers/sensors/PressSensors.cpp \
    libavr/drivers/I2cEeprom.cpp \
    libavr/drivers/Pcf8574.cpp 

Diesen will ich beim Aufruf von make über die override Funktion 
umdefinieren, so dass ein Befehl entsteht wie folgt:
make CPPSRC=libavr/tools/EepEnduranceStore.cpp libavr/drivers/lcds/DogSpi.cpp ... MCU=atmega8 lib

Nur, ich kann Quotes verwenden wie ich will ("'`´), das Makefile fliegt 
mir entweder um die Ohren oder (ohne Quotes) wird nur die erste Datei 
erkannt. Die anderen werden ignoriert.

Also, wie kann ich per Kommandozeile eine Liste mehrerer Einträge 
mittels Variablenüberschreibung übergeben? Ich hab keinen Plan!

Die Make-Hilfe 
(http://www.apl.jhu.edu/Misc/Unix-info/make/make_9.html#SEC83) hilft 
leider auch nicht weiter. Dort steht z. B.:
Each time you run make, you can override this value if you wish. 
For example, if you say `make CFLAGS='-g -O'', each C compilation 
will be done with `cc -c -g -O'. (This illustrates how you can use 
quoting in the shell to enclose spaces and other special characters
in the value of a variable when you override it.)

Weiss da jemand weiter??? Danke, Michael

Autor: MAKE (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit export kannst du die Variablen global bekannt machen.

z.B.:

CC=avr-gcc
INCLUDE=/source/lib

export CC INCLUDE

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael Z. wrote:
> Bis jetzt verwende ich eine gemeinsame Sammlung an Quellen für mehrere
> Projekte auf verschiedenen AVR Chips (mega16, mega8 etc). Diese werden
> für jedes Projekt über EXTRAINCDIRS und VPATH eingebunden. Klappt prima.
> Ändere ich etwas an den gemeinsamen Quellen, so muss ich allerdings für
> jede Plattform testen, ob dies damit auch funktioniert. Das stört auf
> Dauer!

Entweder Du hast nur sehr wenig Projekte und/oder sehr viel Zeit.

Ich würde wahnsinnig werden, wenn ich sämtliche Projekte immer neu 
prüfen müßte.

Globale Libs und Includes werden nie geändert, basta!

Wenn ich eigene Libs ändere, dann kommen die immer als lokale Kopie mit 
ins Projekt. Damit bleibt ein Projekt immer lauffähig, egal wie alt es 
ist.


Zusätzlich schreibe ich auch die GCC-Version mit rein und hebe diese 
GCC-Version mit auf. Wenn dann Änderungen nicht mehr funktionieren, wird 
eben die passende GCC-Version aktiviert.


Ich habs schon manchmal erlebt, daß alte Sourcen komplett weggeschmissen 
wurden, weil keiner mehr wußte, welche Compilerversion und welche 
modifizierte Lib dazugehörte.
Die waren schlichtweg unkompilierbar.


Peter

Autor: Michael Z. (incunabulum)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Geht leider auch nicht. Die Definition z. B. von MCU per Kommandozeile 
wie auch per SET / EXPORT klappt ja problemlos.

Was nicht klappt ist eine Liste von mehreren Einträgen zu übergeben, die 
auch wirklich als mehrere Einträge erkannt und entsprechend verwendet 
werden.

Oder seh ich den Wald vor lauter Bäumen nicht?
cu, Michael

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht ein dumme Frage, aber:
Windows oder Linux?

Oliver

Autor: Michael Z. (incunabulum)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Windows, leider :-)

Michael

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Windows, leider :-)

:-)

Allerdings funktioniert bei mir mit win XP prof, Winavr2007525
make SRC="main.c file1.c files2.c"

Oliver

Autor: Michael Z. (incunabulum)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Oliver,

da is er wieder, der Wald... Mit "src1.cpp src2.cpp etc" funktioniert es 
doch. Scheint so, als hätte ich mich bei den zig verschiedenen Quotes 
verheddert. Danke dir!

Und für, die es interessiert, als Attachment meine "Lösung". In den zwei 
Konfigurationsdateien werden die AVR targets sowie die source 
directories angegeben. Zeilen mit # am Anfang werden ignoriert. Das 
Makefile ist generisch und sollte nicht angepasst werden müssen.

runMakeTests.py sucht in den angegebenen source directories (inkl. 
Unterverzeichnissen) nach *.cpp Dateien und kompiliert diese für jedes 
angegebene target.

Mag zwar eine Vergewaltigung von make hin zu automake und Konsorten 
sein, funktioniert aber bei mir wunderbar. Das Makefile ist statisch, 
neue Dateien werden einfach in den source tree kopiert, fertig.

cu, Michael

Autor: Immingealleld (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
I’d prefer reading in my native language, because my knowledge of your 
languange is no so well. But it was interesting!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.