2013-03-25 3 views
1

Используя python 2.6, я пытаюсь создать RPM для модуля расширения python C.Относительные включают пути при создании RPM для расширения python с использованием distutils

setup.py, что я использую содержит что-то вроде:

from distutils.core import setup, Extension 

foo_ext = Extension('foo', 
        sources=['foo.c', '../src/common.c'], 
        include_dirs=['../includes']) 

setup(... , ext_modules=[foo_ext]) 

Если я бегу python setup.py build из /devel/foo, например, он компилирует и строит без каких-либо ошибок, и gcc вызывается с правильными путями, а именно:

gcc ... -I/devel/includes ... 

При использовании python setup.py bdist_rpm вместо этого, то относительные пути, используемые выше, преобразуются в абсолютные пути относительно RPM сборки директории, это приводит к в gcc попытке компиляции с помощью: тогда

gcc ... -I/devel/foo/build/bdist.linux-x86_64/rpm/BUILD/includes ... 

Компиляция не удается, как требуется .h файл не найден в заголовочном пути.

Любые предложения или обходные пути для этого?

+1

На данный момент * distutils * от Python 2.7 по-прежнему страдает этой проблемой. – firegurafiku

ответ

2

решаемые путем установки переменной окружения во время первого прохода через скрипт, который затем читать снова при сборке RPM:

import os 
from distutils.core import setup, Extension 

src_path = os.path.abspath('../src/common.c') 
inc_path = os.path.abspath('../includes') 

if 'SRC_PATH' not in os.environ: 
    os.environ['SRC_PATH'] = src_path 
    os.environ['INC_PATH'] = inc_path 
else: 
    src_path = os.environ['SRC_PATH'] 
    inc_path = os.environ['INC_PATH'] 

foo_ext = Extension('foo', 
       sources=['foo.c', src_path], 
       include_dirs=[inc_path]) 

setup(... , ext_modules=[foo_ext]) 
+0

Похож на огромный куд. Должен быть способ сделать эту ошибку «setup.py build_rpm» скопировать все исходное дерево в его каталог сборки. – firegurafiku

0

я мог бы решить подобную проблему, предоставляя Distutils с надлежащей MANIFEST.in файл, в котором перечислены все файлы заголовков, которые я хотел включить. В моем случае это было так:

include src/_rvlm_fdtd/include/rvlm/fdtd/* –or– 
recursive-include src/_rvlm_fdtd *.h 

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

Причина, по которой фаза сборки RPM не была в состоянии узнать ваши заголовки, заключается в том, что она сначала создает исходный дистрибутив (с setup.py sdist) и распаковывает полученный tarball во временный каталог сборки. Таким образом, ваш дистрибутив источника не содержит всех файлов, необходимых для создания.