【问题标题】:How do I build python-nss and NSS for Mac OS X?如何为 Mac OS X 构建 python-nss 和 NSS?
【发布时间】:2011-06-11 14:40:59
【问题描述】:

我正在尝试在运行 Mac OS 10.6.5 的 64 位 Mac 上构建 python-nss,这是 Mozilla NSS library 的 python 接口,用于在 Mac OS X 10.6 或更高版本上运行的 python 软件。使用某些选项,我可以让 NSS 本身成功构建,但是 python-nss 构建给出了几个警告,并且生成的 Python 模块不可用。

为了构建 NSS,我关注 these instructions,但使用的是 NSS source code,而不是从 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 位版本,尽管在上面的说明页面上:

在除 Alpha/OSF1 之外的 Unix 平台上,如果您想要构建系统的 64 位 ABI,请在您的环境中设置 USE_64=1。默认情况下,NSS 在除 Alpha/OSF1 之外的所有平台上构建 32 位环境。

添加 gcc 选项 -arch i386(建议使用 similar issue)没有帮助,但使用 USE_64 环境变量构建是成功的(虽然 64 位构建可能不是我需要的):

ncraike@ncraikework ~/Installs/nss-3.12.9/mozilla/security/nss
$ USE_64=1 make nss_build_all

这可能没问题,但是当我尝试构建 python-nss(使用this source)时会出现问题。

需要对 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 documentation 中所述)。例如:

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)

“文件是为不受支持的文件格式构建的,它不是被链接的体系结构”是最常见的警告。 a post on another site 中提到了此错误,可能的解决方案是将 -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

谢谢。

【问题讨论】:

    标签: python macos build nss


    【解决方案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 项目提交错误报告

    【讨论】:

      猜你喜欢
      • 2014-12-11
      • 1970-01-01
      • 1970-01-01
      • 2013-11-17
      • 1970-01-01
      • 2021-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多