Первоначально была идея перевести страшного монстра с делфы на маленький скриптик на питоне.
Пока под виндой, в перспективе под Linux.
Собирал на WinXP SP3 x86. Последовательность действий такая:
- Поставил Stackless Python 2.7 из инсталлятора python-2.7.2-stackless.msi, distutils и pip.
- Поставил свежий MinGW mingw-get-inst-20120426.exe
- Скачал libevent-2.0.21-stable.tar.gz, распаковал, собрал и установил из под MSyS без проблем.
- Поставил зависимости: pip install pyrex
- Прописал C:\Python27\ и c:\MinGW\bin\ в PATH.
- Начал ставить concurrence: pip install concurrence
Далее следует шаманство..
6.1. Ошибка error: Unable to find vcvarsall.bat
Открыть или создать файл C:\Python27\Lib\distutils\distutils.cfg и добавить в него следущие строки:
[build]
compiler=mingw32
6.2. Ошибка: unrecognized command line option -mno-cygwin
Открыть файл C:\Python27\Lib\distutils\cygwinccompiler.py и удалить из него флаги компилятору -mno-cygwin
6.3 Ошибка: event.h: No such file or directory
Не знаю, почему он не нашел нормально установленные заголовки по адресу c:\MinGW\msys\1.0\local\include\
Скопировал их в c:\MinGW\include\
6.4 Ошибка: c:/mingw32/bin/ld.exe: cannot find -levent
Аналогично скопировал lib
6.5 Ошибка: undefined reference to `_imp___Py_NoneStruct'
Гугл сказал, что нехватает файла libpython27.a, который забыли положить в сборку.
Решение такое:
- Скачать pexports
- Найти python27.dll в System32 и выполнить pexports python27.dll > python27.def
- Выполнить dlltool --dllname python27.dll --def python27.def --output-lib libpython27.a
- Скопировать libpython27.a в c:\python27\libs\
6.6 Еще раз ошибка event.h: No such file or directory
Скопировал заголовки еще и в c:\Python27\include\
6.7 Ошибка: sys/socket.h: No such file or directory
Гугл подсказал, что для винды интерфейс сокетов другой.
Похоже что библиотека никак не адаптирована под винду, но я все-же попытался поправить исходники:
Заменил
#include <sys/socket.h>
#include <sys/un.h>
в файле concurrence\lib\concurrence\io\io_base.c на
#include <winsock.h>
Дальше посыпались ошибки...
lib/concurrence/io/concurrence.io._io.c:1261:7: предупреждение: variable «__pyx_v_stride» set but not used [-Wunused-but-set-variable]
lib/concurrence/io/concurrence.io._io.c: В функции «__pyx_f_11concurrence_2io_3_io_6Buffer___setitem__»:
lib/concurrence/io/concurrence.io._io.c:1397:7: предупреждение: variable «__pyx_v_stride» set but not used [-Wunused-but-set-variable]
c:\MinGW\bin\gcc.exe -mdll -O -Wall -Ic:\Python27\include -Ic:\Python27\include\Stackless -Ic:\Python27\PC -c lib/concurrence/io/io_base.c -o build\temp.win32-2.7\Release\lib\concurrence\io\io_base.o
lib/concurrence/io/io_base.c: В функции «sendfd»:
lib/concurrence/io/io_base.c:14:2: предупреждение: неявная декларация функции «CMSG_SPACE» [-Wimplicit-function-declaration]
lib/concurrence/io/io_base.c:15:9: ошибка: переменная «message» инициализирована, хотя имеет неполный тип
lib/concurrence/io/io_base.c:16:4: ошибка: неизвестное поле «msg_control» в инициализаторе
lib/concurrence/io/io_base.c:16:4: предупреждение: избыточные элементы в инициализаторе структуры [по умолчанию включена]
lib/concurrence/io/io_base.c:16:4: предупреждение: (где-то рядом с инициализацией для «message») [по умолчанию включена]
lib/concurrence/io/io_base.c:17:4: ошибка: неизвестное поле «msg_controllen» в инициализаторе
lib/concurrence/io/io_base.c:17:4: предупреждение: избыточные элементы в инициализаторе структуры [по умолчанию включена]
lib/concurrence/io/io_base.c:17:4: предупреждение: (где-то рядом с инициализацией для «message») [по умолчанию включена]
lib/concurrence/io/io_base.c:15:16: ошибка: размер «message» в памяти неизвестен
lib/concurrence/io/io_base.c:19:9: предупреждение: неявная декларация функции «CMSG_FIRSTHDR» [-Wimplicit-function-declaration]
lib/concurrence/io/io_base.c:20:10: ошибка: доступ по указателю на неполный тип
lib/concurrence/io/io_base.c:21:10: ошибка: доступ по указателю на неполный тип
lib/concurrence/io/io_base.c:21:24: ошибка: «SCM_RIGHTS» undeclared (first use in this function)
Разбирающиеся в си люди, подскажите как это допилить до рабочего состояния?