Subsections


6 Compilare le estensioni: trucchi e suggerimenti

Quando possibile, Distutils tenta di usare le informazioni di configurazione rese disponibili dall'interprete Python usato per eseguire lo script setup.py. Per esempio, le stesse opzioni del compilatore e del linker usate per compilare Python verranno usate anche per compilare le estensioni. Di solito questo lavora bene, ma in situazioni complicate può essere inappropriato. Questa sezione discute su come annullare il comportamento predefinito di Distutils.


6.1 Modificare le opzioni di compilazione/linker

Compilando un'estensione Python scritta in C o C++ verranno richieste specifiche e personalizzate opzioni per il compilatore ed il linker, per usare una particolare libreria o produrre un tipo speciale di codice oggetto. Questo è vero, specialmente se l'estensione non è stata testata sulla vostra piattaforma, o se state provando a compilare Python per più piattaforme.

Nella maggior parte dei casi, l'autore dell'estensione potrebbe avere previsto che la compilazione dell'estensione potrebbe essere complicata ed allora fornirà un apposito file Setup da editare. Questo verrà fatto solo se il modulo distribuito contiene molti moduli di estensione separati, o se vengono richieste spesso impostazioni elaborate per le opzioni del compilatore in uso.

Un file Setup, se presente, viene analizzato per accettare un elenco delle estensioni da costruire. Ogni riga in un file Setup descrive un singolo modulo. Le righe hanno la seguente struttura:


 module ... [sourcefile ...] [cpparg ...] [library ...]
 

Esaminerà ogni riga del campo alla volta.

Se una particolare piattaforma richiede la presenza di una particolare libreria sulla vostra piattaforma, potete aggiungerla editando il file Setup ed eseguendo python setup.py build. Per esempio, se il modulo definito dalla riga

foo foomodule.c

e dovesse essere linkato con la libreria math libm.a sulla vostra piattaforma, aggiungerete semplicemente -lm alla riga:

foo foomodule.c -lm

Opzioni arbitrarie predisposte per il compilatore od il linker possono essere fornite mediante -Xcompiler arg e le opzioni -Xlinker arg:

foo foomodule.c -Xcompiler -o32 -Xlinker -shared -lm

La prossima opzione dopo -Xcompiler e -Xlinker verrà aggiunta all'appropriata riga di comando, così nel suddetto esempio il compilatore passerà l'opzione -o32 ed il linker passerà -shared. Se l'opzione di un compilatore richiede un argomento, dovrete fornire opzioni multiple -Xcompiler; per esempio, per passare -x c++ il file Setup dovrebbe contenere -Xcompiler -x -Xcompiler c++.

Le opzioni di compilazione possono essere fornite attraverso l'impostazione della variabile d'ambiente CFLAGS. Se impostata, il contenuto di CFLAGS verrà aggiunto alle opzioni del compilatore, specificate nel file Setup.


6.2 Usare compilatori non-Microsoft su Windows

6.2.1 Borland C++

Questa sezione descrive i passi necessari per usare Distutils con il compilatore Borland C++ versione 5.5.

Prima di tutto dovete sapere che il formato dei file oggetto di Borland è differente dal formato usato dalla versione Python che potete scaricare dal sito web di Python o di ActiveState. (Python viene compilato con Microsoft Visual C++, che usa COFF come formato dei file oggetto.) Per questa ragione dovete convertire la libreria di Python python20.lib nel formato Borland. Potete farlo in questo modo:

coff2omf python20.lib python20_bcpp.lib

Il programma coff2omf viene fornito insieme al compilatore Borland. Il file python20.lib è nella directory Libs della vostra installazione Python. Se la vostra estensione usa altre librerie (zlib,...) dovrete convertire anche queste.

I file convertiti devono risiedere nella stessa directory delle normali librerie.

Come gestisce Distutils l'uso di queste librerie con i loro nomi cambiati? Se l'estensione necessita di una libreria (per esempio foo) Distutils cerca prima di trovare la libreria con il suffisso _bcpp (per esempio foo_bcpp.lib) e quindi usa questa libreria. Nel caso in cui non la trovasse, come può accadere per una libreria particolare, userà il nome predefinito (foo.lib)1.

Per fare compilare a Distutils le vostre estensioni con Borland C++ dovete ora digitare:

python setup.py build --compiler=bcpp

Se volete usare il compilatore Borland C++ come predefinito, potete specificarlo nel file di configurazione di sistema per Distutils (vedete la sezione 5.)

Vedete anche:

C++Builder Compiler
Informazioni sul compilatore libero C++ di Borland, inclusi i link alle pagine dei download.

Creating Python Extensions Using Borland's Free Compiler
Il documento descrive come usare la riga di comando del compilatore C++ libero della Borland in Python.

6.2.2 GNU C / Cygwin / MinGW

Questa sezione descrive i passi necessari per usare Distutils con i compilatori GNU C/C++ nelle loro distribuzioni Cygwin e MinGW.2 Se l'interprete Python è stato compilato con Cygwin, dovrebbe funzionare tutto, rendendo inutile leggere i passi successivamente descritti.

Questi compilatori hanno bisogno di alcune librerie speciali. Questa prova è più complessa di quella per il C++ di Borland, perché non c'è un programma per convertire le librerie.

Prima dovete creare una lista di simboli che le DLL Python esporteranno. Potete trovare un buon programma per fare questa prova presso http://starship.python.net/crew/kernr/mingw32/Notes.html, vedete PExports 0.42h.

pexports python20.dll >python20.def

Quindi create da queste informazioni una libreria di importazione per gcc.

dlltool --dllname python20.dll --def python20.def --output-lib libpython20.a

La libreria risultante verrà posizionata nella stessa directory di python20.lib. Dovrebbe essere la directory libs sotto la vostra directory Python d'installazione.

Se le vostre estensioni usano altre librerie (zlib,...) dovrete convertire anche quelle. I file convertiti dovranno risiedere nella stessa directory come in una normale libreria. Per fare compilare le vostre estensioni a Distutils con Cygwin dovete ora digitare

python setup.py build --compiler=cygwin

e per Cygwin in modalità no-cygwin 3 o per MinGW digitate:

python setup.py build --compiler=mingw32

Se volete usare ognuna di queste opzioni/compilatori in modo predefinito, dovreste prendere in considerazione la possibilità di scriverle nel vostro file di configurazione globale per Distutils (vedete la sezione 5.)

Vedete anche:

Building Python modules on MS Windows platform with MinGW
Informazioni sulla compilazione delle librerie richieste per l'ambiente MinGW.

http://pyopengl.sourceforge.net/ftp/win32-stuff/
Conversione ed importazione di librerie nel formato Cygwin/MinGW e Borland ed uno script per creare il registro delle voci necessarie a Distutils per localizzare dove è stata compilata o installata la versione in uso di Python.



Footnotes

...foo.lib)1
Questo significa anche che potete sostituire tutte le esistenti librerie COFF con le librerie OMF con lo stesso nome.
... MinGW.2
Controllate http://sources.redhat.com/cygwin/ e http://www.mingw.org/ per maggiori informazioni
... no-cygwin3
Quindi non avete un'emulazione POSIX disponibile, ma non avete neanche bisogno di cygwin1.dll.
Vedete Circa questo documento... per informazioni su modifiche e suggerimenti.