如何在Mac OS X上构建python-nss和NSS?
我正在尝试在一台运行Mac OS 10.6.5的64位Mac上构建python-nss,这是一个用于Mozilla NSS库的Python接口,目的是为了在Mac OS X 10.6或更高版本的Python软件中使用。我可以成功构建NSS本身,使用了一些特定的选项,但构建python-nss时出现了几个警告,最终生成的Python模块无法使用。
为了构建NSS,我按照这些说明进行操作,但使用的是这个NSS源代码,而不是从cvs检出的代码。如果我直接运行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
出问题的那一行(mozilla/security/nss/lib/freebl/drbg.c
的第516行)是一个断言,检查某种类型的大小是否符合预期:
PR_STATIC_ASSERT(sizeof(size_t) <= 4);
如果我写一个简单的测试程序,发现sizeof(size_t)
似乎是8,所以可能正在构建64位版本,尽管在上面的说明页面上有这样的内容:
在Unix平台上,除了Alpha/OSF1,如果你想要为系统的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(使用这个源代码)时就出现了问题。
需要对python-nss的setup.py
进行一些修改,以包含刚刚构建的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时出错了吗?我应该如何告诉python-nss的构建脚本正确链接Mac OS X的NSS库?我在Python方面的经验比C多,所以如果我犯了一些简单的构建错误,我也不会感到惊讶。
我正在运行Mac OS 10.6.5,安装了Xcode 3.2.4(64位)。gcc -v
显示gcc version 4.2.1 (Apple Inc. build 5664)
和Target: i686-apple-darwin10
。
谢谢。
1 个回答
在OSX 10.7系统中,我们默认有llvm-gcc和llvm-g++这两个工具。它们通常会输出更详细的错误信息。
cc -o Darwin11.3.0_DBG.OBJ/Darwin_SINGLE_SHLIB/drbg.o -c -g -fPIC -Di386 -Wmost -fpascal-strings -fno-common -pipe -DDARWIN -DHAVE_STRERROR -DHAVE_BSD_FLOCK -DXP_UNIX -DSHLIB_SUFFIX=\"dylib\" -DSHLIB_PREFIX=\"lib\" -DSHLIB_VERSION=\"3\" -DSOFTOKEN_SHLIB_VERSION=\"3\" -DRIJNDAEL_INCLUDE_TABLES -DDEBUG -UNDEBUG -DDEBUG_antkong -DUSE_UTIL_DIRECTLY -DMP_API_COMPATIBLE -I../../../../dist/Darwin11.3.0_DBG.OBJ/include -I../../../../dist/public/nss -I../../../../dist/private/nss -Impi -Iecl drbg.c
drbg.c:471:34: warning: implicit conversion from enumeration type 'PRStatus' to different enumeration type 'SECStatus' (aka 'enum _SECStatus') [-Wconversion]
return (globalrng != NULL) ? PR_SUCCESS : PR_FAILURE;
~ ^~~~~~~~~~
drbg.c:471:47: warning: implicit conversion from enumeration type 'PRStatus' to different enumeration type 'SECStatus' (aka 'enum _SECStatus') [-Wconversion]
return (globalrng != NULL) ? PR_SUCCESS : PR_FAILURE;
~ ^~~~~~~~~~
drbg.c:516:5: error: 'arg' declared as an array with a negative size
PR_STATIC_ASSERT(sizeof(size_t) <= 4);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
../../../../dist/Darwin11.3.0_DBG.OBJ/include/prtypes.h:528:42: note: expanded from macro 'PR_STATIC_ASSERT'
extern void pr_static_assert(int arg[(condition) ? 1 : -1])
^~~~~~~~~~~~~~~~~~~~
2 warnings and 1 error generated.
希望这些信息能帮助你找到解决办法,或者向Mozilla NSS项目提交一个bug报告。