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
- 5056 megtekintés
Hozzászólások
gondolom, az OS valtozot valaminek be kene allitani (pl. configure script), ami nelkul az eletben nem lesz a $OS egyenlo a "Windows_NT"-vel...
--
"Pontosan ez a ti bajotok. Ez a kurva nagy csőlátás. [...]" (bviktor)
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
[Off]
Nekem csak UNIX-aim vannak, ott ez megy:
PLATFORM := $(shell uname)
ifeq ($(PLATFORM),AIX)
...
endif
ifeq ($(PLATFORM),Linux)
...
endif
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
Akkor debuggolj. És olvasd el Elbandi hozzászólását.
debug:
@echo 'OS="${OS}"'
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
OS és OSTYPE nem ugyanaz.
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
szerintem nemkell az idezojel a winnt korul.
--
A vegtelen ciklus is vegeter egyszer, csak kelloen eros hardver kell hozza!
- A hozzászóláshoz be kell jelentkezni
Az volt az alap, ugy sem megy.
/sza2
- A hozzászóláshoz be kell jelentkezni
Van valami kulonos oka a kezzel irt makefile hasznalatanak? A kulonfele makefile generatorok (autotools, cmake, qmake, stb) tamogatjak az ilyesmit.
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
Nem irigyellek....
Itt pl a SystemRoot kornyezeti valtozo vizsgalatat javasolja a kollega hogy kitalalja, hogy Win-en fut:
http://stackoverflow.com/questions/4058840/makefile-that-distincts-betw…
Ami nem Windows ott meg valoszinuleg van uname...
- A hozzászóláshoz be kell jelentkezni
Megtalaltam ezt is, annyira nem tetszett, de most kiprobaltam, igy sem viszi :-(
ifdef SystemRoot
os=windows
else
os=linux
endif
os=linux mindig, akarhol futtatom.
/sza2
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
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"
???
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni