2010-11-09 24 views
2

J'essaye de construire un logiciel sous Windows en utilisant à la fois GNU make 3.81 et une ancienne marque distribuée avec Wind River Tornado (make 3.76).Définition et utilisation d'un horodatage de construction pour GNU Make sur Windows

Jusqu'à présent, je réussi à capturer la date à partir de Windows:

NOW=\"$(shell cmd /C date /T) $(shell cmd /C time /T)\" 

mais quand je passe sur le compilateur

CFLAGS = ... -DBUILD_TIMESTAMP=$(NOW) ... 

Je reçois des erreurs de cause des espaces et des colons et des barres obliques dans l'horodatage. Si je répercute la variable $ (NOW), elle est correctement citée, mais lorsque je renvoie la variable $ (CFLAGS), les guillemets disparaissent.

Répondre

0

Vous voulez citer la variable pour le shell (donc il n'est pas sujet à la division de mots) et citez-le à nouveau pour C (donc quand il est remplacé par cpp, vous avez un littéral de chaîne). Essayez ceci:

NOW := "\"$(shell cmd /C date /T) $(shell cmd /C time /T)\"" 

Notez aussi que j'utilise := au lieu de =. À moins que votre ancien make ne le supporte pas, utilisez :=, qui évalue la substitution au point de définition, pas le point d'expansion. En utilisant =, il appellera ces deux commandes shell deux fois chaque fois que vous essaierez de compiler un fichier. Pas si bon pour la performance.

+0

Si j'échoue $ NOW je reçois \ Tue 11/09/2010 01:51 PM \. Si j'écho $ CFLAGS je reçois/Mar 11/09/2010 01:51 PM /. – florin

+0

Je ne vois pas ce problème, mais j'utilise une boîte GNU/Linux pour tester (et exécuter une autre commande 'date'). Copiez/collez votre sortie de terminal quelque part, ou postez une capture d'écran. –

0

Je pense que vous devez définir: CFLAGS = ... -DBUILD_TIMESTAMP = "$ (NOW)" ...

dire ajouter des guillemets.

Il y a une autre solution « aki » - la suppression des espaces $ (NOW) -> Essayez:

empty:= 
space:= $(empty) $(empty) 
NOW:=$(subst $space,_,$(NOW)) 
+0

Non, cela ne fonctionne pas avec les guillemets ajoutés non plus. – florin

0

Vous trouverez peut-être le problème plus facile à déboguer si vous éliminez la rouerie de passer des chaînes cotées un compilateur de ligne de commande, comme ceci:

.PHONY: force 
timestamp.h: force 
    echo "#define BUILD_TIMESTAMP \"`cmd /c date /t` `cmd /c time /t`\"" > [email protected] 

... et #include "timestamp.h" dans votre code. De cette façon, vous n'avez qu'à vous soucier du comportement de votre shell, pas de make et du compilateur.

Il a été un certain temps, mais je pense Je me souviens que les navires Tornado avec une coquille de style csh, qui gère en citant, er, différemment que les coquilles Bourne plus courantes. Il comprend également un interpréteur TCL, que vous pouvez utiliser à la place en créant un timestamp.tcl avec un contenu comme

puts "#define BUILD_TIMESTAMP \"[clock format [clock seconds] -format {%D %T}]\"" 

et l'écriture

timestamp.h: force 
    tclsh timestamp.tcl > [email protected] 

dans le makefile.