Compilare GnuPG per Win32 con MinGW

(a cura di Carlo Luciano Bianco <clbianco@tiscalinet.it>)

Versione 0.9.9a RC8a...

... ovvero, a me ha compilato, a voi non so... ;-)

Questo testo descrive i passi necessari per compilare GnuPG per Win32 usando MinGW in maniera "nativa" sotto Windows, senza effettuare cross-compilazioni da Linux. Queste istruzioni si riferiscono a GnuPG 1.4.9 [lo so, alcune immagini riportano 1.4.0 o addirittura 1.2.6, ma sono troppo pigro per rifarle da capo ogni volta... ;-)], ma dovrebbero comunque funzionare, con qualche adattamento, anche con tutte le altre versioni della serie 1.x a partire dalla 1.2.0. Per le versioni future, dalla 1.5.0 compresa in poi, non posso ovviamente garantire nulla...

Ovviamente questa vuole essere solo la descrizione della procedura che io ho seguito per compilare GnuPG per Win32. Non è detto che in certi punti non si possa fare di meglio. Non è neanche detto che la procedura funzioni sui vostri computer così come ha funzionato sul mio e che non vi crei nessun problema. Tutto quello che posso dire è contenuto nel sottotitolo: seguendo questa procedura "a me ha compilato, a voi non so". Se trovate errori, omissioni e/o imprecisioni di qualunque genere all'interno di questo testo, non esitate a segnalarmeli.

Detto questo, se non siete più che sicuri di quello che fate e/o avete dei dubbi sulla correttezza del risultato ottenuto, il consiglio è di lasciare perdere le compilazioni "fatte in casa" ed usare i binari ufficiali presenti sul sito di GnuPG.

Se, invece, nonostante tutto, siete arrivati a leggere fin qui e volete provare, allora tirate un bel respiro, contante fino a 10, ripetete l'alfabeto ad alta voce al contrario (dalla "z" alla "a") un paio di volte, ripensateci di nuovo, e, se siete proprio decisi... beh... allora... qui sotto c'è scritto tutto quello che dovete fare!

Prima di cominciare, l'autore di questa pagina desidera ringraziare TJL73 che ha testato sulla sua macchina l'effettivo funzionamento della procedura qui descritta e la sua completezza. Il sottotitolo può quindi essere letto come un "a noi ha compilato, a voi non so"... ;-)

L'autore desidera ringraziare altresì Joe Vender e Maxine Brandt, per il loro aiuto nel risolvere i problemi di compatibilità tra GnuPG e le librerie esterne per Win32, principalmente gettext nella compilazione "completa" e Bzip2, Tom Pegios, per i suoi suggerimenti sulla semplicifazione della procedura di rimozione dei simboli di debug, e Michel Nallino aka WinTerMiNator che, oltre a curare la versione francese della pagina, ha dato moltissimi suggerimenti per renderne più chiaro e completo il contenuto anche nelle altre lingue... ;-)

Eccovi le istruzioni. In bocca al lupo e non dite che non vi ho avvertito... ;-)

1) Installazione di MinGW:

1.1) Create la cartella C:\MinGW

1.2) Collegatevi al sito http://sourceforge.net/project/showfiles.php?group_id=2435 e scaricate i seguenti pacchetti:
a) gcc-core-3.4.5-20060117-1.tar.gz
b) binutils-2.18.50-20080109.tar.gz
c) mingw-runtime-3.14.tar.gz
d) w32api-3.11.tar.gz
e) mingw-utils-0.3.tar.gz
I numeri all'interno dei nomi dei file sono la versione dei pacchetti, e potranno quindi essere diversi quando leggerete queste note. In genere è sempre meglio scaricare la versione più aggiornata di ogni pacchetto. Ovviamente potete anche scaricare altri pacchetti, ma per compilare GnuPG (scopo di queste note) questi sono più che sufficienti.

1.3) Scompattate i pacchetti all'interno della cartella MinGW creata al punto 1, nell'ordine dal più vecchio al più nuovo (la data è sul sito da cui li avete scaricati, accanto al nome del file). Attenzione a scompattare i file mantenendo la struttura delle directory esistente all'interno dei file compressi. Se tutto andrà bene, alla fine vi ritroverete con molte cartelle all'interno di MinGW: "bin", "include", "lib", ecc. Se durate l'operazione vi viene chiesta la conferma per sovrascrivere un file già esistente, rispondete in maniera affermativa. Visto che state scompattando i pacchetti dal più vecchio al più nuovo, siete sicuri che in questo modo avrete la versione più recente di ogni file.

2) Installazione di MSYS:

2.1) Ora potete installare MSYS. Ricollegatevi al sito http://sourceforge.net/project/showfiles.php?group_id=2435 e scaricate MSYS-1.0.10.exe (o la versione che sarà disponibile al momento in cui leggerete). È un normale file eseguibile autoinstallante per Windows. Dovrete rispondere "next" un paio di volte e l'installazione sarà completata in pochi istanti:

--Immagine: Finestra per la scelta della directory ove installare MSYS.
Fine immagine.--

2.2) Alla fine dell'installazione, MSYS avvierà una procedura per autoconfigurarsi sulla base dei pacchetti MinGW che avete installato al punto 1:

--Immagine: Alla fine dell'installazione, si apre una finestra in
modalità a caratteri e MSYS chiede se avviare o meno la procedura di
post-installazione. Fine immagine.--

Dovrete rispondere affermativamente (con "y") alla richiesta di eseguire questa procedura, dire (con un altro "y") di avere già installato MinGW

--Immagine: La procedura di post-installazione è in corso e viene
chiesto se MinGW è installato sul sistema. Fine immagine.--

e indicare la cartella in cui risiede.

--Immagine: La procedura di post-installazione è in corso e viene
chiesto in quale cartella è installato MinGW. Fine immagine.--

Se avete fatto come scritto al punto 1, dovrete indicare "c:/mingw", senza le virgolette. L'uso dei caratteri minuscoli e del carattere "/" al posto di "\" è assolutamente obbligatorio.

--Immagine: La procedura di post-installazione è in corso ed è stato
risposto che MInGW è installato in c:/mingw. Fine immagine.--

La procedura di post-installazione di MSYS si concluderà con una finestra simile alla seguente:

--Immagine: La procedura di post-installazione è terminata, con un
avvertimento a non installare vecchie versioni di make. Fine
immagine.--

Non fatevi ingannare dall'avviso sulla mancanza di "make", NON è assolutamente un errore. Il "make" originale di MinGW può dare dei problemi e per questo MSYS contiene una versione appositamente riveduta e corretta di "make". Durante la post-installazione, MSYS controlla l'eventuale presenza del "make" di MinGW e, se lo trova, lo rinomina per renderlo inattivo e innocuo. Nel nostro caso, "make" non figura proprio tra i pacchetti MinGW scaricati al punto 1, benché presente sulla stessa pagina di tutti gli altri, e quindi non è stato proprio installato. Pertanto MSYS non lo trova in fase di post-installazione e avverte che va bene così. Il messaggio di avviso tradotto in italiano suona infatti più o meno come "Splendido, non hai installato c:/mingw/bin/make. Mi raccomando, continua così.", riferendosi al fatto che una eventuale installazione successiva del "make" di MinGW manderebbe tutto all'aria. Non preoccupatevi quindi dell'avviso e premete pure un tasto per proseguire, come suggerito dall'ultima riga della finestra.

2.3) Ora potete lanciare MSYS con l'apposita icona nel menù avvio o con quella sul desktop.

2.4) Scrivete al prompt di MSYS "gcc -v" e premete invio. Se vi appaiono messaggi simili a quelli che vedete in questa figura:

--Immagine: Test dell'installazione. Finestra di MSYS con la versione
di GCC in risposta a un gcc -v. Fine immagine.--

allora congratulazioni: GCC funziona!

3) Installazione delle librerie aggiuntive di MinGW:

3.1) Ora, per la compilazione di GnuPG, vi possono servire alcune librerie aggiuntive. Collegatevi quindi al sito http://sourceforge.net/project/showfiles.php?group_id=23617, scaricate i seguenti pacchetti:
a) bzip2-1.0.5-bin.zip
b) bzip2-1.0.5-lib.zip
c) libiconv-1.9.2-1-bin.zip
d) libiconv-1.9.2-1-dep.zip
e) zlib-1.2.3-bin.zip
f) zlib-1.2.3-lib.zip
e scompattateli all'interno di MinGW secondo la stessa modalità del punto 1 (dal più vecchio al più nuovo), controllando che la struttura delle directory venga mantenuta. Al solito, i numeri di versione potranno essere diversi quando leggerete queste note. Nessuna di queste librerie è realmente indispensabile alle funzioni di base di GnuPG. I pacchetti "a" e "b" sono necessari per aggiungere il supporto al formato di compressione Bzip2. I pacchetti "c" e "d" sono necessari per il supporto multi-lingue. I pacchetti "e" e "f" sarebbero necessari per il supporto al formato di compressione zlib ma, se non sono presenti nel sistema, lo script di compilazione usa una versione ad hoc di zlib inclusa nel sorgenti di GnuPG; tale versione ad-hoc verrà comunque collegata al file eseguibile di GnuPG in maniera statica, indipendentemente da quanto specificato in LDFLAGS (vedi punto 5.1b).

3.2) Se avete scelto di usare libiconv, avviate ora MSYS e inserite il seguente comando:

cp /mingw/bin/libiconv2.dll /mingw/bin/iconv.dll

3.3) Scaricate anche il file coreutils-5.2.1-1-bin.zip (o quello che sarà disponibile quando leggerete queste note, considerando che la versione 5.3.0 spesso provoca un crash sulla mia macchina) e scompattatelo in una cartella temporanea (NON in MinGW). Si scompatteranno varie sottocartelle, tra cui una chiamata "bin". Copiate il file dd.exe da questa sottocartella "bin" a "C:\MinGW\bin" e poi cancellate la cartella temporanea in cui avete scompattato il file zip. NON copiate altri file oltre dd.exe, tutti gli altri comandi sono già presenti in MSYS e averne una copia in MinGW può solo causare problemi.

3.4) Infine, se desiderate attivare anche il supporto per libcurl, potete collegarvi al sito http://curl.haxx.se/download.html e scaricare, sotto la voce "Win32 - Generic", l'ultima versione per il vostro sistema operativo (a seconda che si tratti o meno di 2000/XP) definita "libcurl" (non "binary") senza supporto SSL (la versione 7.17.1, nel momento in cui scrivo). Dovrete ora seguire la procedura seguente:
a) Scompattare questo file in una cartella temporanea (NON in MinGW). Saranno create varie sottocartelle.
b) Copiare il contenuto della sottocartella "bin" in C:\MinGW\bin.
c) Copiare il contenuto della sottocartella "include" in C:\MinGW\include.
d) Copiare il contenuto della sottocartella "lib" in C:\MinGW\lib, tranne eventuali file .dll che dovrete copiare in C:\MinGW\bin.
e) Aprire, con il vostro editor di testi preferito, il file "curl-config" in C:\Mingw\bin, sostituite alla riga 28 "/usr/local" con "/mingw" e rimuovete "-L/home/dast/src/win32" dalle righe 198, 200 e 205.
f) Aprire, con il vostro editor di testi preferito, il file "libcurl.la" in C:\Mingw\lib, rimuovete "-L/home/dast/src/win32" dalla riga 17 e sostituite alla riga 35 "/usr/local/lib" con "/mingw/lib".
g) Cancellare la cartella temporanea.

4) Scaricamento e adattamento dei sorgenti di GnuPG:

Prima di cominciare la compilazione, è necessario fare un minimo adattamento ai sorgenti di GnuPG.

4.1) Se non lo avete già fatto, scaricate i sorgenti di GnuPG 1.4.9 (ovviamente da http://www.gnupg.org). Nella cartella in cui è stato installato MSYS, c'è una sottocartella "home" al cui interno si trova una ulteriore cartella il cui nome è il vostro nome utente sotto Windows. Al suo interno dovete scompattare i sorgenti di GnuPG, mantenendo la struttura delle directory presente nel file compresso. Se tutto va bene, vi ritroverete con una ulteriore sottocartella chiamata "gnupg-1.4.9" con tutti i sorgenti al suo interno.

4.2) Aprite ora il file "seat.test" nella sottocartella "checks" e portatevi alla linea 9.

--Immagine: File SEAT.TEST prima della modifica. Fine immagine.--

Modificate "$i y" in "z y" e aggiungete subito prima di essa una nuova linea con in seguente comando: "unix2dos -c 7bit -n $i z". Salvate e chiudete il file.

--Immagine: File SEAT.TEST dopo la modifica. Fine immagine.--

5) Compilazione di GnuPG:

5.1) Scrivete i seguenti comandi al prompt di MSYS, appena lo avete avviato:
a) cd gnupg-1.4.9
b) CFLAGS='-O3 -mtune=i386 -march=i386 -mfpmath=387 -mno-mmx -mno-sse -mno-3dnow -mno-sse2' LDFLAGS='-s' ./configure

--Immagine: Inizio della compilazione. Finestra di MSYS con la riga di
comando che avvia lo script di configurazione. Fine immagine.--

Altre opzioni possono essere aggiunte alla fine della riga di comando di "./configure". Ad esempio, si può aggiungere "--enable-camellia" per abilitare il supporto sperimentale all'algoritmo di cifratura "Camellia". Una lista delle possibili opzioni è visualizzabile con il comando "./configure --help". Con questa procedura si otterrà un eseguibile in grado di girare su qualunque macchina i386. Nel caso in cui vogliate invece attivare delle ottimizzazioni particolari per la vostra macchina, potete sostituire i parametri all'interno della variabile CFLAGS con quelli che preferite. Ad esempio, per una macchina Pentium III potete specificare:

CFLAGS='-O3 -mtune=pentium3 -march=pentium3 -mfpmath=sse -mmmx -msse'

oppure, per un Athlon-XP:

CFLAGS='-O3 -mtune=athlon-xp -march=athlon-xp -mfpmath=sse -mmmx -msse -m3dnow'.

L'eseguibile così creato necessiterà, per poter funzionare, dei file .dll relativi alle librerie esterne che avrete deciso di usare nel punto 3 (bzip2, zlib, ecc.). Tali file dovranno essere copiati nella stessa cartella di gpg.exe o in un altra cartella contenuta nella %path% di sistema (vedi punto 5.2). Nel caso in cui vogliate invece un eseguibile indipendente e in grado di funzionare senza file .dll aggiuntivi, dovrete specificare:

LDFLAGS='-s -static'

invece di:

LDFLAGS='-s'.

Bisogna notare, però, che questa procedura non funziona necessariamente con tutte le librerie. In particolare, libiconv non può essere collegata all'eseguibile in maniera statica, e pertanto il file iconv.dll sarà comunque necessario per usare il supporto multilingue. Per una lista completa di tutti i parametri che potete passare al compilatore per attivare particolari ottimizzazioni, vi rimando al manuale di GCC. A questo punto vi apparirà una lunga serie di messaggi mentre vengono impostati i parametri della compilazione. Alla fine dovrebbe apparirvi il messaggio riportato nella figura qui sotto. Se non avviene, vuole dire che c'è stato un errore di qualche tipo.
c) make

--Immagine: Compilazione vera e propria. Fine dell'esecuzione dello
script di configurazione con il messaggio che avverte che GnuPG è stato
correttamente configurato per essere compilato sotto MinGW32, subito prima
di avviare make. Fine immagine.--

Vi apparirà una lunga serie di messaggi durante la compilazione. Se tutto funziona bene, vi ritroverete nella situazione mostrata nella figura qui sotto. Se no la compilazione si interromperà segnalando un errore.
d) make check

--Immagine: Fine della compilazione. Ultima parte dell'output di make.
Fine immagine.--

Questo non è un passaggio obbligatorio, ma è utile per controllare che tutto abbia funzionato bene e la copia di GnuPG appena compilata sia perfettamente funzionante.

--Immagine: Check dopo la compilazione. Output di make check. 
Ultime fasi dell'operazione. Fine immagine.--

e) iconv -f LATIN1 -t cp850 po/it.po > po/it2.po && mv po/it2.po po/it.po && msgfmt -o po/it.gmo po/it.po
ove "it" può essere sostituito con il file di localizzazione che vi interessa (ad esempio, "fr" per il francese, "es" per lo spagnolo, ecc.) e "cp850" deve naturalmente essere sostituito con l'effettiva codepage (una sorta di "tabella dei caratteri") usata dalla vostra versione di Windows nelle finestre del prompt dei comandi. La codepage 850 è quella, cosiddetta, dell'Europa occidentale, e viene usata dalle versioni italiane. Per sapere la codepage usata dalla vostra versione di Windows, aprite una finestra del prompt dei comandi e usate il comando "chcp". Se siete interessati a più di una localizzazione di GnuPG, ripetete questo punto "e" per tutti i file di localizzazione che vi interessano. Se avete saltato il punto 3.2, allora saltate anche questo punto "e".

5.2) Se tutto è andato bene e non avete avuto errori, allora troverete gpg.exe e gpgv.exe nella sottocartella g10, gpgkeys_hkp.exe, gpgkeys_ldap.exe, gpgkeys_finger.exe e gpgkeys_http.exe nella cartella keyserver e gpgsplit.exe nella sottocartella tools. A questo punto potete copiarli in una cartella apposita (ad esempio C:\Programmi\GnuPG), insieme alle librerie dinamiche che avrete scelto di usare durante la compilazione (ad es. bzip2, iconv, libcurl, zlib, ecc.) e che troverete in C:\MinGW\bin. Potete anche copiare il file "it.gmo" (o quello che avete creato al punto 5.1g qui sopra), che troverete nella cartella "po", nella cartella dei file di localizzazione di GnuPG (ad esempio C:\Programmi\GnuPG\gnupg.nls) rinominandolo in "it.mo". Potete a questo punto seguire la normale procedura di installazione di GnuPG per Windows, perfettamente descritta nel sito di Stefano a cui vi rimando e nel file README-W32.txt.


--- Valid HTML 4.01! --- Valid CSS! --- Level Triple-A conformance icon, W3C-WAI Web Content Accessibility Guidelines 1.0 ---

--- Bobby WorldWide Approved AAA --- Cynthia Tested! --- Bobby WorldWide Approved 508 ---

--- Backward Compatible --- See your web site through colorblind eyes with the colorblind web page filter. --- Lynx Inspected ---

--- Created with VIM! --- Viewable With Any Browser --- Graphics by GIMP ---

--- Creative Commons License ---

--- OpenPGP Digitally Signed HTML ---