MinGW環境でSylpheedのtrunkをビルドしてみる

ふと思い立って、sylpheedをビルドしてみることにした。

ビルド手順についてはhttp://sylpheed.sraoss.jp/wiki/index.php?Sylpheed%2FWin32が詳しい。
いくつか現状にそぐわないところがあるのでそのへんは適宜読みかえて環境を準備。


home以下のtrunkディレクトリを用意して、ソースコードをまずはチェックアウト。
リビジョンはr2217。

configure.in:88: warning: macro `AM_PATH_GLIB_2_0' not found in library
configure.in:92: warning: macro `AM_PATH_GTK_2_0' not found in library
configure.in:112: warning: macro `AM_GLIB_GNU_GETTEXT' not found in library
configure.in:151: warning: macro `AM_PATH_GPGME' not found in library
libtoolize: putting auxiliary files in `.'.
libtoolize: copying file `./ltmain.sh'
libtoolize: Consider adding `AC_CONFIG_MACRO_DIR([m4])' to configure.in and
libtoolize: rerunning libtoolize, to keep the correct libtool macros in-tree.
libtoolize: Consider adding `-I m4' to ACLOCAL_AMFLAGS in Makefile.am.
libsylph/Makefile.am: installing `./depcomp'
configure.in: installing `./ylwrap'
configure.in:88: error: possibly undefined macro: AM_PATH_GLIB_2_0
      If this token and others are legitimate, please use m4_pattern_allow.
      See the Autoconf documentation.
configure.in:92: error: possibly undefined macro: AM_PATH_GTK_2_0
configure.in:112: error: possibly undefined macro: AM_GLIB_GNU_GETTEXT
configure.in:151: error: possibly undefined macro: AM_PATH_GPGME

何も考えずにautogen.shを実行するといろいろ怒られるので、aclocalにGTKのパスを指定してあげることにする。

aclocal -I ac -I c:/GTK/share/aclocal \
  && libtoolize --force --copy \
  && autoheader \
  && automake --add-missing --foreign --copy \
  && autoconf \
  && ./configure $@

すると以下のようにAM_PATH_GPGMEが見付からないというエラーが出ます。

configure.in:151: warning: macro `AM_PATH_GPGME' not found in library
libtoolize: putting auxiliary files in `.'.
libtoolize: copying file `./ltmain.sh'
libtoolize: Consider adding `AC_CONFIG_MACRO_DIR([m4])' to configure.in and
libtoolize: rerunning libtoolize, to keep the correct libtool macros in-tree.
libtoolize: Consider adding `-I m4' to ACLOCAL_AMFLAGS in Makefile.am.
configure.in:151: error: possibly undefined macro: AM_PATH_GPGME
      If this token and others are legitimate, please use m4_pattern_allow.
      See the Autoconf documentation.

とりあえずac/missingから*.m4をacディレクトリにコピーしてから再度autogen.shを実行してみます。

sylpheed 2.7.1

GnuPG         : no
JPilot        : no
LDAP          : no
OpenSSL       : yes
iconv         : yes
compface      : no
IPv6          : yes
GtkSpell      : no
Oniguruma     : no

The binary will be installed in /usr/local/bin

Configure finished, type 'make' to build.

Onigurumaは有効にしたいので、onig-5.9.1を--prefix=/mingwでビルドインストールする。
で、trunk/makewin32.shを実行してみる。

sylpheed 2.7.1

GnuPG         : no
JPilot        : no
LDAP          : no
OpenSSL       : yes
iconv         : yes
compface      : no
IPv6          : no
GtkSpell      : no
Oniguruma     : yes

The binary will be installed in /home/khayashi/dist/bin

Configure finished, type 'make' to build.

Onigurumaを無事検出できているのがわかります。

ではmakeしてみます。

/bin/sh ../libtool --tag=CC   --mode=link gcc -mtune=pentium3  -O3 -mms-bitfields -mwindows -I/mingw/include -version-info 0:1:0 -export-dynamic -no-undefined -export-symbols libsylph-0.def  -o libsylph-0.la -rpath /home/khayashi/dist/lib account.lo base64.lo codeconv.lo customheader.lo displayheader.lo filter.lo folder.lo html.lo imap.lo mbox.lo md5.lo md5_hmac.lo mh.lo news.lo nntp.lo pop.lo prefs.lo prefs_account.lo prefs_common.lo procheader.lo procmime.lo procmsg.lo quoted-printable.lo recv.lo session.lo smtp.lo socket.lo ssl.lo stringtable.lo sylmain.lo unmime.lo utils.lo uuencode.lo virtual.lo xml.lo syl-marshal.lo -Lc:/GTK/lib -lgobject-2.0 -lgmodule-2.0 -lglib-2.0 -lintl   -lws2_32 -lssl32 -leay32 -L/mingw/lib -lonig

*** Warning: This system can not link to static lib archive /mingw/lib/libonig.la.
*** I have the capability to make that library automatically link in when
*** you link to this library.  But I can only do this if you have a
*** shared version of the library, which you do not appear to have.
libtool: link: /mingw/bin/nm  .libs/account.o .libs/base64.o .libs/codeconv.o .libs/customheader.o .libs/displayheader.o .libs/filter.o .libs/folder.o .libs/html.o .libs/imap.o .libs/mbox.o .libs/md5.o .libs/md5_hmac.o .libs/mh.o .libs/news.o .libs/nntp.o .libs/pop.o .libs/prefs.o .libs/prefs_account.o .libs/prefs_common.o .libs/procheader.o .libs/procmime.o .libs/procmsg.o .libs/quoted-printable.o .libs/recv.o .libs/session.o .libs/smtp.o .libs/socket.o .libs/ssl.o .libs/stringtable.o .libs/sylmain.o .libs/unmime.o .libs/utils.o .libs/uuencode.o .libs/virtual.o .libs/xml.o .libs/syl-marshal.o   | sed -n -e 's/^.*[	 ]\([ABCDGIRSTW][ABCDGIRSTW]*\)[	 ][	 ]*_\([_A-Za-z][_A-Za-z0-9]*\)\{0,1\}$/\1 _\2 \2/p' | /bin/sed -e '/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //' | sort | uniq > .libs/libsylph-0.exp
libtool: link: if test "x`/bin/sed 1q .libs/libsylph-0.def`" = xEXPORTS; then cp .libs/libsylph-0.def .libs/libsylph-0-0.dll.def; else echo EXPORTS > .libs/libsylph-0-0.dll.def; cat .libs/libsylph-0.def >> .libs/libsylph-0-0.dll.def; fi
libtool: link:  gcc -mtune=pentium3 -shared .libs/libsylph-0-0.dll.def  .libs/account.o .libs/base64.o .libs/codeconv.o .libs/customheader.o .libs/displayheader.o .libs/filter.o .libs/folder.o .libs/html.o .libs/imap.o .libs/mbox.o .libs/md5.o .libs/md5_hmac.o .libs/mh.o .libs/news.o .libs/nntp.o .libs/pop.o .libs/prefs.o .libs/prefs_account.o .libs/prefs_common.o .libs/procheader.o .libs/procmime.o .libs/procmsg.o .libs/quoted-printable.o .libs/recv.o .libs/session.o .libs/smtp.o .libs/socket.o .libs/ssl.o .libs/stringtable.o .libs/sylmain.o .libs/unmime.o .libs/utils.o .libs/uuencode.o .libs/virtual.o .libs/xml.o .libs/syl-marshal.o   -Lc:/GTK/lib -lgobject-2.0 -lgmodule-2.0 -lglib-2.0 /mingw/lib/libintl.dll.a -L/mingw/lib /mingw/lib/libiconv.dll.a -lws2_32 -lssl32 -leay32  -mtune=pentium3 -mms-bitfields -mwindows   -o .libs/libsylph-0-0.dll -Wl,--enable-auto-image-base -Xlinker --out-implib -Xlinker .libs/libsylph-0.dll.a
Creating library file: .libs/libsylph-0.dll.a.libs/filter.o:filter.c:(.text+0x997): undefined reference to `reg_set_encoding'
.libs/filter.o:filter.c:(.text+0x9af): undefined reference to `regcomp'
.libs/filter.o:filter.c:(.text+0x9d8): undefined reference to `regexec'
.libs/filter.o:filter.c:(.text+0x9e2): undefined reference to `regfree

あっさりリンクエラーになっています。

というわけで、Onigurumaをスタティックでリンクしないように再ビルドします。
oni-5.9.1/Makefileを以下のように修正します。-no-undefined をつける、ということですね。

libonig_la_LDFLAGS = -no-undefined -version-info $(LTVERSION)

あとは、flexやbisonも必要です。

  • bison-2.4.1-1-msys-1.0.11-bin.tar.lzma
  • flex-2.5.35-1-msys-1.0.11-bin.tar.lzma
  • libregex-1.20090805-1-msys-1.0.11-dev.tar.lzma
  • libregex-1.20090805-1-msys-1.0.11-dll-1.tar.lzma

上記パッケージをtar --lzma -xvfとかで展開しときます。

test -f quote_fmt_lex.c || /bin/sh ../ylwrap quote_fmt_lex.l .c quote_fmt_lex.c -- /bin/sh /home/kenhys/Project/sylpheed/trunk/missing --run flex  
make[2]: *** [quote_fmt_lex.c] Error 1

bison,flexをインストールしたあと、上記エラーが出ることがありますが、makewin32.shを再実行してみてください。

これでビルドしたsylpheed.exeが起動せず。
c:/GTKからlibglib-2.0-0.dllをコピーして、元のintl.dllをlibintl-8.dllにしてしのいだ。