Hallo zusammen,
da ich "staendig" zwischen einem Linux- und einem Windowssystem bei der
AVR Programmierung hin und her springe, moechte ich gern, dass das
Makefile selbststaendig erkennt, um welches Betriebssystem es sich
handelt. So muss ich naemlich immer die AvrDude Optionen zum flashen neu
setzen, was irgendwie nervt ...
Freue mich auf eure Hinweise
Sonst einen schoenen Tag
> So muss ich naemlich immer die AvrDude Optionen zum flashen neu setzen,...
Wieso? Ich würde per Makefile dafür sorgen, dass Avrdude die
Grundkonfiguration (welcher Programmer an welcher Schnittstelle hängt)
aus einer Datei liest und dann eine entsprechende Konfigurationsdatei
auf jedem System vorhalten.
Hi Stefan,
ja, ist sicher eine nette Idee, aber ich hol mir eben eine Kopie des
Gesamtprojekts vom SVN und moechte dass ich das ganze ohne weitere
Manipulationen flashen kann. Und mit den Konfigurationsfiles waere ja
auch ein neuer Eintrag noetig.
Poseidonius
Hallo,
auf vielen Linux-Systemen wird die Umgebungsvariable OSTYPE auf 'linux'
gesetzt. Ein
ifeq(OSTYPE,linux)
...
endif
könnte also das sein, was du suchst.
Ciao, Fabian
> ja, ist sicher eine nette Idee, aber ich hol mir eben eine Kopie des> Gesamtprojekts vom SVN und moechte dass ich das ganze ohne weitere> Manipulationen flashen kann. Und mit den Konfigurationsfiles waere ja> auch ein neuer Eintrag noetig.
Ich sehe das Problem nicht.
Es nimmt sich nix, ob du jedesmal in der aktuell von SVN gezogenen Kopie
des Makefiles die OS-Abfrage einfügst oder beim gleichen Makefile beim
Aufruf von AVRDUDE die -C Option einbaust.
Und das "Einbauen" kannst du ja automatisieren, in dem du ein neues
Target "burnmybaby" per cat an das von SVN gezogene Makefile anhängst
oder per sed das originale Burn-Target manipulierst.
> ifeq($(OSTYPE),linux)
Wieder was gelernt ;-)
Ok ... jetzt muss ich nur noch ausprobieren wie das Makefile unter
Windows drauf reagiert, wenn die Umgebungsvariable OSTYPE nicht bekannt
ist. Beendet es die Abarbeitung oder ...?
Vielen Dank Euch erstmal fuer Eure schnelle Hilfe
Poseidonius
Du kannst folgendes tun:
Du hast ein Makefile.linux und ein Makefile.windows. Das make rufst Du
dann mit dem Parameter -f auf, unter Linux also "make -f Makefile.linux"
und unter Windows "make -f Makefile.windows". Die Projektspezifischen
make-Regeln packst Du dann in eine dritte Datei.
mfg, Stefan.
Mein avrdude holt sich die Einstellung per Default aus dem
Homeverzeichnis in ~/.avrduderc. Ich weiß nicht genau, wie es das unter
Windows macht. Ich muß im Makefile nur noch den Controllertyp angeben,
der Rest ist dem Projekt wurscht, weil avrdude ihn sich von außerhalb
holt.
Ok, was mache ich falsch mit der ifeq Syntax?
TEST = 1
test:
ifeq($(TEST),1)
@echo "Test ist 1"
else
@echo "Test ist ungleich 1"
endif
denn ich bekomme die Fehlermeldung:
D:\...\source>make test
ifeq(1,1)
/usr/bin/sh: -c: line 1: syntax error near unexpected token `ifeq(1,1)'
/usr/bin/sh: -c: line 1: `ifeq(1,1)'
make: *** [os] Error 258
Ich arbeite mit WinAVR ...
Vielen Dank für Eure Hinweise und ein schönes Wochenende
Vielleicht dies:
"Extra spaces are allowed and ignored at the beginning of the
conditional directive line, but a tab is not allowed. (If the line
begins with a tab, it will be considered a command for a rule.)"
http://www.gnu.org/software/make/manual/make.html#Conditional-Syntax
sorry, wenn ich mich wie der letzte Depp anstelle ...
nach dem Link von Stefan, dürfen keine Tabs eingefügt sein, also hab ich
alles an den Rand gequetscht und bekomme die Fehlermeldung "missing
seperator"
test:
ifeq($(TEST),1)
@echo "Test ist 1"
else
@echo "Test ist ungleich 1"
endif
mmmh ?
Tabs müssen eingefügt werden. Es kommt zuerst eine Zeile mit
Target-Name und Abhängigkeiten, dann kommt, durch einen Tab (und nur so)
eingerückt das, was ausgeführt werden soll.
"Just tried a few more combinations of things.
Can you believe that problem is caused by
the lack of a space after "ifeq" in "ifeq(...)"???"
http://www.dbforums.com/showthread.php?t=699079
> Tabs müssen eingefügt werden. Es kommt zuerst eine Zeile mit> Target-Name und Abhängigkeiten, dann kommt, durch einen Tab (und nur so)> eingerückt das, was ausgeführt werden soll.
Korrekt bei Kommandos. Nicht korrekt bei Conditionals. Steht so im
Manual s.o. Daher mein "Vorschlag"
ifeq ($(TEST),1)
<TAB>@echo "Test ist 1"
else
<TAB>@echo "Test ist ungleich 1"
endif
Mist, jetzt müsste man Editieren können... füge noch das Target ein!
test:
ifeq ($(TEST),1)
<TAB>@echo "Test ist 1"
else
<TAB>@echo "Test ist ungleich 1"
endif
Mmmh, ich dachte ich hätte diese Kombination auch ausprobiert ... aber
vielen Dank, jetzt tut's prima mit der OS Unterscheidung und wenn es
jemanden interessiert:
AVRDUDE = avrdude
ifeq ($(OSTYPE),linux)
AVRDUDE_FLAGS = -P /dev/parport0
else
AVRDUDE_FLAGS = -P lpt1
endif
AVRDUDE_FLAGS += -v
...
Schönes Wochenende
Ah, jetzt verstehe ich worauf Du hinaus willst.
Du solltest in Deine avrdude.rc die Zeile
default_parallel = "/dev/parport0"
bzw. in Windows
default_parallel = "lpt1"
einfügen. Das ist wesentlich besser, als das in das Makefile zu packen.
Auf einem anderen Rechner stimmt das sonst wieder nicht und Du müsstest
das Makefile anpassen.
Also raus mit dem Kram!
mfg, Stefan.