Mac OS X 10.6 以降で実行されている python ソフトウェアで使用するために、Mac OS 10.6.5 を実行している 64 ビット Mac で、 Mozilla NSS ライブラリの python インターフェイスであるpython-nssを構築しようとしています。特定のオプションを使用して NSS 自体を正常にビルドできますが、python-nss ビルドでいくつかの警告が表示され、結果の Python モジュールは使用できません。
NSS をビルドするには、これらの手順に従いますが、cvs からのチェックアウトではなく、このNSS ソース コードを使用します。を実行するmake nss_build_all
と、次のエラーが発生します。
ncraike@ncraikework ~/Installs/nss-3.12.9/mozilla/security/nss
$ make nss_build_all
...
drbg.c: In function ‘RNG_RandomUpdate’:
drbg.c:516: error: size of array ‘arg’ is negative
make[3]: *** [Darwin10.5.0_DBG.OBJ/Darwin_SINGLE_SHLIB/drbg.o] Error 1
make[2]: *** [libs] Error 2
make[1]: *** [libs] Error 2
make: *** [libs] Error 2
問題の行 ( の 516 行目mozilla/security/nss/lib/freebl/drbg.c
) は、特定の型が予想されるサイズであるというアサーションです。
PR_STATIC_ASSERT(sizeof(size_t) <= 4);
簡単なテスト プログラムを作成すると、sizeof(size_t) は 8 のように見えるため、上記の手順ページにあるにもかかわらず、おそらく 64 ビット バージョンがビルドされています。
Alpha/OSF1 を除く Unix プラットフォームでは、システムの 64 ビット ABI 用のビルドが必要な場合は、環境で USE_64=1 を設定します。デフォルトでは、NSS は、Alpha/OSF1 を除くすべてのプラットフォームで 32 ビット環境用にビルドされます。
gcc オプション(同様-arch i386
の問題で推奨) を追加しても解決しませんが、USE_64 環境変数を使用したビルドは成功します (ただし、64 ビット ビルドは私が必要としているものではないかもしれません)。
ncraike@ncraikework ~/Installs/nss-3.12.9/mozilla/security/nss
$ USE_64=1 make nss_build_all
これで問題ないかもしれませんが、(このソースを使用して) python-nss をビルドしようとすると問題が発生します。
setup.py
ビルドしたばかりの NSS ライブラリを含めるには、python-nss にいくつかの変更を加える必要があります。元setup.py
の例では、拡張機能ごとにインクルード ディレクトリがハードコードされています。たとえば、次のようになります。
nss_nss_extension = \
Extension('nss.nss',
sources = ['src/py_nss.c'],
include_dirs = ['src', '/usr/include/nss3', '/usr/include/nspr4'],
libraries = ['nspr4', 'ssl3', 'nss3'],
extra_compile_args = extra_compile_args,
)
したがって、次の行を追加して拡張宣言を変更しました。
DIST_ROOT = '/Users/ncraike/Installs/nss-3.12.9/mozilla/dist/'
INCLUDE_DIRS = [DIST_ROOT+'Darwin10.5.0_64_DBG.OBJ/include', DIST_ROOT+'public/nss/', DIST_ROOT+'private/nss/']
LIB_DIRS = [DIST_ROOT+'Darwin10.5.0_64_DBG.OBJ/lib/']
...そして、各拡張子を変更して INCLUDE_DIRS リストを追加し、library_dirs
引数を含めます ( distutils のドキュメントで説明されています)。例えば:
nss_nss_extension = \
Extension('nss.nss',
sources = ['src/py_nss.c'],
include_dirs = ['src'] + INCLUDE_DIRS,
libraries = ['nspr4', 'ssl3', 'nss3'],
library_dirs = LIB_DIRS,
extra_compile_args = extra_compile_args,
)
これらの変更後、python setup.py build
は実行され、NSS ライブラリを認識しているように見えますが、次のようないくつかの警告が生成されます。
src/py_nss.c:12640: warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘Py_ssize_t’
gcc-4.2 -Wl,-F. -bundle -undefined dynamic_lookup -arch i386 -arch ppc -arch x86_64 build/temp.macosx-10.6-universal-2.6/src/py_nss.o -L/Users/ncraike/Installs/nss-3.12.9/mozilla/dist/Darwin10.5.0_64_DBG.OBJ/lib/ -lnspr4 -lssl3 -lnss3 -o build/lib.macosx-10.6-universal-2.6/nss/nss.so
ld: warning: in build/temp.macosx-10.6-universal-2.6/src/py_nss.o, file was built for unsupported file format which is not the architecture being linked (i386)
ld: warning: in /Users/ncraike/Installs/nss-3.12.9/mozilla/dist/Darwin10.5.0_64_DBG.OBJ/lib//libnspr4.dylib, file was built for unsupported file format which is not the architecture being linked (i386)
ld: warning: in /Users/ncraike/Installs/nss-3.12.9/mozilla/dist/Darwin10.5.0_64_DBG.OBJ/lib//libssl3.dylib, file was built for unsupported file format which is not the architecture being linked (i386)
「ファイルは、リンクされているアーキテクチャではない、サポートされていないファイル形式でビルドされました」は、最も一般的な警告です。このエラーは別のサイトの投稿で-arch i386
言及されており、gcc でオプションを使用することで解決できる可能性があります。ビルド プロセスのどの段階でこのオプションを追加するのか (NSS か python-nss か?)、それを python distutils ビルド スクリプトに追加する方法がわかりません。
ビルドは完了しますが、結果の python モジュールは使用できないようです:
ncraike@ncraikework ~/Installs/python-nss-0.10/build/lib.macosx-10.6-universal-2.6
$ ls
nss
ncraike@ncraikework ~/Installs/python-nss-0.10/build/lib.macosx-10.6-universal-2.6
$ python
Python 2.6.1 (r261:67515, Jun 24 2010, 21:47:49)
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import nss.nss
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: dlopen(nss/nss.so, 2): Library not loaded: @executable_path/libssl3.dylib
Referenced from: /Users/ncraike/Installs/python-nss-0.10/build/lib.macosx-10.6-universal-2.6/nss/nss.so
Reason: image not found
NSS の構築方法または python-nss の構築方法に誤りがありますか? Mac OS X NSS ライブラリと正しくリンクするには、python-nss ビルド スクリプトにどのように指示すればよいですか? 私は C の経験よりも Python の経験の方がはるかに多いので、簡単なビルド エラーが発生しても驚かないでしょう。
Xcode 3.2.4 (64 ビット) がインストールされた Mac OS 10.6.5 を実行しています。とgcc -v
を与えます。gcc version 4.2.1 (Apple Inc. build 5664)
Target: i686-apple-darwin10
ありがとう。