2009-11-18 2 views
29

Ho bisogno di compilare usando il proprio meccanismo di compilazione. Quindi la domanda:Come posso eseguire un Makefile in setup.py?

Come posso eseguire un Makefile da setup.py? Ovviamente, voglio solo che venga eseguito durante il processo di compilazione, non durante l'installazione.

risposta

33

Il metodo che uso normalmente è quello di ignorare il comando in questione:

from distutils.command.install import install as DistutilsInstall 

class MyInstall(DistutilsInstall): 
    def run(self): 
     do_pre_install_stuff() 
     DistutilsInstall.run(self) 
     do_post_install_stuff() 

... 

setup(..., cmdclass={'install': MyInstall}, ...) 

Questo ha avuto un po 'di tempo per capire la documentazione e la fonte dello distutils, quindi spero che ti risparmi il dolore.

Nota: è anche possibile utilizzare questo parametro cmdclass per aggiungere nuovi comandi.

+1

Grazie per la risposta. Mi risparmia il dolore? Un po ', ho già passato troppo tempo a cercare questa risposta ... –

+6

dopo aver letto questa risposta ho implementato qualcosa di simile e funziona abbastanza bene (https://github.com/Turbo87/py-xcsoar/blob /master/setup.py). il codice esegue un Makefile che crea due file eseguibili e il setup.py modificato quindi installa anche questi eseguibili sul sistema. lo stesso sarebbe possibile per l'installazione di qualsiasi tipo di libreria. – TBieniek

+0

Si noti che questo non sembra funzionare bene con pip, tuttavia se si modifica 'distutils.command.install' in' setuptools.command.install', lo fa, preso da http://stackoverflow.com/questions/15853058/ run-custom-task-when-call-pip-install – wxs

1

Se si sta creando un'estensione python è possibile utilizzare le estensioni di distutils/setuptools. Per esempio:

from setuptools import Extension 
# or: 
# from distutils.extension import Extension 
setup(... 
     ext_modules = [Extension("pkg.icu", 
           ["icu-sqlite/icu.c"]), 
        ] 
    ) 

Ci sono un sacco di opzioni per costruire le estensioni, vedere la documentazione: http://docs.python.org/distutils/setupscript.html

+0

Non è un'estensione che voglio creare ma solo una libreria C che non verrà collegata a Python. (È un'estensione di sqlite.) –

0

È possibile creare librerie C con distutils (consultare il parametro libraries di distutils.core.setup), ma potrebbe essere necessario duplicare le opzioni già presenti nel Makefile, quindi la cosa più semplice da fare è probabilmente estendere il comando install come spiegato in altre risposte e call make con il modulo subprocess.