Forum: Mikrocontroller und Digitale Elektronik Mit Makefile Betriebssystem erkennen?


von Poseidonius (Gast)


Lesenswert?

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

von Stefan (Gast)


Lesenswert?

> 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.

von Poseidonius (Gast)


Lesenswert?

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

von Fabian S. (rosepeter)


Lesenswert?

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

von Fabian S. (rosepeter)


Lesenswert?

> ifeq(OSTYPE,linux)

ups - ich meinte natürlich

ifeq($(OSTYPE),linux)

Ciao, Fabian

von Stefan (Gast)


Lesenswert?

> 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 ;-)

von Poseidonius (Gast)


Lesenswert?

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

von Stefan M. (Gast)


Lesenswert?

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.

von Poseidonius (Gast)


Lesenswert?

elegante Loesung, danke

von Rolf Magnus (Gast)


Lesenswert?

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.

von Poseidonius (Gast)


Lesenswert?

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

von Stefan (Gast)


Lesenswert?

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

von Stefan (Gast)


Lesenswert?

Oder vielleicht dies:

Fehlendes Leerzeichen zwischen ifeq und (

von Poseidonius (Gast)


Lesenswert?

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 ?

von Stefan (Gast)


Lesenswert?

> "missing seperator"

Fehlendes Leerzeichen zwischen ifeq und ( ?

von Rolf Magnus (Gast)


Lesenswert?

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.

von Stefan (Gast)


Lesenswert?

"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

von Stefan (Gast)


Lesenswert?

> 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

von Stefan (Gast)


Lesenswert?

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

von Poseidonius (Gast)


Lesenswert?

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

von Stefan M. (Gast)


Lesenswert?

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.

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.