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


von Michael Z. (incunabulum)


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.:
1
CPPSRC =   libavr/tools/EepEnduranceStore.cpp \
2
    libavr/drivers/lcds/DogSpi.cpp \
3
    libavr/drivers/sensors/PressSensors.cpp \
4
    libavr/drivers/I2cEeprom.cpp \
5
    libavr/drivers/Pcf8574.cpp

Diesen will ich beim Aufruf von make über die override Funktion 
umdefinieren, so dass ein Befehl entsteht wie folgt:
1
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.:
1
Each time you run make, you can override this value if you wish. 
2
For example, if you say `make CFLAGS='-g -O'', each C compilation 
3
will be done with `cc -c -g -O'. (This illustrates how you can use 
4
quoting in the shell to enclose spaces and other special characters
5
in the value of a variable when you override it.)

Weiss da jemand weiter??? Danke, Michael

von MAKE (Gast)


Lesenswert?

Mit export kannst du die Variablen global bekannt machen.

z.B.:

CC=avr-gcc
INCLUDE=/source/lib

export CC INCLUDE

von Peter D. (peda)


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

von Michael Z. (incunabulum)


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

von Oliver (Gast)


Lesenswert?

Vielleicht ein dumme Frage, aber:
Windows oder Linux?

Oliver

von Michael Z. (incunabulum)


Lesenswert?

Windows, leider :-)

Michael

von Oliver (Gast)


Lesenswert?

>Windows, leider :-)

:-)

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

Oliver

von Michael Z. (incunabulum)


Angehängte Dateien:

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

von Immingealleld (Gast)


Lesenswert?

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

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.