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