Makefile változók

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

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

---
Science for fun...

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)

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!

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

Köszi a hozzászólásokat, most már világosabb a kép.