2009-11-18 2 views
29

Мне нужно скомпилировать ICU, используя собственный механизм сборки. Поэтому вопрос:Как запустить Makefile в setup.py?

Как запустить Makefile с setup.py? Очевидно, я только хочу, чтобы он запускался во время процесса сборки, а не при установке.

ответ

33

Метод, который я обычно использую, чтобы переопределить команду в вопросе:

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}, ...) 

Это произошло мне достаточно времени, чтобы разобраться с документацией и источником, поэтому я надеюсь, что это избавит вас от боли.

Примечание: вы также можете использовать этот параметр cmdclass для добавления новых команд.

+1

Спасибо за ответ. Сохраняет мне боль? Сортировка, я уже потратил слишком много времени на поиск этого ответа ... –

+6

после прочтения этого ответа я реализовал нечто подобное, и он работает довольно хорошо (https://github.com/Turbo87/py-xcsoar/blob /master/setup.py). код запускает Makefile, который создает два исполняемых файла и измененный setup.py, а затем даже устанавливает эти исполняемые файлы в систему. То же самое можно было бы установить и для любой библиотеки. – TBieniek

+0

Обратите внимание, что это, похоже, не очень хорошо работает с пипсом, однако, если вы измените 'distutils.command.install' на' setuptools.command.install', это делается, взятый из http://stackoverflow.com/questions/15853058/ run-custom-task-when-call-pip-install – wxs

1

Если вы строите расширение python, вы можете использовать Extutils/setuptools Extensions. Например:

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

Там много вариантов для создания расширений, смотрите документацию: http://docs.python.org/distutils/setupscript.html

+0

Это не расширение, которое я хочу построить, а просто библиотека C, которая не будет связана с Python. (Это расширение для sqlite.) –

0

Возможно создание библиотек C с distutils (см. Параметр libraries distutils.core.setup), но вам, возможно, придется дублировать параметры, которые уже находятся в Makefile, поэтому проще всего сделать это команды установки, как объяснено в других ответах и ​​вызове make с модулем подпроцесса.

Смежные вопросы