Set 162010
 

Rieccoci a parlare di progetti multiplatform. Nella scorsa puntata abbiamo visto come trasportare fra diversi PC Windows-based, progetti wxWidgets  creati con Codeblocks. A questo punto perciò diamo per sccoeontato che il vostro progettino contenga i riferimenti alle wxwidgets con l’uso della variabile globale $(#wx), cosa che ci ha permesso di spostare lo stesso progetto su diverse piattaforme windows indipendentemente dal percorso di installazione delle wxwidgets.

Ora facciamo un ulteriore passo e trasportiamo il nostro progettino da Windows a Linux. Qui le cose si fanno più difficili. Una possibilità sarebbe quella di creare due “files progetto” separati per le due piattaforme anche se ad ogni file incluso nuovo sarebbe necessario fare le modifiche due volte complicando un pò le cose. Ma se portate il progettino così com’è direttamente sotto linux state certi non funzionerà. Dopotutto gli ambienti linux e windows sono talmente diversi che è impensabile che lo stesso progetto possa funzionare allo stesso modo sulle due piattaforme. Per fortuna CodeBlocks permette di utilizzare più “target” con lo stesso progetto. Un target non è altro che un insieme di opzioni di compilazione di directory da includere, librerie etc che CB utilizza per partire dai listati ed ottenere il nostro eseguibile. Anche se magari non ve ne siete resi conto i target li abbiamo già visti, infatti, se ricordate, quando aprite un progetto vengono creati in automatico due target chiamati Build e Release che contengono le varie istruzioni per generare codice di debug e codice “release”. Cominciamo perciò a fare le prime piccole modifiche al nostro progetto.  Sotto Project->Properties troviamo ciò che ci serve nel tab “Build Targets”. Vedete che sulla sinistra ci sono i nostri “debug” e “release”. Bene cominciamo con il rinominarli in “WinDebug” e “WinRelease” così un volta completato il tutto potremmo ricordarci che sono le versioni debug e release originarie del progetto windows. Ora passiamo a duplicare entrambi andandoli a chiamare LinuxRelease e LinuxDebug. A questo punto abbiamo 4 target due dei quali resteranno uguali, ossia quelli preparati per Windows, mentre andiamo a fare le debite modifiche sugli altri due in modo che funzionino sotto linux. Quando tutto sarà completato basterà scegliere il target da compilare che funzionerà sia sotto windows che sotto linux. Se siete partiti dall’esempio pubblicato nelle scorse puntate nelle “Project build options” avrete una voce “generale “Events con impostazioni valide per tutti i progetti e le 4 sottocategorie WinRelease, WiDebug, LinuxDebug e LinuxRelease con le specifiche opzioni per compilare le versioni debug e release sotto windows e sotto linux, anche se queste ultime due devono ancora essere modificate. Ora sorge il primo problema. Purtroppo le impostazioni generali valide per le versioni debug e release di windows saranno diverse da quelle per linux, inoltre  codeblocks non ha una funzione che permetta di creare un secondo gruppo di impostazioni generali. Per questo motivo ci conviene spostare le impostazioni generali e copiarle sia nella versione debug che release. Vediamo una lista delle cose da fare.

Tab Sotto-opzione Da fare:
Compiler setting Compiler Flag Per fortuna nelle impostazioni generali è impostata solo la voce “Enable all compiler warning”. Potremmo decider di disattivarla dalle impostazioni comuni ed attivarla nelle versioni WinDebug e WinRelease ma in realtà la cosa migliore è lasciare tutto com’è in quanto i target linux hanno le stesse impostazioni.
Other option Troverete le seguenti righe:-pipe
-mthreads
[[if (PLATFORM == PLATFORM_MSW && (GetCompilerFactory().GetCompilerVersionString(_T(“gcc”)) >= _T(“4.0.0”))) print(_T(“-Wno-attributes”));]]Eliminiamole dalle impostazioni generali e portiamole nei target Winrelease e Windebug.
#define __GNUWIN32__
__WXMSW__
wxUSE_UNICODECmoe sopra, spostiamo tutto in WinRelease e WinDebug. Attenzione che sotto WinDebug c’è la voce __WXDEBUG__ che NON dobbiamo togliere o modificare.
Linker setting Link libaries Ci sono tutta una serie di librerie da spostare nei target windebug e winrelease. Per fortuna nelle versioni più recenti è stato introdotto il pulsante “Copy selected to” per cui selezioniamo tutte le 13 librerie e tramite il suddetto pulsante le copiamo nei target winrelease e windebug per eliminarle poi dalle impostazioni generali.
Other linker options Spostiamo -mthreads nei due target.
Search direcory Compiler Abbiamo 2 percorsi che possiamo spostare con il pulsante “copy all to” e poi rimuovere.
Linker nulla da fare
Resource compiler Un solo percorso da spostare

Fatto tutto? Provate a forzare una ricompilazione sia dei target WinDebug e WinRelease per verificare di non aver commesso grossolani errori.

Ora siamo pronti per modificare i target linux. Vi allego una tabella come la precedente con le impostazioni da inserire nei target linuxebug e LinuxRelease.

Tab Sotto-opzione Da fare:
Compiler setting Compiler Flag Lasciamo tutto com’è
Other option `wx-config –cflags`(occhio agli apostrofi!) sia in LinuxDebug che linuxRelease
#define nulla
Linker setting Linker libraries cancellate tutto con il pulsante clear
Other linker option `wx-config –libs` sia in LinuxDebug che LinuxRelease
Search directory Compiler cancellate tutto con il pulsante clear
Linker cancellate tutto con il pulsante clear
Resource compiler cancellate tutto con il pulsante clear

Ecco fatto. Se siete riusciti a seguire le istruzioni alla lettera ora siamo pronti per trasportare il nostro progettino sotto linux e provare a compilare il tutto.

Proviamo e vediamo cosa succede. CB apre una schermata in quanto non riesce a rintracciare il percorso della variabile globale wx. Ovvio direte voi. Inserite una directory qualunque o CB non vi permetterà di uscire dalla schermata, inoltre non ha importanza quale sia la directory visto che nelle versioni linux non sono link con la wx, anzi, peccato che codeblocks fà questo controllo al caricamento del progetto perchè se non lo facesse tutto funzionerebbe senza nessuna ulteriore modifica. A questo punto selezionate uno dei target LinuxDebug o LinuxRelease e provate a compilare. Nel mio caso è funzionato tutto al primo colpo ed ho ottenuto degli eseguibili uguali a quelli windows e soprattutto funzionanti. Ma non preoccupatevi, le variabili globali non vengono memorizzate nei files di progetto per cui d’ora in avanti il progetto può essere spostato tranquillamente da una macchina all’altra e ricompilato senza alcuna modifica. A dirla tutta quando ho in un secondo tempo realizzato il video che mostra i vari passaggi, CB non m’ha chiesto nulla nemmeno al primo avvio.

Come di consueto il video finale con tutte le istruzioni del caso.

Per completezza è giusto che sappiate che esistono anche altre tecniche per ottenere risultati simili. Ad esempio sotto linux è possibile scaricare il pacchetto mingw32 e compilare eseguibili windows direttamente da linux, senza nemmeno avere un pc con windows installato. Sinceramente è una strada che non ho provato ma a qualcuno potrebbe essere comoda. La tecnica di generare codice eseguibile per macchine differenti da quella da cui stiamo programmando è detta “cross compiling” che potremmo tradurre con “compilazione incrociata”. In rete c’è un dettagliato articolo che spiega come compilare codice windows sotto linux.

Infine eccovi il listato del progetto con le modifiche apportate in questo articolo, funzionante sia su windows che su linux: Custom events and wxthread for Linux and Windows (499 download )

  No Responses to “CodeBlocks: creare progetti multiplatform (parte 2)”