[Megoldva] OS fuggo ertekadasok Makefile-ban

Fórumok

Udv,

Egy Makefile-ban kellene valtozoknak kulonbozo erteket adnom az operacios rendszertol fuggoen. Mindenhol a lenti peldat talalom, de nem mukodik. Mindig az 'else' agban levo ertekek lesznek a valtozokban. Kiegeszitettem 2 sorral, ami persze nem mukodik ("*** missing separator."), de ez nem is cel, viszont azt mutatja, hogy az $(OS) erteketol fuggoen, kulonbozo reszre megy a make, tehat mintha ez jol mukodne.


ifeq ($(OS),'Windows_NT')
echo WIN
RM = del
NULL = nul
else
echo LIN
RM = rm -f
NULL = /dev/null
WINE = wine cmd /c
endif

Hogy tudnam megoldani a problemat?

Koszi,

/sza2

Hozzászólások

Tulajdonkeppen pont ez a lenyeg: az "OS" Windows alatt egy kornyezeti valtozo, ami ugy tunik mindig be van allitva, igy abban a kornyezetben is, ahonnan a make-et futtatom.

Egyebkent mehetnek a masik oldalrol is, Linux alatt OSTYPE van, aminek (legalabbis nalam, Debian alatt) 'linux-gnu' az erteke. De ugyan az az eredmeny: nem mukodik.

/sza2

[Off]
Nekem csak UNIX-aim vannak, ott ez megy:

PLATFORM := $(shell uname)
ifeq  ($(PLATFORM),AIX)
...
endif

ifeq ($(PLATFORM),Linux)
...
endif

Windows es Linux kozott kellene donteni, Win alatt uname vagy van, vagy nincs (nalam epp nincs, csak egy standalone make van). Persze mondhatnam, hogy ha nics, akkor biztos Windows, ha van akkor megnezem mit ad vissza, etc., de valami elegansabbat kepzeltem (mint a pelda fentebb).

Nem tudom mit rontok el, rengeteg helyen azt a megoldast latom, gondolom mukodnie kellene...

/sza2

Igen, ezt megtettem, most eppen azon agyalok, hogy miert van az, hogy bash-ben

# echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
# echo $OSTYPE
linux-gnu

Makefile-bol pedig

@echo 'OS="${OS}"'
OS=
@echo 'PATH="${PATH}"'
PATH ="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games"

Ez mi a fenetol van???

/sza2

My fault. Termeszetesen Linux alatt OSTYPE-ot, Windows alatt OS-t probaltam. Mindket helyen letezik a megfelelo es az erteke is jo shell-bol lekerdezve.

OS=Windows_NT
OSTYPE=linux-gnu

Igazabol barmelyik jo lenne (meg igazabbol mindkettonek kellene mukodni), mert csak Linux es Windows jon szoba, tehat akarmelyiket hasznalom, ha nem teljesul a feltetel, akkor a masik ag lesz.

/sza2

szerintem nemkell az idezojel a winnt korul.

--
A vegtelen ciklus is vegeter egyszer, csak kelloen eros hardver kell hozza!

Van valami kulonos oka a kezzel irt makefile hasznalatanak? A kulonfele makefile generatorok (autotools, cmake, qmake, stb) tamogatjak az ilyesmit.

Igen, Silabs IDE workspace file-bol generalok Makefile-t, mert a sajat IDE rettenetes, viszont igy be tudom huzni pl. Eclipse-be is. Nem csak en hasznalom, es ezzel a megoldassal csak egy standalone make-re, valamint a wsp-bol Makefile-ba konvertalo utility-re van szukseg. Bonyolitas meg, hogy Keil C51 forditot kell a Makefile-bol inditgatni, nem GCC-t es amig a GCC-nel visszateresi ertek 0=lefordult (akar warning-okkal is) 1=nem fordult le, addig a Keil eseten 0=ok, 1=warning, 2=error...

/sza2

Szerintem el vagy átkozva.

C:\home\zsiga\proba>make debug
PATH="/c/Program Files/PC Connectivity Solution/:/c/WINNT/system32:/c/WI
NNT:/c/WINNT/System32/Wbem:/c/tools:/c/Program Files/cvsnt:/mingw/bin:/u
sr/bin:/c/Borland/BCC55/Bin:/c/jdk/bin"
OS="Windows_NT"

C:\home\zsiga\proba>type Makefile
debug:
        @echo 'PATH="${PATH}"'
        @echo 'OS="${OS}"'

C:\home\zsiga\proba>make -v
GNU Make 3.81
Copyright (C) 2006  Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.

This program built for i686-pc-msys

Konnyen lehet... A helyzet nemileg arnyalodott.

A Makefile most:

debug:
@echo 'PATH="${PATH}"'
@echo 'OS="${OS}"'
@echo 'OSTYPE="${OSTYPE}"'

Linux alatt egyaltalan nem mukodik. Windows alatt viszont fugg attol, hogy command prompt-bol (megy) vagy Eclipse-bol futtatom (nem megy).

Linux:

$ make
PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games"
OS=""
OSTYPE=""

GNU Make 3.81
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.

This program built for i486-pc-linux-gnu

Windows command prompt:

PATH="C:\Program Files (x86)\GnuWin32\bin\"
OS="Windows_NT"
OSTYPE=""

Windows / Eclipse:

PATH="C:\Program Files (x86)\GnuWin32\bin\"
OS=""
OSTYPE=""

GNU Make 3.81
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.

This program built for i386-pc-mingw32

/sza2

Edit:

Ezt nem igazan ertem:

$ set | grep OSTYPE
OSTYPE=linux-gnu

$ make
OSTYPE=""

$ export OSTYPE=$OSTYPE
$ make
OSTYPE="linux-gnu"

???

Csináltam egy hasonló Makefile-t linuxon, ment:

$ OSTYPE=linux make debug
OSTYPE="linux"
$ OSTYPE=linux; make debug
OSTYPE=""
$ export OSTYPE=linux; make debug
OSTYPE="linux"

Szerk: megnézve a példádat, nem értem, hogy mit nem értesz: a make-hoz csak az exportált változók jutnak el a shellből, a többi nem.

Ok, ez igaz. Viszont igy a fenti elgondolas nem igazan hasznalhato. bash-ben alapbol az OSTYPE nincs exportalva (persze lehet a make elott exportalni).

Vegulis uname lett belole, Linux-on van, tehat el tudom donteni, hogy Linux-e a platform, Windows-on meg ha van, ha nincs, ugysem "Linux"-ot ad vissza.

/sza2