Как собрать python-nss и NSS для Mac OS X?

Я пытаюсь собрать python-nss. , интерфейс Python для библиотеки Mozilla NSS на 64-разрядном Mac. под управлением Mac OS 10.6.5 для использования в программном обеспечении Python, работающем в Mac OS X 10.6 или более поздней версии. Я могу успешно собрать сам 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

Рассматриваемая строка (строка 516 из mozilla/security/nss/lib/freebl/drbg.c) является утверждением, что конкретный тип имеет ожидаемый размер:

    PR_STATIC_ASSERT(sizeof(size_t) <= 4);

Если я напишу программу быстрого тестирования, sizeof(size_t) будет равен 8, поэтому, возможно, строится 64-битная версия, несмотря на это на странице с инструкциями выше:

На платформах Unix, кроме Alpha/OSF1, если вам нужна сборка для 64-битного ABI системы, установите USE_64=1 в вашей среде. По умолчанию NSS собирается для 32-разрядной среды на всех платформах, кроме Alpha/OSF1.

Добавление параметра 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 python-nss необходимы для включения только что созданных библиотек 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.

Спасибо.


person Nathan Craike    schedule 19.01.2011    source источник


Ответы (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.

person Anthony Kong    schedule 20.03.2012