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.
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.
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:
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: