Компиляция PyPy на Cygwin

Я пытаюсь скомпилировать PyPy на cygwin, и компиляция останавливается, когда python пытается открыть файл "externmod", который был только что скомпилирован с помощью gcc. Проблема с gcc в cygwin заключается в том, что он автоматически добавляет ".exe" к тому, что вы компилируете, поэтому даже если gcc называется gcc -shared -Wl,--enable-auto-image-base -pthread -o /tmp/usession-release-1.8/shared_cache/externmodвыходной файл заканчивается externmod.exe несмотря на. Итак, python пытается открыть /tmp/usession-release-1.8/shared_cache/externmod и не могу найти его - таким образом компиляция останавливается. Кто-нибудь знает, как решить эту проблему, если не считать перекомпиляции gcc? Я не хочу этого делать.

3 ответа

Решение

Чтобы ответить на ваш вопрос, самый простой способ решить вашу проблему - это изменить init.py в pypy/translationator/platform так, чтобы он указывал на реальную платформу, а не на "None", который он получает прямо сейчас. В linux.py вы заметите, что есть строка `so_ext = 'so' ', которая, вероятно, решает проблему с расширением.

Обратите внимание, что, хотя небольшая хитрость притворения cygwin и linux будет работать именно в этом конкретном случае, позже будет несколько препятствий, которые помогут вам (к сожалению, ни одного, который я могу вспомнить с достаточной детализацией, чтобы предотвратить, к сожалению).

Изменить: соответствующий раздел моего init.py в настоящее время выглядит

if sys.platform == 'cygwin':
    from pypy.translator.platform.linux import Linux, Linux64
    import platform
    if platform.architecture()[0] == '32bit':
        host_factory = Linux
    else:
        host_factory = Linux64
elif sys.platform.startswith('linux'):

Мне удалось скомпилировать его после того, как мне пришлось сделать немало изменений.

  1. PyPy не предоставляет конфигурации для Cygwin. Как предложено выше, я скопировал конфигурацию Linux и изменил ее по мере необходимости. В частности, я удалил флаг -pthread, а флаг компоновщика --export-dynamic C должен быть --export-all-symbols. Здесь также указаны расширения файлов (.exe, .dll).
  2. Cygwin не реализует поля tm_gmtoff и tm_zone в структуре tm, которые являются расширением GNU для стандарта POSIX. PyPy использует эти поля для определения часового пояса. Я реализовал обходные пути. Использование этих полей ТМ пронизывает несколько файлов, которые все должны были быть изменены.
  3. В Cygwin системный вызов waitpid() ожидает другой тип аргумента для слота 2, чем тот, который использует PyPy. Я реализовал обертку, которая переназначает аргумент.
  4. Под Cygwin заголовочные файлы curses C находятся под ncurses.

Вы можете найти патч для Cygwin и инструкции по адресу http://www.tux.org/~mayer/cygwin/pypy

Windows нужно расширение ".exe", чтобы знать, что это исполняемый файл. Вам нужно будет изменить сборку, чтобы найти Windows и использовать расширение.exe.

Другие вопросы по тегам