1

Python 2.6を使用して、PythonC拡張モジュールのRPMを構築しようとしています。

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インクルードパスに必要なファイルが見つからないため、コンパイルは失敗します。

これに対する提案や回避策はありますか?

4

2 に答える 2

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])
于 2013-03-26T10:08:18.953 に答える
0

distutilsに適切なファイルを提供することで、同様の問題を解決できMANIFEST.inます。このファイルには、インクルードしたいすべてのヘッダーファイルが列挙されています。私の場合は次のようになりました。

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

../しかし、これはあなたの道ではうまくいかないと思います。代わりに、すべてのソースコードをパッケージベースディレクトリ内に配置することをお勧めします。

RPMビルドフェーズでヘッダーを検出できなかった理由は、最初にソースディストリビューションをビルドし(を使用してsetup.py sdist)、結果のtarballを一時的なビルドディレクトリに解凍するためです。したがって、ソースディストリビューションには、ビルドに必要なすべてのファイルが含まれていませんでした。

于 2015-02-12T17:01:34.173 に答える