2014-04-24 12 views
10

Ho un modulo che deve essere compilato con C++ 11. Su GCC e Clang, significa uno switch std=c++11 o std=c++0x su compilatori precedenti.Come specificare C++ 11 con distutils?

Python non viene compilato con questo interruttore in modo Distutils non include quando compilazione moduli.

Qual è il modo migliore per compilare C++ 11 codice con distutils?

risposta

8

È possibile utilizzare il parametro extra_compile_args di distutils.core.Extension:

ext = Extension('foo', sources=[....], 
       libraries=[....], 
       extra_compile_args=['-std=c++11'], 
       ....) 

Si noti che questo è completamente dipendente dalla piattaforma. Non funzionerà nemmeno su alcune versioni precedenti di gcc e clang.

+0

ho pensato che il punto centrale di distutils era quello di evitare "completamente dipendente dalla piattaforma". Dal momento che sto distribuendo una libreria che deve essere compilata localmente sulla macchina dell'utente finale, ho davvero bisogno di qualcosa di indipendente dalla piattaforma. – Adam

+0

@Adam Questo è parte del punto di 'distutils', ma una volta che si arriva alla compilazione del codice in modo nativo, questo diventa complicato, quindi ti dà questi handle per fare cose specifiche della piattaforma. Puoi fare cose intelligenti nel tuo 'setup.py' per selezionare le giuste cose specifiche della piattaforma per una serie di piattaforme popolari. Ma non c'è un modo universale per specificare C++ 11, e ci sono un sacco di macchine là fuori che non hanno ancora compilatori che lo supportano. – juanchopanza

+0

puoi indicarmi cosa implicherebbe quella "roba intelligente"? – Adam

1

È possibile sovrascrivere i valori predefiniti per vari Distutils di compilazione e di collegamento bandiere utilizzando le variabili d'ambiente. Ciò potrebbe richiedere alcuni esperimenti a seconda della piattaforma su cui ti trovi e di come è stato costruito il Python che stavi utilizzando. Ma generalmente l'override di CFLAGS influenzerà la fase di compilazione e uno dei numeri LDSHARED o LDFLAGS influenzerà la fase di collegamento.

export CFLAGS='-std=c++11' 
pip install blah 

o

export CFLAGS='-std=c++11' 
python setup.py install 

Su OS X, un'altra opzione è quella di utilizzare la variabile ARCHFLAGS ambiente che ha il vantaggio di non cancellare l'originale CFLAGS o LDSHARED valori.