sabato 29 giugno 2013

Qt: trucco per versionare applicazioni e librerie

Ciao a tutti. Recentemente sono stato impegnato da un piccolo problema durante la finalizzazione di un'applicazione. Il problema da risolvere era creare un widget che riportasse la versione all'utente nella sezione "About". Il mio obiettivo era utilizzare un unico file che contensse la definizione della versione corrente, sia da far comparire nel widget sia per generare le librerie lib*.so.maj.min.patch. La mia soluzione è stata aggirare il compilatore c++ e il sistema di pre-build qmake con un semplice trucco. Per prima cosa riportiamo il file Version.h:
#ifndef VERSION_H_
#define VERSION_H_

#define BUILD_VERSION_NUMBER
#ifdef BUILD_VERSION_NUMBER

#define MY_MAJOR_VERSION 1
#define MY_MINOR_VERSION 2
#define MY_PATCH_VERSION 3

#define OTHER_INTERESTING_DEFINES 0

#else

MY_MAJOR_VERSION = 1
MY_MINOR_VERSION = 2
MY_PATCH_VERSION = 3

#endif

Già da questa porzione di codice si capisce qual'è stato il trucco. Il pre-compilatore esclude le righe che darebbero un errore di compilazione in c++ grazie alla definizione on-the-fly di "BUILD_VERSION_NUMBER". Il sistema di pre-build qmake consente di inserire negli script "Project" commenti se questi sono preceduti dal carattere '#'. A questo punto il file Version.h viene incluso nella classe del widget che, così facendo, potrà utilizzare le define MY_MAYOR_VERSION, MY_MINOR_VERSION, MY_PATCH_VERSION. Successivamente il file Version.h viene incluso anche dal file *.pro che dovrà contenere la seguente porzione di codice:
include ( Version.h )

VER_MAJ      = $${MY_MAJOR_VERSION}
VER_MIN      = $${MY_MINOR_VERSION}
VER_PAT      = $${MY_PATCH_VERSION}
Le variabili VER_MAJ, VER_MIN e VER_PAT vengono poi usate da qmake per numerare le librerie. Chiudo questo breve articolo con una domanda: c'è un modo migliore per fare questo? La mia risposta è: "probabilmente si, ma mi sono divertito molto a trovare questa soluzione!"