Arhn - архитектура программирования

Сборка Python с использованием неправильной версии GCC на OS X

Я пытаюсь собрать пакет Python pycrypto. В OS X установлен gcc-4.2, а не gcc-4.0, но python продолжает пытаться использовать gcc-4.0. Как я могу заставить его использовать gcc-4.2? Или я должен пойти об этом по-другому.

Я получаю следующую ошибку:

bash-3.2$ 
bash-3.2$ sudo python setup.py build
running build
running build_py
running build_ext
warning: GMP library not found; Not building Crypto.PublicKey._fastmath.
building 'Crypto.Hash.MD2' extension
gcc-4.0 -fno-strict-aliasing -fno-common -dynamic -arch ppc -arch i386 -std=c99 -O3 -fomit-frame-pointer -Isrc/ -I/Library/Frameworks/Python.framework/Versions/2.6/include/python2.6 -c src/MD2.c -o build/temp.macosx-10.3-fat-2.6/src/MD2.o
unable to execute gcc-4.0: No such file or directory
error: command 'gcc-4.0' failed with exit status 1
bash-3.2$ 
bash-3.2$ 
bash-3.2$ 

Я использую Mac OS X 10.6.7 с python 2.6.6 и XCode.

РЕДАКТИРОВАТЬ: Если я добавлю CC=gcc-4.2, я все равно получаю сообщение об ошибке:

bash-3.2$ 
bash-3.2$ export CC=gcc-4.2
bash-3.2$ python setup.py build
running build
running build_py
running build_ext
warning: GMP library not found; Not building Crypto.PublicKey._fastmath.
building 'Crypto.Hash.MD2' extension
gcc-4.2 -fno-strict-aliasing -fno-common -dynamic -std=c99 -O3 -fomit-frame-pointer -arch i386 -arch x86_64 -Isrc/ -I/Library/Frameworks/Python.framework/Versions/2.6/include/python2.6 -c src/MD2.c -o build/temp.macosx-10.3-intel-2.6/src/MD2.o
gcc-4.0 -g -bundle -undefined dynamic_lookup -arch i386 -arch x86_64 build/temp.macosx-10.3-intel-2.6/src/MD2.o -o build/lib.macosx-10.3-intel-2.6/Crypto/Hash/MD2.so
unable to execute gcc-4.0: No such file or directory
error: command 'gcc-4.0' failed with exit status 1
bash-3.2$ 

РЕДАКТИРОВАТЬ: кажется, что использование sudo здесь имеет значение.

Я попытался использовать как CC, так и CXX, как предлагает Адам, и я получаю следующую ошибку без sudo:

bash-3.2$ python setup.py build
running build
running build_py
creating build/lib.macosx-10.3-fat-2.6
creating build/lib.macosx-10.3-fat-2.6/Crypto
copying lib/Crypto/__init__.py -> build/lib.macosx-10.3-fat-2.6/Crypto
copying lib/Crypto/pct_warnings.py -> build/lib.macosx-10.3-fat-2.6/Crypto
...
warning: GMP library not found; Not building Crypto.PublicKey._fastmath.
building 'Crypto.Hash.MD2' extension
creating build/temp.macosx-10.3-fat-2.6
creating build/temp.macosx-10.3-fat-2.6/src
gcc-4.2 -fno-strict-aliasing -fno-common -dynamic -arch ppc -arch i386 -std=c99 -O3 -fomit-frame-pointer -Isrc/ -I/Library/Frameworks/Python.framework/Versions/2.6/include/python2.6 -c src/MD2.c -o build/temp.macosx-10.3-fat-2.6/src/MD2.o
/usr/libexec/gcc/powerpc-apple-darwin10/4.2.1/as: assembler (/usr/bin/../libexec/gcc/darwin/ppc/as or /usr/bin/../local/libexec/gcc/darwin/ppc/as) for architecture ppc not installed
Installed assemblers are:
/usr/bin/../libexec/gcc/darwin/x86_64/as for architecture x86_64
/usr/bin/../libexec/gcc/darwin/i386/as for architecture i386
lipo: can't open input file: /var/tmp//ccxan625.out (No such file or directory)
error: command 'gcc-4.2' failed with exit status 1

Если я использую sudo, я получаю следующую ошибку, когда он пытается использовать 4.0:

bash-3.2$ sudo python setup.py build
Password:
running build
running build_py
running build_ext
warning: GMP library not found; Not building Crypto.PublicKey._fastmath.
building 'Crypto.Hash.MD2' extension
gcc-4.0 -fno-strict-aliasing -fno-common -dynamic -arch ppc -arch i386 -std=c99 -O3 -fomit-frame-pointer -Isrc/ -I/Library/Frameworks/Python.framework/Versions/2.6/include/python2.6 -c src/MD2.c -o build/temp.macosx-10.3-fat-2.6/src/MD2.o
unable to execute gcc-4.0: No such file or directory
error: command 'gcc-4.0' failed with exit status 1
bash-3.2$ 
bash-3.2$ 

Делает ли эта дополнительная информация более очевидным, что происходит и как это исправить? Любая идея, почему вызов без sudo получает эту другую ошибку?

10.05.2011

Ответы:


1

Судя по указанному пути (/Library/Frameworks/Python.framework/Versions/2.6), вы установили только 32-разрядную версию Python 2.6, возможно, с помощью установщика python.org. Когда вы создаете пакет Python, который включает модуль расширения C, Python Distutils, включенный в этот экземпляр Python, попытается использовать ту же версию gcc и те же архитектуры ЦП, с которыми был собран Python. Очевидно, вы установили новый передовой Xcode 4, который больше не включает поддержку gcc-4.0 или ppc. Используемые вами версии Python были созданы с помощью инструментов Xcode 3, включенных в Mac OS X 10.6. Вы можете обойти это, переопределив выбор компилятора с помощью:

export CC=gcc-4.2
python setup.py build
sudo python setup.py install

РЕДАКТИРОВАТЬ:

Похоже, это не сработает для pycrypto; его сборка слишком сложна. Если вы не возражаете против использования поставляемого Apple Python 2.6 в OS X 10.6, это должно работать:

export ARCHFLAGS='-arch i386 -arch x86_64'
/usr/bin/python2.6 setup.py build

Другой вариант — установить 64-разрядную/32-разрядную программу установки Python 2.7 с сайта python.org. Он построен с помощью gcc-4.2 и предназначен только для Intel, поэтому при его использовании с Xcode 4 не должно быть никаких проблем.

ОБНОВИТЬ:

Вот точные шаги, которые я использовал с Xcode 3. Они должны работать и с установленным Xcode 4:

$ mkdir p
$ cd p
$ curl -O http://ftp.dlitz.net/pub/dlitz/crypto/pycrypto/pycrypto-2.3.tar.gz
$ tar xf pycrypto-2.3.tar.gz 
$ cd pycrypto-2.3/
$ export ARCHFLAGS='-arch i386 -arch x86_64'
$ /usr/bin/python2.6 setup.py build
running build
running build_py
creating build
creating build/lib.macosx-10.6-universal-2.6
creating build/lib.macosx-10.6-universal-2.6/Crypto
copying lib/Crypto/__init__.py -> build/lib.macosx-10.6-universal-2.6/Crypto
[...]
running build_ext
warning: GMP library not found; Not building Crypto.PublicKey._fastmath.
building 'Crypto.Hash.MD2' extension
creating build/temp.macosx-10.6-universal-2.6
creating build/temp.macosx-10.6-universal-2.6/src
gcc-4.2 -fno-strict-aliasing -fno-common -dynamic -fwrapv -Wall -Wstrict-prototypes -DENABLE_DTRACE -pipe -std=c99 -O3 -fomit-frame-pointer -arch i386 -arch x86_64 -Isrc/ -I/System/Library/Frameworks/Python.framework/Versions/2.6/include/python2.6 -c src/MD2.c -o build/temp.macosx-10.6-universal-2.6/src/MD2.o
gcc-4.2 -Wl,-F. -bundle -undefined dynamic_lookup -arch i386 -arch x86_64 build/temp.macosx-10.6-universal-2.6/src/MD2.o -o build/lib.macosx-10.6-universal-2.6/Crypto/Hash/MD2.so
[...]
building 'Crypto.Util._counter' extension
gcc-4.2 -fno-strict-aliasing -fno-common -dynamic -fwrapv -Wall -Wstrict-prototypes -DENABLE_DTRACE -pipe -std=c99 -O3 -fomit-frame-pointer -arch i386 -arch x86_64 -Isrc/ -I/System/Library/Frameworks/Python.framework/Versions/2.6/include/python2.6 -c src/_counter.c -o build/temp.macosx-10.6-universal-2.6/src/_counter.o
gcc-4.2 -Wl,-F. -bundle -undefined dynamic_lookup -arch i386 -arch x86_64 build/temp.macosx-10.6-universal-2.6/src/_counter.o -o build/lib.macosx-10.6-universal-2.6/Crypto/Util/_counter.so
$ /usr/bin/python2.6 setup.py install
running install
running build
running build_py
running build_ext
warning: GMP library not found; Not building Crypto.PublicKey._fastmath.
running install_lib
creating /Library/Python/2.6/site-packages/Crypto
[...]
byte-compiling /Library/Python/2.6/site-packages/Crypto/pct_warnings.py to pct_warnings.pyc
running install_egg_info
Writing /Library/Python/2.6/site-packages/pycrypto-2.3-py2.6.egg-info
$ /usr/bin/python2.6 setup.py test
running test
............................................................................................[...]
----------------------------------------------------------------------
Ran 902 tests in 42.612s

OK
$ cd 
$ /usr/bin/python2.6
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.
>>> from Crypto.Hash import MD5
>>> m = MD5.new()
>>> m.update('abc')
>>> m.digest()
'\x90\x01P\x98<\xd2O\xb0\xd6\x96?}(\xe1\x7fr'
>>> m.hexdigest()
'900150983cd24fb0d6963f7d28e17f72'
>>> ^D
10.05.2011
  • Если я добавлю CC=gcc-4.2, я все равно получу ошибку. См. EDIT, добавленный к вопросу выше. Любые другие идеи? Заранее спасибо. 10.05.2011
  • Да, это простое решение не сработает для pycrypto. Смотрите обновленный ответ для других вариантов. 10.05.2011
  • Решение ARCHFLAGS у меня не работает. Кроме того, мне нужно использовать python 2.6 из-за одной из библиотек, которые я хочу использовать. Я установил python с помощью образа диска установщика Mac, который можно найти здесь: python.org/download/releases /2.6.6 11.05.2011
  • Кажется, что использование CXX, а не использование sudo имеет значение. Смотрите мое последнее редактирование. Есть идеи, от чего эта другая ошибка? Спасибо! 11.05.2011
  • Марк: Я объяснил разницу sudo в своем ответе на другой ваш похожий вопрос. Как правило, из соображений безопасности процесс sudo не наследует большинство переменных среды от своего родительского процесса s. Если вы определяете CC или CXX до шагов sudo, они не будут видны в команде sudoed. Вот почему я показал вам, как обойти это, выполнив sudo bash и т. д. 11.05.2011
  • У меня работает опция ARCHFLAGS с использованием системы Python /usr/bin/python2.6. Вы правильно очищаете область сборки, когда пытаетесь это сделать? Попробуйте начать с пустого каталога и исходного архива и покажите, как именно это не удается. 11.05.2011
  • Большое спасибо. Я ввел эти команды как есть, и они отлично сработали. 05.03.2014

  • 2

    Кстати, это проблема distutils, сам Python ничего не компилирует.

    Как вы обнаружили, вы можете переопределить компилятор с помощью переменной окружения CC. Вы можете переопределить компоновщик, используемый с переменной окружения CXX. Я также хотел бы знать, почему distutils действует таким образом, но это так.

    10.05.2011
  • Distutils пытается гарантировать, что любые модули расширения C будут скомпилированы и связаны таким образом, который будет совместим с тем, как модули C в самом Python были скомпилированы и связаны. Существуют различия между платформами в отношении того, что считается необходимым. В OS X Distutils пытается обеспечить использование совместимого набора архитектур ЦП, использование одного и того же OS X ABI (MACOSX_DEPLOYMENT_TARGET) и одной и той же версии GCC (например, gcc-4.2 в OS X 10.6). не поддерживает архитектуру ppc G3, которая до сих пор поддерживается 32-битными установщиками python.org) и т. д. 10.05.2011
  • Я понимаю это, но переопределение поведения по умолчанию очень сомнительно. Обратите внимание, что здесь используются ДВЕ переменные окружения без какой-либо веской причины, которую я вижу. Я также не понимаю, почему env vars вообще используются вместо простого переключателя командной строки. (Переключатель --compiler, так сказать, только изменяет вид компилятора, то есть unix/vc/borland/etc. Он не позволяет указать команду). Документация для всего этого удручающе неполная, как я понял, когда пытался использовать mpicc в качестве компилятора. 10.05.2011
  • Никаких аргументов по поводу разочаровывающе неполной документации Distutils. Как вы, возможно, знаете, близится к завершению проект Distutils2, целью которого является замена Distutils в стандартной библиотеке Python 3.3, а также возможность установки в существующих версиях Python (2.4 -> 3.2). packages.python.org/Distutils2 — место, где можно предложить или внести улучшения в код и/ или документы. 10.05.2011
  • На самом деле, это новость для меня. Надеюсь, они разрешат распространять пакет distutils2 с исходным кодом, так как моя библиотека предназначена для работы на кластерах с пугающе старыми версиями программного обеспечения. 10.05.2011
  • Кажется, что использование CXX, а не использование sudo имеет значение. Смотрите мое последнее редактирование. Есть идеи, от чего эта другая ошибка? Спасибо! 11.05.2011
  • @Mark, разница между sudo и не-sudo в том, что sudo не улавливает изменения компилятора. Можно собрать без sudo и просто установить с sudo. Ваша проблема, не связанная с sudo, заключается в этих переключателях -arch ppc -arch i386. Он пытается скомпилировать для PPC, но у вас нет ассемблера PPC, так что это не удается. Distutils использует этот переключатель, потому что ваш Python изначально был скомпилирован с этим ключом. К сожалению, единственный известный мне способ изменить это — перекомпилировать Python. Посмотрите, будет ли переключатель --dry-run распечатывать все команды, и вы можете удалить -arch ppc и запустить их вручную. 11.05.2011
  • На самом деле, возможно, теперь комментарий Неда ARCHFLAGS может помочь. 11.05.2011

  • 3

    Сосредоточьтесь на этой ошибке:

    unable to execute gcc-4.0: No such file or directory
    error: command 'gcc-4.0' failed with exit status 1
    

    Компилятор ТОЧНО говорит вам, в чем проблема. gcc-4.0gcc-4.2) не входит в ваш PATH. ПОДСКАЗКА: which gcc-4.2, например:

    % which gcc-4.2
    /usr/bin/gcc-4.2
    

    Предполагая, что ваш находится в том же месте, я не уверен, почему /usr/bin нет в вашем PATH, но вот оно!

    Узнайте, что на самом деле представляет собой ваш PATH:

    % echo $PATH
    /opt/local/bin:/bin:/usr/bin:/sbin:/usr/sbin:/usr/bin/X11:/sw/bin:/sw/sbin
    

    Исправьте свой путь, и вы будете на пути к просветлению.

    10.05.2011
  • Проблема здесь в том, что новый Xcode 4, недавно выпущенный Apple, больше не включает ни gcc-4.0, ни устаревшую поддержку ppc. 10.05.2011
  • Это место на моем пути. У меня установлена ​​версия 4.2, но на моей машине нет gcc-4.0. Я не знаю, почему он ищет 4.0, и ни одно из решений для поиска 4.2 не сработало (например, установка переменных среды CC и CXX). 11.05.2011
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..