如何为Mac OS X构建python nss和nss?

如何为Mac OS X构建python nss和nss?,python,macos,build,nss,Python,Macos,Build,Nss,我正试图在运行MacOS10.6.5的64位Mac上为构建一个python接口,用于运行MacOSX10.6或更高版本的python软件。我可以使用某些选项成功地构建NSS本身,但是python NSS构建会给出几个警告,并且生成的python模块不可用 为了构建NSS,我将遵循这一点,而不是使用cvs的签出。如果我只是运行make nss\u build\u all,我会遇到一个错误: ncraike@ncraikework ~/Installs/nss-3.12.9/mozilla/secu

我正试图在运行MacOS10.6.5的64位Mac上为构建一个python接口,用于运行MacOSX10.6或更高版本的python软件。我可以使用某些选项成功地构建NSS本身,但是python NSS构建会给出几个警告,并且生成的python模块不可用

为了构建NSS,我将遵循这一点,而不是使用cvs的签出。如果我只是运行
make nss\u build\u 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);
这可能很好,但在尝试构建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,
              )
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,
              )
因此,我通过添加以下行修改了扩展声明:

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
参数(如中所述)。例如:

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,
              )
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
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:675152010年6月24日21:47:49)
[GCC 4.2.1(苹果公司构建5646)]关于达尔文
有关详细信息,请键入“帮助”、“版权”、“信用证”或“许可证”。
>>>导入nss.nss
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
ImportError:dlopen(nss/nss.so,2):未加载库:@executable_path/libssl3.dylib
引用自:/Users/ncraike/Installs/python-nss-0.10/build/lib.macosx-10.6-universal-2.6/nss/nss.so
原因:找不到图像
我在如何构建NSS或如何构建python NSS时出错了吗?我应该如何告诉python nss构建脚本正确链接Mac OS X nss库?我的python经验比C经验丰富得多,所以如果我犯了一些简单的构建错误,我不会感到惊讶

我正在运行MacOS10.6.5,安装了Xcode 3.2.4(64位)
gcc-v
给出了
gcc版本4.2.1(Apple Inc.build 5664)
目标:i686-Apple-darwin10


谢谢。

在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.
cc-o Darwin11.3.0\u DBG.OBJ/Darwin\u SINGLE\u SHLIB/drbg.o-c-g-fPIC-Di386-Wmost-fpascal strings-fno common-pipe-DDARWIN-DHAVE\u STRERROR-DHAVE\u BSD\u FLOCK-DXP\u UNIX-DSHLIB\u后缀=“dylib\”-DSHLIB\u前缀=“lib\”-DSHLIB\u版本=“3\”-DSOFTOKEN\u SHLIB版本=“3\”-DRIJNDAEL\u INCLUDE\u TABLES-DDEBUG-UNDEBUG-DDEBUG\u antkong-DUSE\u UTIL\u DIRECTLY-DMP\u API兼容-I../../../../../dist/Darwin11.3.0\u DBG.OBJ/INCLUDE-I../../dist/public/nss-I../../../dist private/nss-Impi-Iecl-drbg.c
drbg.c:471:34:警告:从枚举类型“PRStatus”隐式转换为不同的枚举类型“SECStatus”(也称为“enum _SECStatus”)[-Wconversion]
返回值(globalrng!=NULL)?成功:失败;
~ ^~~~~~~~~~
drbg.c:471:47:警告:从枚举类型“PRStatus”隐式转换为不同的枚举类型“SECStatus”(也称为“enum _SECStatus”)[-Wconversion]
返回值(globalrng!=NULL)?成功:失败;
~              ^~~~~~~~~~
drbg.c:516:5:错误:“arg”声明为大小为负的数组

PR_STATIC_ASSERT(sizeof(size_t)在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.
cc-o Darwin11.3.0\u DBG.OBJ/Darwin\u SINGLE\u SHLIB/drbg.o-c-g-fPIC-Di386-Wmost-fpascal strings-fno common-pipe-DDARWIN-DHAVE\u STRERROR-DHAVE\u BSD\u FLOCK-DXP\u UNIX-DSHLIB\u后缀=“dylib\”-DSHLIB\u前缀=“lib\”-DSHLIB\u版本=“3\”-DSOFTOKEN\u SHLIB版本=“3\”-DRIJNDAEL\u INCLUDE\u TABLES-DDEBUG-UNDEBUG-DDEBUG\u antkong-DUSE\u UTIL\u DIRECTLY-DMP\u API兼容-I../../../../../dist/Darwin11.3.0\u DBG.OBJ/INCLUDE-I../../dist/public/nss-I../../../dist private/nss-Impi-Iecl-drbg.c
drbg.c:471:34:警告:从枚举类型“PRStatus”隐式转换为不同的枚举类型“SECStatus”(也称为“enum _SECStatus”)[-Wconversion]
返回(globalrng!=NULL)?PR_成功:PR_失败;
~ ^~~~~~~~~~
drbg.c:471:47:警告:从枚举类型“PRStatus”隐式转换为不同的枚举类型“SECStatus”(也称为“enum _SECStatus”)[-Wconversion]
返回(globalrng!=NULL)?PR_成功:PR_失败;
~              ^~~~~~~~~~
drbg.c:516:5:错误:“arg”声明为大小为负的数组
PR_STATIC_ASSERT(sizeof(size_t)