OT Samomodifikujuci sa make

milan milan@bastl.sk
Úterý Prosinec 16 14:14:13 CET 2008


Ak pouzijete iba zapis (bez prikazov):

$(TARGET).makefile: $(TARGET).timestamp

tak sa pokusate aktivovat implicitne pravidlo (viz hned prva veta na 
http://www.gnu.org/software/make/manual/make.html#Using-Implicit ). Ak 
vhodne implicitne pravidlo neexistuje, nic sa nerobi. Takze, de-facto, 
nemate ziadne pravidlo, ktore hovori o prerobeni toho-ktoreho makefile, 
preto ho asi interny mechanizmus ignoruje.

Zadanim akehokolvek prikazu ho zmenite na "normalne pravidlo" - a potom 
to funguje podla ocakavania. Staci mu dat bodkociarku ako prazdny prikaz 
....

Vecer mozem skusit nmake od MS.

Milan



Jan Waclawek wrote:
> Zdravim vsetkych,
>
> zase mam potycku s *nixoidnymi toolmi... tentokrat make.
>
> V makefile (xxx.makefile , xxx je TARGET) mam nasledovne pravidla:
>
> $(TARGET).makefile: $(TARGET).timestamp
> [toto je "inkriminovane miesto", vysvetlene neskor v texte, nateraz tu nic nie je]
>
> $(TARGET).timestamp : [nejake zdrojaky]
> 	[nieco s tymi zdrojakmi, ktore vytvoria aj novy xxx.makefile]
> 	@echo.>$(TARGET).timestamp
>
> Ak tam nie je ten prvy riadok, tak to funguje ako ma: ak sa v [nejakych zdrojakoch] nieco zmeni, xxx.timestamp uz zrazu nie je mladsi nez vsetky zdrojaky, tak sa s tymi zdrojakmi vykona to co v tom pravidle je, vytvori sa novy xxx.timestamp, a aj sa vytvori novy xxx.makefile, ale ten sa nezoberie do uvahy (to je spravne: podla dokumentacie sa makefile najprv nacita cely, a az potom sa zacne vykonavat).
>
> Ak tam ten prvy riadok pridam, funguje to presne tak isto. Pritom dokumentacia (http://www.gnu.org/software/make/manual/make.html#Remaking-Makefiles ) hovori:
> To this end, after reading in all makefiles, make will consider each as a goal target and attempt to update it. If a makefile has a rule which says how to update it (found either in that very makefile or in another one) or if an implicit rule applies to it (see Using Implicit Rules), it will be updated if necessary. After all makefiles have been checked, if any have actually been changed, make starts with a clean slate and reads all the makefiles over again. 
>
> Toto sa ocividne nestane, makefile sa nenacita znova, a zvysok make prebehne so starym makefile, aj ked sa makefile urcite prepise novym. Samozrejme, ak sa bez akejkolvek dalsej zmeny znova spusti make, uz bezi novy makefile a vysledok prekladu je uplne iny (toto spravanie je potvrdene aj dokladnym skumanim debug vypisov make spusteneho s prepinacom -d).
>
> Staci vsak na "inkriminovane miesto" pridat lubovolny prikaz, napr.
> 	@echo blabla
> a uz to funguje ako ma, zvysok make-ovania prebehne uz podla noveho makefile (zaujimave je, ze "blabla" sa vypise dvakrat (pricom vsak sa timestamp nezmeni), to vsak je spravne (a ak sa aj ziadne zdrojaky nezmenia, tak sa vypise raz) - ako domaca uloha to mozte skusit zdovodnit ;-) )
>
>
> Je toto spravanie v poriadku, alebo sa jedna o bug gnu-make (v3.81)? Mohol by to prosim niekto skusit na nejakej inej, ne-gnu verzii make?
>
>
> Dakujem
>
> wek
>
>
>
> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz
> Hw-list@list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
>   





Další informace o konferenci Hw-list