2017-03-08 7 views
4

CコードとNumPyの依存関係を持つPythonパッケージを作成しようとしていますが、これを実現する最も簡単な方法はnumpy.distutilsだと思いました。これまでのところ私は、同じディレクトリ内のファイルsetup.pynumpy.distutilsのアーキテクチャーの奇妙な選択

from numpy.distutils.core import setup 
from numpy.distutils.misc_util import Configuration 
from distutils.extension import Extension 

ext_modules=[ 
    Extension("test", 
       sources=["test.c"], 
       libraries=["gmp"], 
    ) 
] 

configuration = Configuration(
    package_name = "test", 
    ext_modules = ext_modules, 
) 

setup(**configuration.todict()) 

と空test.cを持っています。

しかし、いくつかの理由で、それは、C関数を呼び出すに

ld: warning: ignoring file /usr/local/lib/libgmp.dylib, 
file was built for x86_64 which is not the architecture being linked (i386): 
/usr/local/lib/libgmp.dylib 

警告し、さらに問題につながる、(システムは、Mac OS Xで)コンパイル時に厄介な-arch i386 -arch x86_64フラグを追加します。

どうすればその問題を解決できますか?どういうわけかターゲットアーキテクチャを指定できますか?

UPD。現在はやりました

ARCHFLAGS="-arch x86_64" python setup.py build_ext --inplace 

しかし、私はそれを展開できるように、アーキテクチャの先験的な知識なしにどのプラットフォームでも動作したいと思います。

答えて

1

これはnumpy.distutilsではなくdistutilsで追加されたとは思いません。 distutilsは、Pythonがどのようにビルドされたか(これらのフラグは、32ビットと64ビットの両方のアーキテクチャーを持つ大規模なバイナリとして構築されています)を取得します。この情報は$PREFIX/lib/python<version>/config/Makefileファイルから取得されます。

これは、対処する必要があるバイナリ依存関係を持つパッケージを構築する人にとっては、きわめて普通のことです。彼らのPythonが太っているのか薄いのかは分かりません。どのようにして彼らがlibgmp.dylibを構築したのか分かりません。多くの努力を払って、setup.pylibgmp.dylibという名前のコードを書き込んで、そのアーキテクチャの質問をしてからdistutilsが正しいフラグだけを使用するように設定します(そして、これが必要でないとき、正常に動作する、正常に失敗するなど)。 )。しかし、おそらく、これが出現する可能性があることと、ARCHFLAGS=解決策を単に文書化するだけで、開発努力のために多くの価値を得ることができます。

+0

まあ...それは確かに他のオプションがないようです。 –

関連する問題