Makefile variables
Giorgos Keramidas
keramida at ceid.upatras.gr
Sun Jan 27 23:03:36 EET 2008
On 2008-01-27 22:04, Tasos Laskos <tasos.laskos at gmail.com> wrote:
> Kalispera sti lista,
>
> Palevo edo kai arketi ora me ena Makefile.
> Antiprosopeytiko deigma tou provlimatos einai to akolou8o:
>
> -------------------------------------------
> STAMP:= `date +%Y_%m_%d-%H_%M_%S----%N`
> DATESTAMP:= $(STAMP)
>
> all:
> @echo $(DATESTAMP)
> @echo $(DATESTAMP)
> -------------------------------------------
>
> Opos katalavate 8elo to DATESTAMP na min allazei.
>
> Na kano `date +%Y_%m_%d-%H_%M_%S----%N > /tmp/datestamp` kai meta `cat
> /tmp/datestamp`
> den einai eparkes sti periptosi mou.
Δε θα παίξει αυτό.
Κάθε φορά που συναντά το `command` το make, θα κάνει expand την τιμή του
τρέχοντας την εντολή.
Ακόμα και το αν το `backquote expansion` θα παίξει εξαρτάται από το make
implementation που χρησιμοποιείς, και το := ως μορφή assignment είναι
GNU make feature.
θα δεις αμέσως ότι τρέχει *πάλι* κάθε φορά που βρίσκεται στο input
stream το `date` command, με κάτι σαν:
all:
@echo $(DATESTAMP)
@sleep 2
@echo $(DATESTAMP)
Για να μη γίνεται αυτό θα πρέπει:
- είτε να αλλάξεις τον τρόπο με τον οποίο δημιουργείται το timestamp
(και να χρησιμοποιήσεις αυτό ακριβώς που δε σ' αρέσει, ένα προσωρινό
file).
- είτε να αλλάξεις το Makefile σου, έτσι που να χρησιμοποιεί το GNU
make extension $(shell ...) αντί για backquoted commands:
$ 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
$
Παρατήρησε πως, παρόλο που υπάρχει ένα `sleep 2' ανάμεσα από τις δύο
χρήσεις της $(DATESTAMP), δεν τυπώνεται διαφορετική τιμή, γιατί το GNU
make *ξέρει* ότι το special $(shell ...) expansion μπορεί να γίνει μια
φορά, και να επαναχρησιμοποιηθεί η τιμή του όσες φορές χρειάζεται
ύστερα.
Το καλό με το $(shell ...) είναι ότι παίζει Σωστά(ΤΜ) γι αυτό που θες να
κάνεις. Το κακό είναι ότι είναι unportable[1] GNU make feature.
[1] Unportable, όπως λέμε «δεν παίζει σε BSD make, Solaris make, HP/UX
make, κλπ. αλλά μόνο σε GNU make»
More information about the Linux-greek-users
mailing list