Я пытаюсь собрать 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
.
Спасибо.