ある検証が無駄になったついでというか。
Pillow の 3.1 以降を Windows の CPython 2.7 にインストールすること自体は pip の upgrade だけでイケたわけなのだが、やりかけた「zlib と (IJG の) libjpeg の DLL 化」、ちょっとだけ続けてた。
zlib は確か元々 DLL 前提のビルドだったかと思うんでいいんだけれど、IJG の libjpeg は static library しか作ろうとしない。Windows での static library は地獄でしかなくて、dynamic link library の方が 1.000002 倍くらいは劇的に快適。
そもそも def ファイルを作ったりという手間もあるけれど、それより win32.mk でコントロールされている複雑な CFLAGS 定義の御し方がわからず徘徊していた。なぜなら「あれれ、なんでワタシの PC からこやつは見つからないの」状態だから。
同じように困った人と思われる人が、ペロっと gist に貼り付けてくれてた。これは助かる。
2つ変えたかった。一つは「デフォルトでデバッグビルドを作ろうとしちゃう」こと。もう一つが当然「DLL」なので、例えば「-MT」では困る、「-MD」でないと。前者は libjpeg の makefile.vc にコメント入っててわかった:
1 # Read installation instructions before saying "nmake" !!
2 # To build an optimized library without debug info, say "nmake nodebug=1".
3
4 # Pull in standard variable definitions
5 !include <win32.mak>
もうひとつは 先の gistから一発で見つけた。こういうことな:
1 # Read installation instructions before saying "nmake" !!
2 # To build an optimized library without debug info, say "nmake nodebug=1".
3
4 # Pull in standard variable definitions
5 !include <win32.mak>
6
7 # You may want to adjust these compiler options:
8 #CFLAGS= $(cflags) $(cdebug) $(cvars) -I.
9 CFLAGS= $(cflags) $(cdebug) $(cvarsdll) -I.
あとは def ファイルを作らないといけないんだけど、この makedefほどの柔軟さはいらなくて「全部 exports しちゃえばええやん」としてこんな:
1 #! /bin/sh
2 echo "EXPORTS"
3 echo
4 rm .tmp_libjpeg.lib
5 lib -out:.tmp_libjpeg.lib "$@" > /dev/null
6 dumpbin -linkermember:1 .tmp_libjpeg.lib | \
7 grep -v '^$' | \
8 sed '/public symbols/,/Summary/!d' | \
9 sed -n '3,$p' | \
10 sed '$d' | \
11 sed 's@^[ ]*..... @ @' | \
12 grep -v '^ _' | sort | uniq
13 rm .tmp_libjpeg.lib
のを作っといて、makefile.vc でこう:
1 jpeg9b.dll: $(LIBOBJECTS)
2 sh makedef $(LIBOBJECTS) > jpeg9b.def
3 link -dll -out:jpeg9b.dll -def:jpeg9b.def $(LIBOBJECTS)
まぁこんなで作れたけど、これの相手をする子が当座いなくなっちゃったもんで、正しく動かせるかどうかまではわかんない。DLL の作り方、としては正しいはずで、これを c:/Python27/PCBuild/amd64 の下なんぞに(ふさわしい名前で)置いておけば、libjpeg 依存の Cython や C 拡張がすんなり行ったりする…、のかも。(無論そういう場合は大抵はヘッダファイルも必要だけど。)
この話、ほんとはすべきかどうか悩ましいハナシなのね。今こんなだから。あと nmake に限らず makefile に関係する include やマクロ(特に mc マクロ)はローカルでの検索もしずらいし、インターネットからの情報入手も簡単でなくて、毎度ツラいよ。