PDA

View Full Version : [UNIX] makefile: passare data di sistema al programma compilato ?


trallallero
16-06-2006, 11:26
Devo compilare un programma C++ passandogli una define
della data della compilazione che corrispondera' alla versione.
(parametro -DDATA=... per ex: cc pippo.c -DDATA=06/2006 -o pippo)
in modo da aver sempre la versione aggiornata.

C'e' qualcuno in grado di farlo ?
(io lo avevo fatto 2 anni fa ma nun me ricordo proprio :muro:)

In altre parole devo:
- assegnare ad una variabile (ex: DATA) la data di sistema
(formattata mm/yyyy ma questo non e' un problema)
- passare questa variabile al programma in fase di compilazione con l'opzione -D...

se nel makefile metto:


...
DATA="`date`"

all:
cc prova.c -DDATA=$(DATA) -o p
...

non va (mi esce: cc prova.c -DDATA="`date`" -o p)

Grazie!

P.S.: lavoro su Sun ( e aggiungerei :muro: )

ilsensine
16-06-2006, 11:37
DATA=$(shell date %Y%m%d)

andbin
16-06-2006, 11:46
Devo compilare un programma C++ passandogli una define
della data della compilazione che corrispondera' alla versione.
(parametro -DDATA=... per ex: cc pippo.c -DDATA=06/2006 -o pippo)
in modo da aver sempre la versione aggiornata.Ho fatto adesso una prova su Linux:
DATA=$(shell date +%d/%m/%Y)

all:
gcc -o prova -DDATA=\"$(DATA)\" prova.cNon so se va bene sulla Sun. ;)

P.S. comunque in ANSI "C" esiste già la macro __DATE__

trallallero
16-06-2006, 11:55
DATA=$(shell date %Y%m%d)

grazie ma non va lo stesso :rolleyes:

e poi scusa ma $(...) e `...` sono la stessa cosa: esegui un comando

se poi intendevi con "shell" la shell che uso .. le ho provate tutte :muro:


DATA=$(shell date %Y%m%d)

all:
echo $(DATA)
cc -DDATA=$DATA -o p



output:

echo

cc prova.c -DDATA= -o p


come vedi DATA rimane blank

cmq grazie :)

trallallero
16-06-2006, 12:00
Ho fatto adesso una prova su Linux:
DATA=$(shell date +%d/%m/%Y)

all:
gcc -o prova -DDATA=\"$(DATA)\" prova.cNon so se va bene sulla Sun. ;)

P.S. comunque in ANSI "C" esiste già la macro __DATE__

'azz e' vero! __LINE__, __DATE__ etc :)
o forse ho usato questo 2 anni fa ? (e qui posso rispondermi solo io :D )

cmq su Sun non va quello che m'hai inviato :rolleyes:
Grazie

andbin
16-06-2006, 12:03
e poi scusa ma $(...) e `...` sono la stessa cosa: esegui un comandoSì è la stessa cosa nelle shell ... ma non in un makefile! In un makefile devi usare l'apposita funzione: $(shell ...comandi...)

ilsensine
16-06-2006, 12:07
grazie ma non va lo stesso :rolleyes:

Mi sono scordato il "+":

DATA=$(shell date +%Y%m%d)

trallallero
16-06-2006, 12:11
Sì è la stessa cosa nelle shell ... ma non in un makefile! In un makefile devi usare l'apposita funzione: $(shell ...comandi...)

questo il man di make non lo dice :mbe:

Comunque in effetti su un nostro client linux funziona.

il problema di __DATE__ invece e' che ogni giorno cambia data :rolleyes:
non coincide con la data di compilazione ...
ma possbile che Sun faccia sempre le cose a modo suo ? :muro:

trallallero
16-06-2006, 12:19
Mi sono scordato il "+":

DATA=$(shell date +%Y%m%d)

ma il problema non e' la formattazione della data.

e' quando vado ad eseguire nel make il cc ... DATA e' vuota

Su linux:
gcc -o prova -DDATA=$(DATA) prova.c
output:
gcc -o prova -DDATA=16/06/2006 prova.c
funziona

Su Sun:
cc -o prova -DDATA=$(DATA) prova.c
output:
cc -o prova -DDATA= prova.c
non funziona

ilsensine
16-06-2006, 12:25
Bè devi vedere cosa cambia; innanzitutto se anche su Sun è presente "date" e con la stessa sintassi di linux; quindi potrebbe darsi che la sintassi del make di Sun sia diversa (nel qual caso ti consiglio di installare - se non lo è già - gmake della gnu, in modo da usare la stessa sintassi che usi per linux).

trallallero
16-06-2006, 12:32
Bè devi vedere cosa cambia; innanzitutto se anche su Sun è presente "date" e con la stessa sintassi di linux; quindi potrebbe darsi che la sintassi del make di Sun sia diversa (nel qual caso ti consiglio di installare - se non lo è già - gmake della gnu, in modo da usare la stessa sintassi che usi per linux).

Infatti e' diversa la sintassi, trovata sul sito della Sun:


DATA:sh = date +%d/%m/%Y

all:
cc -o prova -DDATA=$(DATA) prova.c


comunque grazie a tutti :)

P.S.: qua non si puo' installare niente (ufficialmente ;) )

andbin
16-06-2006, 14:03
questo il man di make non lo diceman make fornisce solo le informazioni sul comando make: descrizione, opzioni, ecc...
info make invece fornisce tutto il manuale completo sul make e sui makefile! ;)

Il manuale del make è disponibile anche <qui> (http://www.gnu.org/software/make/manual/) e <qui> (http://www.gnu.org/software/make/manual/html_node/Shell-Function.html#Shell-Function) spiega la funzione shell.

trallallero
16-06-2006, 14:23
man make fornisce solo le informazioni sul comando make: descrizione, opzioni, ecc...
info make invece fornisce tutto il manuale completo sul make e sui makefile! ;)

no guarda, qui e' tutto strano, siamo in un mondo a parte :(

info make
SINTASSI: info -f file [ -v ] [ -S out_sep ] [ -s in_sep ] [ -0 campo_0 ] [ -1 campo_1 ] .... [ 0|1|2|3|4|5|6|7|8|9|10|11 ... ]

invece ho letto bene il man di make e c'e' :
:sh = Define the value of a macro to be the output of a com mand (see Command Substitutions below).

il contrario ... ma tu info dove lo lanci ? linux ? ho provato anche li ma idem ... e comunque abbiamo una versione della Adamo&Eva & Co :rolleyes:

Il manuale del make è disponibile anche <qui> (http://www.gnu.org/software/make/manual/) e <qui> (http://www.gnu.org/software/make/manual/html_node/Shell-Function.html#Shell-Function) spiega la funzione shell.

Grazie andbin ma su gnu.org non ci si puo' andare da qui :muro:
(possiamo usare gmail e scaricarci l'impossibile ma gnu.org no :doh: )

Comunque ormai ho risolto ... ma io mi chiedo ... come cacchio ho fatto 2 anni fa
visto che __DATE__ non va bene e DATA_COMP:sh = date +%d/%m/%Y
non l'ho usato senno' me lo ricorederei ? :eek:

e non me lo sto sognando, ho controllato il main.cc e c'e'
ancora l'istruzione:


#ifdef COMPILE_DATE
strcat( Msg, COMPILE_DATE );
#else
strcat( Msg, "02/2004" );
#endif


boh :confused: le vie dell'informatica sono infinite :D

andbin
16-06-2006, 14:34
no guarda, qui e' tutto strano, siamo in un mondo a parte :( Ehhh ... questo lo immaginavo. ;) Penso che ci siano parecchie differenze tra Linux e Solaris. Io però non ho mai avuto modo di lavorare con quest'ultimo, quindi ... non saprei dirti di più.

trallallero
16-06-2006, 14:51
Ehhh ... questo lo immaginavo. ;) Penso che ci siano parecchie differenze tra Linux e Solaris. Io però non ho mai avuto modo di lavorare con quest'ultimo, quindi ... non saprei dirti di più.

piano piano la banca sta mollando queste dannate Sparc per passare a Linux ,,, certe filiali hanno ormai solo clients Linux ... anche perche' le Sparc costano un fottio di $

comunque e' 3 anni che sto qui e mi son fatto un'esperienza notevole su Unix :cool:

ringrazio ancora, anche oggi s'e' imparato qualcosa :)