Vorrei che la mia applicazione Qt/C++ sapesse di quale versione si tratta. Dovrebbe sapere che non da alcuni file di configurazione, ma con il numero di versione compilato nel binario dell'applicazione. Una versione stessa è una stringa come "XYZ", dove X è un numero di versione principale, Y è un numero di versione minore e Z è una revisione sotto SVN (o un numero di revisione sotto SVN meno un numero di revisione quando è uscita la versione "XY0"). Quale pensi che sia il modo più semplice per farlo con gli scons?Le migliori pratiche per gestire le versioni con scons?
risposta
SCons ha Substfile
e Textfile
builder per la generazione di file. Quindi creare una funzione per calcolare la versione (usando o chiamando il comando svn
) e scrivere il suo output su un file usando Substfile
(prende template da un file) o Textfile
(scrive solo contenuto fornito). Compilare e collegare il file con il resto dell'applicazione.
Il file deve essere un file sorgente (non un'intestazione) con contenuti quali (supponendo C/C++, ma la stessa tecnica sarebbe appropriato con qualsiasi lingua):
char *VERSION = "X.Y.Z";
(e qualsiasi altra formati alternativi che si desidera) e dichiarare
extern char *VERSION;
da qualche parte, che solo il un file verrà ricompilato più l'applicazione ricollegato (che lo farà in ogni caso, perché alcune altre fonti probabilmente cambiato troppo, a destra).
+1. Mettere i valori della versione in un file sorgente è una buona idea. Trovo utile creare un'intestazione (che non debba essere modificata) con funzioni accessorie per 1. la stringa di versione e 2. una struttura di versioni con campi separati per i valori maggiore, minore, ecc. –
Grazie per la risposta, vado con questo. Mi dispiace per essere così lento ad accettare. – Septagram
Inoltre, @Dave, giusto sei. – Septagram
Ecco altre risposte provenienti dalla mailing list [scons-users].
Brian Cody:
Una possibilità riga di comando si passa in scons è la versione repository di SVN rep. Abbiamo quindi inserito questo numero in a define (-DREP_NUM = \ "123 \") e creare una stringa nel nostro codice C++ che utilizza questo numero. Questo è per il nostro server eseguito build . Per costruisce locali, abbiamo effettivamente utilizziamo il nome utente al posto del numero di versione, perché qualcuno è accumulo locale della versione XYZ non necessariamente uguale di qualcun altro XYZ (in Windows, l'env var USERNAME contiene l'utente connesso). Uno altra considerazione è che la modifica di qualsiasi parte di una compilazione in scn significa che il target è automaticamente non aggiornato. Per risolvere questo problema, il nostro sistema di build preleva il target di un oggetto a cui importa effettivamente i flag e che passa solo i flag alla compilazione di quell'unico oggetto.
Buona fortuna
Gary Oberbrunner:
Vorrei che il mio Qt/C++ applicazione per sapere quale versione si tratta.
C'è qualche info in http://www.scons.org/wiki/BuildNumberProcessing che può essere utile.
- - Gary
Se l'unico scopo del numero di versione è quello di visualizzare qualcosa per l'utente, una stringa è OK. Se è presente un accesso programmatico, è necessario disporre di ciascuno dei componenti della versione in un campo separato (consultare http://stackoverflow.com/questions/2195573/why-use-a-nested-ruby-module-for-version- informazioni/2195824 # 2195824). Inoltre, per semplificare l'automatizzazione degli incrementi di versione (ad esempio per uno script di build di rilascio), separare la versione in campi è una vittoria. –