Как мне собрать Python-NSS и NSS для Mac OS X? - PullRequest
2 голосов
/ 19 января 2011

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

Спасибо.

1 Ответ

0 голосов
/ 20 марта 2012

В 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

...