Szasztok!
Lehet alapkérdés, meg az is lehet hogy így nem megoldható, de miután a gnu make-et a-z-ig elolvastam, mégsem bírom megcsinálni.
A probléma a következő: van egy makefile-om, aminek az egyik targetje egy shell parancs segítségével beállít egy változót, ez eddig oké is, de ezt a változó értéket egy másik targetben szeretném felhasználni.
Most kb így néz ki:
target1: VALTOZO=$(shell valami_parancs_aminek_a_kimenete_kell)
target1:
echo $(VALTOZO)
target2: target1
echo $(VALTOZO)
A target1 echo-ja szépen kiírja, de target2 már nem. Próbálkoztam különböző direktívákkal (override etc) hátha én értettem a manualban félre valamit, de nem. Van egyáltalán lehetőség arra hogy targetből felülírjunk egy global változót?
Köszi
- 1460 megtekintés
Hozzászólások
Naaa, ennyire nem lehet nehéz a kérdés :)
Senki? Mert akkor fogom magam aztán lerakom egy tempfájlba a változót aztán visszaolvastatom, de ez meg olyan gány megoldás...
- A hozzászóláshoz be kell jelentkezni
A pontos választ nem tudom, de van egy elég valószínű tippem. Szerintem a Make önálló héjat indít minden ilyen műveletnél, vagyis ha azt akarod, hogy target2 is lássa a target1 által beállított változó tartalmát, akkor azt ott exportálni kell.
Hangsúlyozom: csak tipp.
- A hozzászóláshoz be kell jelentkezni
Na igen az oké hogy külön shell, de mivel a változó nem shell változó, hanem make ezért ez nem jelenthet problémát. Azért köszi.
- A hozzászóláshoz be kell jelentkezni
Ezt valóban félreértettem.
- A hozzászóláshoz be kell jelentkezni
target1: VALTOZO=...
A valtozot csak target1 -nek allitottad be. Tedd egy sorral feljebb, maris menni fog.
Kb igy:
VALTOZO=$(shell echo bar)
target1:
echo $(VALTOZO)
target2:
echo $(VALTOZO)
- A hozzászóláshoz be kell jelentkezni
Köszi, így most oké. Ezek szerint akkor a változó értékadása minden esetben sikeresnek minősül? Csak azért kérdezem, mert a változó beállítása csak akkor lehetséges, ha a make már lefuttatta a fordítást (mivel a bináris fájl egyik tulaljdonsága alapján állítja be). Ezért akartam egy másik targettet, ami a legvégső target egyik előfeltétele, a fordító target után.
Köszi mégegyszer!
- A hozzászóláshoz be kell jelentkezni
Ha jol remlik, akkor a valtozo minden alkalommal, amikor hasznalodik, ujra es ujra kiertekelodik. Tehat amig a file ami kell, le nem fordult, addig vagy ures lesz, vagy valami random erteke lesz, attol fuggoen hogy mi a shell parancs amit kiadtal.
SZVSZ elegge ganynak hangzik a fentebbi leiras, esetleg gondold at, nem lehet-e "make-esebben" megcsinalni, target dependencykkel & hasonlok, shell-el beallitott valtozo nelkul.
Pl egy olyan, hogy:
infofile.foo: abinarisamikell
shellparancsamitfuttatnal >infofile.foo
target1: infofile.foo
yadayada `cat infofile.foo`
Tehat amit a shell parancssal kinyernel valtozoba, azt lemented egy (ideiglenes, generalt) fileba, es arra a filera dependelnek azok a targetek, amelyek hasznaltak korabban a valtozot, es valtozo helyett a file tartalmat hasznaljak.
Ez sokkal tisztabb, es make -j -t sem zakkantja meg (annyira).
- A hozzászóláshoz be kell jelentkezni
A make-változók csak egyszer értékelődnek ki, a Makefile feldolgozása közben, még az első targetek végrehajtása előtt. Nem lehet őket felülírni (a += stb. szimbolikusak). Tehát egy target egy utasításából egy értéket már csak env var-ban vagy fájlban tudsz továbbadni. Az eredeti kérdésedre tehát nem a válasz.
A targeteknek lehet azonos nevű változója, amit a dependenciafában 'lefelé' felül lehet bírálni, de ez az érték nem érhető el 'később'. Példa:
toptarget: VALTOZO=1
toptarget: target1
toptarget: target2
target1: VALTOZO+=2
target1:
echo $(VALTOZO)
target2:
echo $(VALTOZO)
ennek a kimenete
1 2
1
- A hozzászóláshoz be kell jelentkezni
Megegy erv akkor, hogy ne valtozoval legyen megoldva a problema =)
- A hozzászóláshoz be kell jelentkezni
A dependenciák is csak egyszer futnak le. Tehát minden targetben újra kell futtatnod ezt: "shellparancsamitfuttatnal >infofile.foo" ha többször akarsz (más) értéket adni neki.
- A hozzászóláshoz be kell jelentkezni
Ha tobbszor kell, akkor erdemesebb mar egy olyan megoldast osszehozni, ami eloszor leforgat mindent amit lehet, aztan megcsinalja a filet/fileokat, es azon depend.
De az elgondolas ugyanaz marad: fileba vele & depend a rule-ra
- A hozzászóláshoz be kell jelentkezni
[szerk]
De még a targetek futtatásának sorrendje sem meghatározott (ha nem egyértelmű) (pont a párhuzamosíthatóság miatt), úgyhogy ha többször adsz értéket, és a sorrendjük fontos, használd a
.NOTPARALLEL:
sort is.
- A hozzászóláshoz be kell jelentkezni
Köszi a hozzászólásokat, most már világosabb a kép.
- A hozzászóláshoz be kell jelentkezni
Persze ha elmondanad a teljes problemat, lehet hogy meg tippeket is kapnal a megoldasra. De ez csak tipp...
--
()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.
- A hozzászóláshoz be kell jelentkezni