Как собрать DParser for Python с помощью Visual C++ 2005?

August 28th, 2007

Существует два способа собрать DParser for Python под Windows:

  1. Легкий – воспользоваться GCC из MinGW и немного пошаманить;
  2. Интересный – попытаться сделать тоже самое с помощью Visual C++ 2005.

Естественно, что я выбрал второй вариант. :-)

(На самом деле причина довольно прозаична – не хотелось собирать один проект двумя разными компиляторами).

Исходные данные:

  • Python v2.5.1. Я пробовал x86 и x64 варианты. Версия для Itanium должна работать точно так же;
  • DParser v1.15;
  • Boost.Build v2. Любая другая система сборки проектов тоже подойдёт;
  • Visual C++ 2005.

Последовательность действий:

  1. Распаковываем DParser куда-нибудь, скажем “C:\temp\D”.
  2. Применяем патч, который в добавляет недостающие (из-за отсутствующих заголовков) объявления и правит кое-где код.
    pushd C:\\temp
    patch -Np1 -d D < dparser-1.15.diff

    Кроме правки кода, патч добавляет в несколько новых файлов:

    • “Jamfile.v2″ и “Jamroot” – скрипты для сборки DParser с помошью Boost.Build v2;
    • “python\setup_win32.py” – Windows версия скрипта для сборки DParser for Python;
    • “python\setup_win32.cmd” – обёртка для setup_win32.py, нужная главным образом для внедрения манифеста в собранную .DLL.
  3. Компилируем DParser:
    cd D
    bjam free

    Для amd64:

    cd D
    bjam free architecture=x86 address-model=64

    Для Itanium:

    cd D
    bjam free architecture=ia64

    При этом собранные библиотеки будут скопированы в “C:\temp\D\dist”.

  4. Запускаем “Visual Studio 2005 Command Prompt” (либо “Visual Studio 2005 x64 Cross Tools Command Prompt”, либо “Visual Studio 2005 Itanium Cross Tools Command Prompt”) под учётной записью администратора (под любым пользователем, имеющим доступ на запись в каталог, где установлен Python).
  5. Если вы компилируете 32-х битную версию, то дополнительно следует поправить проверку на совместимость версий компилятора в “C:\Python25\Lib\distutils\msvccompiler.py”. Да этого нужно применить ещё один патч:
    pushd C:\\Python25\\Lib\\distutils
    patch msvccompiler.py msvccompiler.py.diff
    popd

    Этот шаг не обязателен, если вы собираете версию для amd64 или ia64.

  6. Cобираем и устанавливаем DParser for Python:
    cd python
    setup_win32.cmd
  7. И наконец, проверяем что у нас получилось:
    python
    import dparser
    print dparser
    DParser has been installed successfully.

Готово.

,

  1. Anonymous
    August 29th, 2007 at 00:48 | #1

    Спасибо, интересно.

  2. Alxy Sav
    November 26th, 2007 at 03:24 | #2

    Наткнулся на этот блог, прочитал несколько статей - очень интересно, спасибо.
    А можешь вообще прокомментировать
    patch msvccompiler.py msvccompiler.py.diff
    несовместимость рантаймов разных версий Visual C++. Что делать разработчикам python, там не так много Win32-специалистов, и они не могут решить чем собственно собирать python - 2005 или 2003. В любом случае у разработчиков бинарных библиотек на другом компиляторе возникают проблемы - ведь в python память может выделяться в одном модуле, а освобождаться - в другом, и тогда за это отвечают разные версии msvcrt.

    • November 26th, 2007 at 20:58 | #3

      В любом случае у разработчиков бинарных библиотек на другом компиляторе возникают проблемы - ведь в python память может выделяться в одном модуле, а освобождаться - в другом, и тогда за это отвечают разные версии msvcrt.

      “Я тебя породил, я тебя и убью!” Каждый объект должен удаляться “своим” деаллокатором. Каком образом по объекту определить кто его создал - это другой вопрос. Скорее всего это тянет за собой смену интерфейса между интерпретатором и расширениями, а это в свою очередь означает целую кучу проблем с обратной совместимостью. Скажем, можно обязать расширения использовать аллокатор/деаллокатор, предоставляемые самим python.exe. И все будет хорошо, за исключением того, что существующие расширения никуда не денуться и их по-прежнему надо будет поддерживать.

  3. heretiqu3@bk.ru
    December 8th, 2007 at 02:35 | #4

    thanks!

  1. August 28th, 2007 at 23:28 | #1