さまざまな環境でPythonを一貫して使用したいと思います。それらの環境の1つはcygwinです。使用したいコンポーネントの1つはgevent(http://www.gevent.org/intro.html)です。cygwinの下で、python 2.7を実行しています(ローカルでビルドされ、ビルドに必要な1行の変更がここで説明されています:http ://www.gossamer-threads.com/lists/python/python/976956 )。
geventにはlibevent(http://libevent.org/)が必要です。
libeventはcygwin(./configure && make && make install)の下でうまく構築されているようです。
ただし、gevent(pip install gevent)をビルドする場合、libeventが静的ライブラリ(/usr/local/lib/libevent.aなど)をビルドし、geventビルドが共有ライブラリを必要とするため失敗します。したがって:
gcc -shared -Wl,--enable-auto-image-base build/temp.cygwin-1.7.13-i686-2.7/gevent/core.o -L/usr/local/lib/python2.7/config -levent -lpython2.7 -o build/lib.cygwin-1.7.13-i686-2.7/gevent/core.dll
/usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../i686-pc-cygwin/bin/ld: cannot find -levent
一方、geventを静的にリンクしようとすると(CFLAGS ='-static' pip install gevent)、-leventは引き続き失敗し、型のパンニングされたポインターの間接参照が厳密なエイリアスルールといくつかの追加のldエラーをどのように破るかについての警告が多数表示されます:
gevent / core.c:21835:警告:型のパンニングされたポインターを間接参照すると、厳密なエイリアシングルールが破られます
....
gevent/core.c:21836: warning: dereferencing type-punned pointer will break strict-aliasing rules
gcc -shared -Wl,--enable-auto-image-base -static build/temp.cygwin-1.7.13-i686-2.7/gevent/core.o -L/usr/local/lib/python2.7/config -levent -lpython2.7 -o build/lib.cygwin-1.7.13-i686-2.7/gevent/core.dll
/usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../i686-pc-cygwin/bin/ld: cannot find -levent
/usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../i686-pc-cygwin/bin/ld: cannot find -lpython2.7
... それで...
libeventに.aではなく.dllをビルドするように指示する必要があると思いますが、libeventのMakefileには実際には.aターゲットがなく、これを実現するために使用されている抽象化をどのように変更する必要があるかはわかりません。
それで、一歩後退します:cygwinの下でpython 2.7の下でgeventをインストールするにはどうすればよいですか?