Makefile variables
Giorgos Keramidas
keramida at ceid.upatras.gr
Sun Jan 27 23:58:55 EET 2008
On 2008-01-27 23:20, Tasos Laskos <tasos.laskos at gmail.com> wrote:
>Giorgos Keramidas wrote:
>> $ cat -n Makefile
>> 1 STAMP = $(shell date '+%Y_%m_%d-%H_%M_%S----%N' )
>> 2 DATESTAMP = $(STAMP)
>> 3
>> 4 all:
>> 5 @echo $(DATESTAMP)
>> 6 @sleep 2
>> 7 @echo $(DATESTAMP)
>> $ gmake -f Makefile
>> 2008_01_27-22_59_22----N
>> 2008_01_27-22_59_22----N
>> $
>
> Eyxaristo gia ti voi8eia, ontos epaikse me shell.
>
> To asteio einai pos eixa dokimasei akrivos to paradeigma pou mou
> edoses alla eixa proseksei to ekseis:
>
> $ make
> 2008_01_27-23_11_50----329694047
> 2008_01_27-23_11_50----331340576
>
> To '%N' sto date einai nanoseconds (gia kapoio logo de to ekane
> substitute sto systima sou).
Το %N είναι GNU-ism, δεν υπάρχει στην strftime() σε BSD ή Solaris.
Γι αυτό και δεν έπαιξε στο BSD που το δοκίμασα εγώ.
> Eixa proseksei loipon pos ta nanoseconds allazan (den eixa 'sleep'
> anamesa). Kai to periergo einai pos allazoun mono ayta, deyterolepta
> ktl menoun idia.
Ανάλογα με το είδος του assignment, μπορεί να ξανατρέξει η εντολή ενός
$(shell) expansion κάθε φορά που το gmake συναντά την μεταβλητή αυτή:
$ cat -n GNUmakefile
1 STAMP = $(shell perl -e 'use POSIX qw(strftime); \
2 use Time::HiRes qw( gettimeofday ); \
3 ($$sec, $$msec) = gettimeofday(); \
4 $$now = strftime "%Y-%m-%d %H:%M:%S", gmtime($$sec); \
5 printf "%s.%06d\n", $$now, $$msec;' )
6
7 all:
8 @echo STAMP 1 = $(STAMP)
9 @sleep 2
10 @echo STAMP 2 = $(STAMP)
$ gmake -f GNUmakefile
STAMP 1 = 2008-01-27 21:52:56.056265
STAMP 2 = 2008-01-27 21:52:56.313879
Αν όμως σε GNU make χρησιμοποιήσεις το := assignment, τότε το expansion
γίνεται την ώρα του assignment, κι όχι κάθε φορά που αναφέρεται η
μεταβλητή:
$ cat -n GNUmakefile2
1 STAMP := $(shell perl -e 'use POSIX qw(strftime); \
2 use Time::HiRes qw( gettimeofday ); \
3 ($$sec, $$msec) = gettimeofday(); \
4 $$now = strftime "%Y-%m-%d %H:%M:%S", gmtime($$sec); \
5 printf "%s.%06d\n", $$now, $$msec;' )
6
7 all:
8 @echo STAMP 1 = $(STAMP)
9 @sleep 2
10 @echo STAMP 2 = $(STAMP)
$ gmake -f GNUmakefile2
STAMP 1 = 2008-01-27 21:56:28.744987
STAMP 2 = 2008-01-27 21:56:28.744987
$
Γι αυτό το τελευταίο $(shell) command τυπώνει 2 φορές το ίδιο timestamp.
More information about the Linux-greek-users
mailing list