win32.mk を include している nmake 用 makefile が「.lib」を作っているのを、ではなく「.dll」を作りたいとして

ある検証が無駄になったついでというか。

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 にコメント入っててわかった:

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から一発で見つけた。こういうことな:

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>
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 でこう:

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 マクロ)はローカルでの検索もしずらいし、インターネットからの情報入手も簡単でなくて、毎度ツラいよ。