MinGW Cross Compile on Ubuntu > ライブラリのビルドの記録

ライブラリのビルドの記録

はじめに


目標は geocities に置いている gimp と同じ構成でビルドすること。ただし aalib と libmng それに gtk+ theme engine は除く、予定。

ライブラリは ${XLIBRARY}/lib に保存され使用されると前提しています。

ライブラリはアルファベティカルに並べていません。依存関係があるのでこの順にビルドしています。...とかいいながら、一般と gimp で分けたので依存関係がわかりにくくなってしまいました。

ビルドの記録

fftw3


dll 名はノーマルか float か long double かによって変わります。有効にできるオプションも違います。
(none)--enable-float--enable-long-double
dlllibfftw3-3.dlllibfftw3f-3.dlllibfftw3l-3.dll
--enable-sse-x-

x 記号は指定可、 - 記号は指定不可です。

ノーマルのビルド。

# FFTW Home Page
# http://fftw.org/
# fftw-3.2.2.tar.gz

# license: GPL v.2 ( or later ) or FFTW

tar -zxf fftw-3.2.2.tar.gz
cd fftw-3.2.2
mkdir target
mkdir build
cd build

${XMINGW}/cross-ppconfigure --prefix=${PWD}/../target --enable-shared --enable-threads --with-our-malloc16 --with-windows-f77-mangling --with-gcc-arch=pentium4 CFLAGS="-O2 -msse -mno-sse2 -pipe -fomit-frame-pointer -ffast-math" LDFLAGS="-s"

# bash ${XMINGW}/replibtool.sh

# リンクで _fftw_mksolver_ct_hook が見つからないと出る場合。
# test, tools が引っかかった。 dll.a にはないが a にはある。
sed -i.orig -e "s|/libfftw3.la|/.libs/libfftw3.a|" tests/Makefile
sed -i.orig -e "s|/libfftw3.la|/.libs/libfftw3.a|" tools/Makefile

${XMINGW}/cross make all > make.log 2>&1

${XMINGW}/cross make install > install.log 2>&1

cd ../target
7z a fftw-3.2.2-bin.7z -mmt -mx9 bin/*.dll
7z a fftw-3.2.2-tools.7z -mmt -mx9 bin/*.exe bin/fftw-wisdom-to-conf share/man/man1
7z a fftw-dev-3.2.2.7z -mmt -mx9 include lib/*.a lib/pkgconfig share/info

続けてビルドするなら target と build の中身を掃除する。

rm * -r
cd ../build
rm * -r

float 版のビルド。

# CFLAGS と --enable-float --enable-sse --disable-sse2 が異なる。
${XMINGW}/cross-ppconfigure --prefix=${PWD}/../target --enable-shared --enable-threads --with-our-malloc16 --with-windows-f77-mangling --with-gcc-arch=pentium4 CFLAGS="-O2 -pipe -fomit-frame-pointer -ffast-math" LDFLAGS="-s" --enable-float --enable-sse --disable-sse2

# リンクで _fftw_mksolver_ct_hook が見つからないと出る場合。
# test, tools が引っかかった。 dll.a にはないが a にはある。
# libfftw3f.a になることに注意。
sed -i.orig -e "s|/libfftw3f.la|/.libs/libfftw3f.a|" tests/Makefile
sed -i.orig -e "s|/libfftw3f.la|/.libs/libfftw3f.a|" tools/Makefile

${XMINGW}/cross make all > make.log 2>&1

${XMINGW}/cross make install > install.log 2>&1

cd ../target
7z a fftw3f-3.2.2-bin.7z -mmt -mx9 bin/*.dll
7z a fftw3f-3.2.2-tools.7z -mmt -mx9 bin/*.exe bin/fftw-wisdom-to-conf share/man/man1
7z a fftw3f-dev-3.2.2.7z -mmt -mx9 include lib/*.a lib/pkgconfig share/info

long double は float の応用なので省略します。 configure に --enable-sse が使えないので、ノーマル版に --enable-long-double を追加した形になります。

zlib


configure で作業するのは面倒なので win32/Makefile.gcc を使います。 SHARED_MODE=1 で dll が作られます。 SHARED_MODE=0 で static になります。設定を省略すると static でビルドされます。

libzdll.a は mingw の命名規則から考えると libz.dll.a に変更しておくほうが無難です。 libzdll.a のままでは libtool が shared でリンクしてくれないかもしれない。ただし事情を考慮して回避策を入れている場合にリンクできなくなるかもしれないので、 libz.dll.a のシンボリックリンクを作成してごまかすのがよさそうです。

# zlib Home Site
# http://www.zlib.net/
# zlib-1.2.5.tar.bz2

# license: zlib

tar -jxf zlib-1.2.5.tar.bz2
cd zlib-1.2.5

${XMINGW}/cross make -f win32/Makefile.gcc CFLAGS="-O2 -mtune=pentium4 -msse -mno-sse2 -fomit-frame-pointer -pipe -ffast-math" LDFLAGS="-s"

mkdir target
mkdir target/bin
${XMINGW}/cross make -f win32/Makefile.gcc install SHARED_MODE=1 BINARY_PATH=target/bin INCLUDE_PATH=target/include LIBRARY_PATH=target/lib

cd target
7z a zlib-1.2.5-bin.7z bin
7z a zlib-dev-1.2.5.7z include lib

libpng


使うバージョンの pc ファイルを lib/pkgconfig/libpng.pc にシンボリックリンクしてください。クロス コンパイルのためのライブラリの pkgconfig に libpng.pc が存在せず、他のライブラリが *.pc ファイルの Requires.private に libpng を指定していた場合に pkg-config は規定のディレクトリーを検索し、ネイティブの libpng.pc を参照してしまいます。

同様に bin/libpng-config も作成します。

libpng*-config ファイルは中身を書き換えます。 prefix を ${XLIBRARY}/lib にあわせてください。

1.2.44 の例。 CFLAGS は makefile.mingw の設定例を参考に設定しています。

# PNG reference library: libpng | Download PNG reference library: libpng software for free at SourceForge.net
# http://sourceforge.net/projects/libpng/
# libpng-1.2.44.tar.bz2
# libpng-1.4.3.tar.bz2

# license: libpng

tar -jxf libpng-1.2.44.tar.bz2
cd libpng-1.2.44

# ディレクトリーを掘ってビルドする場合の問題に対処する。
sed -i.orig -e 's!cat \(scripts/libpng.pc.in \)!cat $(SRCDIR)/\1!'  scripts/makefile.mingw

mkdir target
mkdir build
cd build

${XMINGW}/cross windres ../scripts/pngw32.rc pngw32.rc.o

${XMINGW}/cross make -f ../scripts/makefile.mingw SRCDIR="${PWD}/.." DESTDIR="${PWD}/../target" prefix="${XLIBRARY}/lib" SHAREDLIB="libpng12-0.dll" CFLAGS="-O2 -mtune=pentium4 -msse -mno-sse2 -funroll-loops -fomit-frame-pointer -pipe -ffast-math -I${XLIBRARY}/lib/include -DPNG_DEBUG=5" MINGW_LDFLAGS="-L${XLIBRARY}/lib/lib -Wl,${PWD}/pngw32.rc.o -Wl,-s" install > make.log 2>&1

cd ../target.

# libpng.pc の内容を書き換える。
sed -i.orig -e "s%^\(prefix=\).*\$%\\1${XLIBRARY}/lib%" -e 's%^\(exec_prefix=\)\.$%\1${prefix}%' -e 's%^\(libdir=\)\./%\1${exec_prefix}/%' -e 's%^\(includedir=\)\./%\1${prefix}/%' lib/pkgconfig/libpng.pc

# libpng-config の内容を書き換える。
sed -i.orig -e "s%^\(prefix=\)\".*\"\$%\\1\"${XLIBRARY}/lib\"%" -e 's%^\(I_opts="-I\)\./\(.*\)$%\1${prefix}/\2%' -e 's%^\(L_opts="-L\)\./\(.*\)$%\1${prefix}/\2%' bin/libpng-config

7z a libpng-1.2.44-bin.7z bin/*.dll
7z a libpng-dev-1.2.44.7z bin/libpng12-config include/libpng12 lib/libpng12.* lib/pkgconfig/libpng12.pc

makefile.mingw に不備があって build ディレクトリーを掘ってビルドすると lib/pkgconfig/libpng12.pc が空になる。当該箇所を修正するか libpng.pc.in をコピーして書き換える。以下、 libpng12.pc の内容。参考まで。
 prefix=/usr/xmingw/xmingw32/local/libs/lib
 exec_prefix=$(prefix)
 libdir=${exec_prefix}/lib
 includedir=${exec_prefix}/include/libpng12
 
 Name: libpng
 Description: Loads and saves PNG files
 Version: 1.2.44
 Libs: -L${libdir} -lpng12
 Cflags: -I${includedir}

1.4.3 ではこのように。 1.2.44 とは scripts/pngwin.rc が異なります。 SHAREDLIB は libpng14-0.dll でいいのかな... gimp 2.6.10 (simoncic) では libpng14-12.dll になっている。 gtk+ bundle にあわせて libpng14-14.dll にしました。

tar -jxf libpng-1.4.3.tar.bz2
cd libpng-1.4.3

# ディレクトリーを掘ってビルドする場合の問題に対処する。
sed -i.orig -e 's!cat \(scripts/libpng.pc.in \)!cat $(SRCDIR)/\1!'  scripts/makefile.mingw

mkdir target
mkdir build
cd build

${XMINGW}/cross windres ../scripts/pngwin.rc pngwin.rc.o

${XMINGW}/cross make -f ../scripts/makefile.mingw SRCDIR="${PWD}/.." DESTDIR="${PWD}/../target" prefix="." SHAREDLIB="libpng14-14.dll" CFLAGS="-O2 -mtune=pentium4 -msse -mno-sse2 -funroll-loops -fomit-frame-pointer -pipe -ffast-math -I${XLIBRARY}/lib/include -DPNG_DEBUG=5" MINGW_LDFLAGS="-L${XLIBRARY}/lib/lib -Wl,${PWD}/pngwin.rc.o -Wl,-s" install > make.log 2>&1

cd ../target.

# libpng.pc の内容を書き換える。
sed -i.orig -e "s%^\(prefix=\).*\$%\\1${XLIBRARY}/lib%" -e 's%^\(exec_prefix=\)\.$%\1${prefix}%' -e 's%^\(libdir=\)\./%\1${exec_prefix}/%' -e 's%^\(includedir=\)\./%\1${prefix}/%' lib/pkgconfig/libpng.pc

# libpng-config の内容を書き換える。
sed -i.orig -e "s%^\(prefix=\)\".*\"\$%\\1\"${XLIBRARY}/lib\"%" -e 's%^\(I_opts="-I\)\./\(.*\)$%\1${prefix}/\2%' -e 's%^\(L_opts="-L\)\./\(.*\)$%\1${prefix}/\2%' bin/libpng-config

7z a libpng-1.4.3-bin.7z bin/*.dll
7z a libpng-dev-1.4.3.7z bin/libpng14-config include/libpng14 lib/libpng14.* lib/pkgconfig/libpng14.pc

libjpeg


libjpeg-7-2 のビルド。 dll のファイル名は libjpeg-7.dll になります。

# Ring Server Project
# http://www.ring.gr.jp/archives/linux/debian/debian/pool/main/libj/libjpeg7/
# libjpeg7_7.orig.tar.gz
# libjpeg7_7-2.diff.gz

tar -zxf libjpeg7_7.orig.tar.gz
cd jpeg-7
zcat ../libjpeg7_7-2.diff.gz | patch
mkdir target
mkdir build
cd build

${XMINGW}/cross-ppconfigure --prefix=${PWD}/../target
${XMINGW}/cross make CFLAGS="-O2 -mtune=pentium4 -msse -mno-sse2 -pipe -fomit-frame-pointer -ffast-math" LDFLAGS="-s" install >make.log 2>&1

cd ../target
7z a libjpeg-7-2-bin.7z bin/*.dll 
7z a libjpeg-7-2-tools.7z bin/*.exe share/man/man1
7z a libjpeg-dev-7-2.7z include lib/*.a


libjpeg-8b のビルド。 dll のファイル名は libjpeg-8.dll になります。

# Independent JPEG Group
# http://www.ijg.org/
# jpegsrc.v8b.tar.gz

# license: libjpeg

tar -zxf jpegsrc.v8b.tar.gz
cd jpeg-8b
mkdir target
mkdir build
cd build

${XMINGW}/cross-ppconfigure --prefix=${PWD}/../target
${XMINGW}/cross make CFLAGS="-O2 -mtune=pentium4 -msse -mno-sse2 -pipe -fomit-frame-pointer -ffast-math" LDFLAGS="-s" install >make.log 2>&1

cd ../target
7z a libjpeg-8b-bin.7z bin/*.dll 
7z a libjpeg-8b-tools.7z bin/*.exe share/man/man1
7z a libjpeg-dev-8b.7z include lib/*.a

libtiff


# LibTIFF - TIFF Library and Utilities
# http://www.remotesensing.org/libtiff/
# tiff-3.9.4.tar.gz

# license: libtiff

# opt: libjpeg, zlib

tar -zxf tiff-3.9.4.tar.gz
cd tiff-3.9.4
mkdir target
mkdir build_
cd build_

# --disable-rpath しても一部(?)で libtool に -rpath を渡している...
${XMINGW}/cross-ppconfigure --prefix=${PWD}/../target --enable-shared --disable-rpath --without-x --with-zlib-include-dir=${XLOCAL}/libs/lib/include --with-zlib-lib-dir=${XLOCAL}/libs/lib/lib --with-jpeg-include-dir==${XLOCAL}/libs/lib/include --with-jpeg-lib-dir=${XLOCAL}/libs/lib/lib

bash ${XMINGW}/replibtool.sh

${XMINGW}/cross make CFLAGS="-O2 -mtune=pentium4 -msse -mno-sse2 -pipe -fomit-frame-pointer -ffast-math" CXXFLAGS="-O2 -mtune=pentium4 -msse -mno-sse2 -pipe -fomit-frame-pointer -ffast-math" LDFLAGS="-L${XLOCAL}/libs/lib/lib -s" LIBS="-ljpeg -lzdll" install >make.log 2>&1

cd ../target

7z a tiff-3.9.4-bin.7z bin/*.dll 
7z a tiff-3.9.4-tools.7z bin/*.exe share/man/man1
7z a tiff-dev-3.9.4.7z include lib/*.a share/man/man3 share/doc

configure の結果。
 Libtiff is now configured for i386-pc-mingw32
 
   Installation directory:             /usr/xmingw/xmingw32/local/src/libs/pic/tiff-3.9.4/build_/../target
   Documentation directory:            ${prefix}/share/doc/tiff-3.9.4
   C compiler:                         /usr/bin/i586-mingw32msvc-cc  -std=gnu99 -g -O2 -Wall -W
   C++ compiler:                       /usr/bin/i586-mingw32msvc-g++  -g -O2
   Enable runtime linker paths:        no
   Support Microsoft Document Imaging: yes
 
  Support for internal codecs:
   CCITT Group 3 & 4 algorithms:       yes
   Macintosh PackBits algorithm:       yes
   LZW algorithm:                      yes
   ThunderScan 4-bit RLE algorithm:    yes
   NeXT 2-bit RLE algorithm:           yes
   LogLuv high dynamic range encoding: yes
 
  Support for external codecs:
   ZLIB support:                       yes
   Pixar log-format algorithm:         yes
   JPEG support:                       yes
   Old JPEG support:                   yes
   ISO JBIG support:                   no
 
   C++ support:                        yes
 
   OpenGL support:                     no

bzip2


static と shared で Makefile を使い分けます。 Makefile はそれぞれ用意されています。ここで扱う Makefile は debian パッチを当てているのでオリジナルとは少し異なります。

static は Makefile 、 shared は Makefile-libbz2_so でビルドします。 shared は dll のみ作成します。コマンドの作成やインストール ターゲットは static の Makefile に記述されています。つぎに述べる手順は shared をビルドしたのち static をビルドしています。パッチを含むため長くなっています。

# bzip2 : Home
# http://www.bzip.org/
# bzip2-1.0.5.tar.gz

# license: bzip2

# Ring Server Project
# http://www.ring.gr.jp/archives/linux/debian/debian/pool/main/b/bzip2/
# bzip2_1.0.5-4.diff.gz

tar -zxf bzip2-1.0.5.tar.gz
cd bzip2-1.0.5
zcat ../bzip2_1.0.5-4.diff.gz | patch -p 1

# bzip2.c の sys\stat.h を sys/stat.h に置き換える。
sed -i.orig -e 's!sys\\stat!sys/stat!' bzip2.c

# bzlib.h の WINAPI を DECLSPEC_EXPORT に置き換える。
sed -i.orig -e 's/WINAPI/DECLSPEC_EXPORT/' bzlib.h

# mingw のために Makefile, Makefile-libbz2_so を書き換えます。以下、パッチです。

patch -p 1 << \EOF
--- bzip2-1.0.5.orig/Makefile
+++ bzip2-1.0.5/Makefile
@@ -37,13 +37,15 @@
       decompress.o \
       bzlib.o
 
-all: libbz2.a bzip2 bzip2recover # test
+EXEEXT=.exe
 
-bzip2: libbz2.so bzip2.o
-	$(CC) $(CFLAGS) $(LDFLAGS) -o bzip2 bzip2.o -L. -lbz2
+all: libbz2.a bzip2$(EXEEXT) bzip2recover$(EXEEXT) # test
 
-bzip2recover: bzip2recover.o
-	$(CC) $(CFLAGS) $(LDFLAGS) -o bzip2recover bzip2recover.o
+bzip2$(EXEEXT): libbz2.a bzip2.o
+	$(CC) $(CFLAGS) $(LDFLAGS) -o bzip2$(EXEEXT) bzip2.o -L. -lbz2
+
+bzip2recover$(EXEEXT): bzip2recover.o
+	$(CC) $(CFLAGS) $(LDFLAGS) -o bzip2recover$(EXEEXT) bzip2recover.o
 
 libbz2.a: $(OBJS)
 	rm -f libbz2.a
@@ -71,7 +73,7 @@
 	$(CC) $(CFLAGS) -D_REENTRANT -o $@ -c $<
 
 check: test
-test: bzip2
+test: bzip2$(EXEEXT)
 	@cat words1
 	LD_LIBRARY_PATH=.:$$LD_LIBRARY_PATH \
 	./bzip2 -1  < sample1.ref > sample1.rb2
@@ -93,20 +95,20 @@
 	cmp sample3.tst sample3.ref
 	@cat words3
 
-install: bzip2 bzip2recover libbz2.a
+install: bzip2$(EXEEXT) bzip2recover$(EXEEXT) libbz2.a
 	if ( test ! -d $(PREFIX)/bin ) ; then mkdir -p $(PREFIX)/bin ; fi
 	if ( test ! -d $(PREFIX)/lib ) ; then mkdir -p $(PREFIX)/lib ; fi
 	if ( test ! -d $(PREFIX)/man ) ; then mkdir -p $(PREFIX)/man ; fi
 	if ( test ! -d $(PREFIX)/man/man1 ) ; then mkdir -p $(PREFIX)/man/man1 ; fi
 	if ( test ! -d $(PREFIX)/include ) ; then mkdir -p $(PREFIX)/include ; fi
-	cp -f bzip2 $(PREFIX)/bin/bzip2
-	ln $(PREFIX)/bin/bzip2 $(PREFIX)/bin/bunzip2
-	ln $(PREFIX)/bin/bzip2 $(PREFIX)/bin/bzcat
-	cp -f bzip2recover $(PREFIX)/bin/bzip2recover
-	chmod a+x $(PREFIX)/bin/bzip2
-	chmod a+x $(PREFIX)/bin/bunzip2
-	chmod a+x $(PREFIX)/bin/bzcat
-	chmod a+x $(PREFIX)/bin/bzip2recover
+	cp -f bzip2$(EXEEXT) $(PREFIX)/bin/bzip2$(EXEEXT)
+	ln $(PREFIX)/bin/bzip2$(EXEEXT) $(PREFIX)/bin/bunzip2$(EXEEXT)
+	ln $(PREFIX)/bin/bzip2$(EXEEXT) $(PREFIX)/bin/bzcat$(EXEEXT)
+	cp -f bzip2recover$(EXEEXT) $(PREFIX)/bin/bzip2recover$(EXEEXT)
+	chmod a+x $(PREFIX)/bin/bzip2$(EXEEXT)
+	chmod a+x $(PREFIX)/bin/bunzip2$(EXEEXT)
+	chmod a+x $(PREFIX)/bin/bzcat$(EXEEXT)
+	chmod a+x $(PREFIX)/bin/bzip2recover$(EXEEXT)
 	cp -f bzip2.1 $(PREFIX)/man/man1
 	chmod a+r $(PREFIX)/man/man1/bzip2.1
 	cp -f bzlib.h $(PREFIX)/include
@@ -136,7 +138,7 @@
 	echo ".so man1/bzdiff.1" > $(PREFIX)/man/man1/bzcmp.1
 
 clean: 
-	rm -f *.o *.sho libbz2.a libbz2.so* bzip2 bzip2recover \
+	rm -f *.o *.sho libbz2.a libbz2.so* bzip2$(EXEEXT) bzip2recover$(EXEEXT) \
 	sample1.rb2 sample2.rb2 sample3.rb2 \
 	sample1.tst sample2.tst sample3.tst
 
EOF

patch -p 1 << \EOF
--- bzip2-1.0.5.orig/Makefile-libbz2_so
+++ bzip2-1.0.5/Makefile-libbz2_so
@@ -35,8 +35,8 @@
       bzlib.o
 
 all: $(OBJS)
-	$(CC) -shared -Wl,-soname -Wl,libbz2.so.1.0 -o libbz2.so.1.0.4 $(OBJS)
-	$(CC) $(CFLAGS) -o bzip2-shared bzip2.c libbz2.so.1.0.4
+	$(CC) -shared -Wl,--out-implib -Wl,libbz2.dll.a -o bz2-1.dll $(OBJS)
+	$(CC) $(CFLAGS) -o bzip2-shared.exe bzip2.c libbz2.dll.a
 	rm -f libbz2.so.1.0
 	ln -s libbz2.so.1.0.4 libbz2.so.1.0
 
EOF

# shared のビルド。
${XMINGW}/cross make -f Makefile-libbz2_so CFLAGS="-O2 -mtune=pentium4 -msse -mno-sse2 -pipe -fomit-frame-pointer -ffast-math -D_FILE_OFFSET_BITS=64" LDFALGS="-Wl,-s" > make.dll.log 2>&1

# 続けて static をビルドするため *.o を削除する。
rm *.o

# static のビルド。
${XMINGW}/cross make CFLAGS="-O2 -mtune=pentium4 -msse -mno-sse2 -pipe -fomit-frame-pointer -ffast-math -D_FILE_OFFSET_BITS=64" LDFALGS="-Wl,-s" > make.log 2>&1

mkdir target
${XMINGW}/cross make install PREFIX=${PWD}/target > install.log 2>&1
cp bz2-1.dll target/bin/.
cp libbz2.dll.a target/lib/.

cd target
7z a bzip2-1.0.5-bin.7z bin/*.dll
7z a bzip2-1.0.5-tools.7z bin/*.exe bin/bz{cmp,diff,egrep,exe,fgrep,grep,less,more} man
7z a bzip2-dev-1.0.5.7z include lib/*.a
1.0.6 without debian patch

debain patch を適用していない 1.0.6 のパッチ。

# Makefile, Makefile-libbz2_so を書き換える。以下、パッチです。
patch -p 1 << \EOF
--- bzip2-1.0.6.orig/Makefile
+++ bzip2-1.0.6/Makefile
@@ -26,6 +26,8 @@
 # Where you want it installed when you do 'make install'
 PREFIX=/usr/local
 
+EXEEXT=.exe
+
 
 OBJS= blocksort.o  \
       huffman.o    \
@@ -35,13 +37,13 @@
       decompress.o \
       bzlib.o
 
-all: libbz2.a bzip2 bzip2recover test
+all: libbz2.a bzip2$(EXEEXT) bzip2recover$(EXEEXT) # test
 
-bzip2: libbz2.a bzip2.o
-	$(CC) $(CFLAGS) $(LDFLAGS) -o bzip2 bzip2.o -L. -lbz2
+bzip2$(EXEEXT): libbz2.a bzip2.o
+	$(CC) $(CFLAGS) $(LDFLAGS) -o bzip2$(EXEEXT) bzip2.o -L. -lbz2
 
-bzip2recover: bzip2recover.o
-	$(CC) $(CFLAGS) $(LDFLAGS) -o bzip2recover bzip2recover.o
+bzip2recover$(EXEEXT): bzip2recover.o
+	$(CC) $(CFLAGS) $(LDFLAGS) -o bzip2recover$(EXEEXT) bzip2recover.o
 
 libbz2.a: $(OBJS)
 	rm -f libbz2.a
@@ -53,7 +55,7 @@
 	fi
 
 check: test
-test: bzip2
+test: bzip2$(EXEEXT)
 	@cat words1
 	./bzip2 -1  < sample1.ref > sample1.rb2
 	./bzip2 -2  < sample2.ref > sample2.rb2
@@ -69,20 +71,21 @@
 	cmp sample3.tst sample3.ref
 	@cat words3
 
-install: bzip2 bzip2recover
+install: bzip2$(EXEEXT) bzip2recover$(EXEEXT) libbz2.a
 	if ( test ! -d $(PREFIX)/bin ) ; then mkdir -p $(PREFIX)/bin ; fi
 	if ( test ! -d $(PREFIX)/lib ) ; then mkdir -p $(PREFIX)/lib ; fi
 	if ( test ! -d $(PREFIX)/man ) ; then mkdir -p $(PREFIX)/man ; fi
 	if ( test ! -d $(PREFIX)/man/man1 ) ; then mkdir -p $(PREFIX)/man/man1 ; fi
 	if ( test ! -d $(PREFIX)/include ) ; then mkdir -p $(PREFIX)/include ; fi
-	cp -f bzip2 $(PREFIX)/bin/bzip2
-	cp -f bzip2 $(PREFIX)/bin/bunzip2
-	cp -f bzip2 $(PREFIX)/bin/bzcat
-	cp -f bzip2recover $(PREFIX)/bin/bzip2recover
-	chmod a+x $(PREFIX)/bin/bzip2
-	chmod a+x $(PREFIX)/bin/bunzip2
-	chmod a+x $(PREFIX)/bin/bzcat
-	chmod a+x $(PREFIX)/bin/bzip2recover
+
+	cp -f bzip2$(EXEEXT) $(PREFIX)/bin/bzip2$(EXEEXT)
+	ln $(PREFIX)/bin/bzip2$(EXEEXT) $(PREFIX)/bin/bunzip2$(EXEEXT)
+	ln $(PREFIX)/bin/bzip2$(EXEEXT) $(PREFIX)/bin/bzcat$(EXEEXT)
+	cp -f bzip2recover$(EXEEXT) $(PREFIX)/bin/bzip2recover$(EXEEXT)
+	chmod a+x $(PREFIX)/bin/bzip2$(EXEEXT)
+	chmod a+x $(PREFIX)/bin/bunzip2$(EXEEXT)
+	chmod a+x $(PREFIX)/bin/bzcat$(EXEEXT)
+	chmod a+x $(PREFIX)/bin/bzip2recover$(EXEEXT)
 	cp -f bzip2.1 $(PREFIX)/man/man1
 	chmod a+r $(PREFIX)/man/man1/bzip2.1
 	cp -f bzlib.h $(PREFIX)/include
@@ -109,7 +112,7 @@
 	echo ".so man1/bzdiff.1" > $(PREFIX)/man/man1/bzcmp.1
 
 clean: 
-	rm -f *.o libbz2.a bzip2 bzip2recover \
+	rm -f *.o *.sho libbz2.a libbz2.so* bzip2$(EXEEXT) bzip2recover$(EXEEXT) \
 	sample1.rb2 sample2.rb2 sample3.rb2 \
 	sample1.tst sample2.tst sample3.tst
 
--- bzip2-1.0.6.orig/Makefile-libbz2_so
+++ bzip2-1.0.6/Makefile-libbz2_so
@@ -35,8 +35,8 @@
       bzlib.o
 
 all: $(OBJS)
-	$(CC) -shared -Wl,-soname -Wl,libbz2.so.1.0 -o libbz2.so.1.0.6 $(OBJS)
-	$(CC) $(CFLAGS) -o bzip2-shared bzip2.c libbz2.so.1.0.6
+	$(CC) -shared -Wl,--out-implib -Wl,libbz2.dll.a -o bz2-1.dll $(OBJS)
+	$(CC) $(CFLAGS) -o bzip2-shared.exe bzip2.c libbz2.dll.a
 	rm -f libbz2.so.1.0
 	ln -s libbz2.so.1.0.6 libbz2.so.1.0
 
EOF

libiconv, libcharset


素直にビルドすると dll 名は libcharset-1.dll, libiconv-2.dll になります。しかし gimp 2.6.10 の windows binary では iconv.dll になっており、互換性がありません。ここでは後者に合わせるためパッチをあてています。具体的には libtool の soname_spec を置き換えています。生成されたばかりの libtool の soname_spec は次のようになっています。
 soname_spec="\${libname}\`echo \${release} | \$SED -e s/[.]/-/g\`\${versuffix}\${shared_ext}"

次のように置き換えています。
 soname_spec="\`echo \${libname} | \$SED -e s/^lib//\`\${shared_ext}"

# libiconv - GNU Project - Free Software Foundation (FSF)
# http://www.gnu.org/software/libiconv/
# libiconv-1.13.1.tar.gz

# license: GPL v3, LGPL v2 ( lib )

tar -zxf libiconv-1.13.1.tar.gz
cd libiconv-1.13.1
mkdir target
mkdir build
cd build

${XMINGW}/cross-ppconfigure --prefix=${PWD}/../target --enable-extra-encodings --with-libintl-prefix=${XLIBRARY}/libs

# dll 名を iconv.dll, charset.dll にするために libtool を書き換える。
sed -i.orig -e 's#^soname_spec=.*#soname_spec="\\\`echo \\\${libname} | \\\$SED -e s/^lib//\\\`\\\${shared_ext}"#' libtool libcharset/libtool

${XMINGW}/cross make CFLAGS="-O2 -mtune=pentium4 -msse -mno-sse2 -pipe -fomit-frame-pointer -ffast-math" > make.log 2>&1

${XMINGW}/cross make install > install.log 2>&1

cd ../target
7z a libiconv-1.13.1-bin.7z bin/*.dll lib/charset.alias
7z a libiconv-1.13.1-tools.7z bin/*.exe share/man/man1
7z a libiconv-dev-1.13.1.7z include lib/*.a share/doc share/man/man3

libxml2


# The XML C parser and toolkit of Gnome
# http://xmlsoft.org/
# libxml2-2.7.7.tar.gz

# license: libxml2

# opt: iconv, pthread, zlib

tar -zxf libxml2-2.7.7.tar.gz
cd libxml2-2.7.7
mkdir target
mkdir build
cd build

${XMINGW}/cross-ppconfigure --prefix=${PWD}/../target --enable-shared --disable-static --without-python --without-pthread CFLAGS="-O2 -mtune=pentium4 -msse -mno-sse2 -pipe -fomit-frame-pointer -ffast-math `${XMINGW}/cross --cflags`" LDFLAGS="`${XMINGW}/cross --ldflags` -s"

# zlib の gzopen64 をリンクしようとして失敗している。 shared にはない。 static には存在する。
# gtk+-bundle の zlib.h ( zlib 1.2.4 ) が腐っている模様。 1.2.5 では問題ない。

# config.h の HAVE_LIBPTHREAD, HAVE_PTHREAD_H を寝かせる。 pthread は使わない。
sed -i.orig -e 's!^\(#define HAVE_\(LIB\|\)PTHREAD\(_H\|\)\) /\*\*/!/* \1 */!'

# Makefile を書き換える。 testThreads をはずして testThreadsWin32 に変える。
#  testThreads_SOURCES と am_testThreads_OBJECTS の変更。
sed -i.orig -e 's!\(\(testThreads_SOURCES\|am_testThreads_OBJECTS\)\s\+=\s\+testThreads\)\.!\1Win32.!' Makefile

${XMINGW}/cross make > make.log 2>&1

${XMINGW}/cross-make install > install.log 2>&1

cd ../target
sed -i.orig -e 's/-lpthread//' lib/pkgconfig/libxml-2.0.pc

7z a libxml2-2.7.7-bin.7z bin/*.dll
7z a libxml2-2.7.7-tools.7z bin/*.exe share/man/man1/xml{catalog,lint}.1
7z a libxml2-dev-2.7.7.7z bin/*-config include lib/*.a lib/xml2Conf.sh lib/pkgconfig share/man/man1/xml2-config.1 share/man/man3 share/{aclocal,doc,gtk-doc}

gettext, libintl


dll 名は次のようになります。
  • libasprintf-0.dll
  • libgettextlib-0-18-1.dll
  • libgettextpo-0.dll
  • libgettextsrc-0-18-1.dll
  • libintl-8.dll

gettext 0.18.1.1 は moopp の問題で c++ から c 関数をリンクできません。パッチを当てます。パッチをあてたあと念のため chmod u+x しています。

# http://ftp.gnu.org/pub/gnu/gettext/
# gettext-0.18.1.1.tar.gz

# license: GPL v3

# opt: glib2, libacl, libcroco, libiconv, libxml2, 

tar -zxf gettext-0.18.1.1.tar.gz 
cd gettext-0.18.1.1

patch -p 1 << \EOF
--- gettext-0.18.1.1.orig/build-aux/moopp
+++ gettext-0.18.1.1/build-aux/moopp
@@ -516,7 +516,13 @@
     echo "#endif"
     echo
     echo "/* Functions that invoke the methods.  */"
+    echo "#ifdef __cplusplus"
+    echo "extern \"C\" {"
+    echo "#endif"
     echo "$all_methods" | sed -e "$sed_remove_empty_lines" -e 's/\([^A-Za-z_0-9]\)\([A-Za-z_0-9][A-Za-z_0-9]*\)[ 	]*([^,)]*/\1'"${main_classname}_"'\2 ('"${main_classname}_t first_arg"'/' -e 's,^,extern ,' -e 's,$,;,'
+    echo "#ifdef __cplusplus"
+    echo "}"
+    echo "#endif"
     echo
     # Now come the implementation details.
     echo "/* Type representing an implementation of ${main_classname}_t.  */"
EOF

chmod u+x build-aux/moopp

mkdir target
mkdir build
cd build

XLIBRARY_SET=${XLIBRARY}/gimp_build_set

${XMINGW}/cross-ppconfigure --prefix=${PWD}/../target --enable-shared --disable-static --disable-java --disable-native-java --enable-threads=win32 --disable-rpath --enable-relocatable --disable-openmp --disable-largefile CFLAGS="`${XMINGW}/cross --cflags`" LDFLAGS="`${XMINGW}/cross --ldflags` -s"

# GNULIB_MEMCHR=1 では rpl_memchr にリンクしようとするが、存在しない関数。
# GNULIB_MEMCHR=0 にする。

CFLAGS="-O2 -mtune=pentium4 -msse -mno-sse2 -pipe -fomit-frame-pointer -ffast-math `${XMINGW}/cross --cflags`" && ${XMINGW}/cross make CFLAGS="${CFLAGS}" CXXFLAGS="${CFLAGS}" GNULIB_MEMCHR=0 > make.log 2>&1

${XMINGW}/cross make install > install.log 2>&1

cd ../target
7z a gettext-0.18.1.1-bin.7z bin/*.dll
7z a gettext-0.18.1.1-tools.7z bin/*.exe bin/{autopoint,gettext.sh,gettextize} lib/gettext share/locale share/man/man1
7z a gettext-dev-0.18.1.1.7z include lib/*.a share/{aclocal,doc,gettext,info} share/man/man3

Gimp のビルドの記録

openjpeg


dll 名は MinGW の流儀にあわせて libopenjpeg-2.dll にしました。エクスポートした関数名も MinGW にあわせています。そのため公式の *-win32.zip とは互換性がありません。公式との表面的な互換性を求めるなら、 SHAREDLIB を $(TARGET).$(SHREXT) に、 OPJ_CALLCONV を __stdcall に設定しなおしてください。

# OpenJPEG library : an open source JPEG 2000 codec
# http://www.openjpeg.org/
# openjpeg_v1_3.tar.gz

# license: openjpeg

tar -zxf openjpeg_v1_3.tar.gz
cd OpenJPEG_v1_3

patch -p1 << \EOF
--- OpenJPEG_v1_3.orig/libopenjpeg/openjpeg.h
+++ OpenJPEG_v1_3/libopenjpeg/openjpeg.h
@@ -44,7 +44,7 @@
 #define OPJ_API
 #define OPJ_CALLCONV
 #else
-#define OPJ_CALLCONV __stdcall
+#define OPJ_CALLCONV __declspec(dllexport)
 /*
 The following ifdef block is the standard way of creating macros which make exporting 
 from a DLL simpler. All files within this DLL are compiled with the OPJ_EXPORTS
 
EOF

patch -p 1 << \EOF
--- OpenJPEG_v1_3.orig/Makefile
+++ OpenJPEG_v1_3/Makefile
@@ -12,6 +12,7 @@
 AR = ar
 
 PREFIX = /usr
+INSTALL_BINDIR = $(PREFIX)/bin
 INSTALL_LIBDIR = $(PREFIX)/lib
 INSTALL_INCLUDE = $(PREFIX)/include
 
@@ -25,9 +26,10 @@
 CFLAGS = $(COMPILERFLAGS) $(INCLUDE)
 
 TARGET  = openjpeg
+SHREXT=dll
 STATICLIB = lib$(TARGET).a
-SHAREDLIB = lib$(TARGET)-$(VER_MAJOR).$(VER_MINOR).so
-LIBNAME = lib$(TARGET).so.$(VER_MAJOR)
+SHAREDLIB = lib$(TARGET)-$(VER_MAJOR).$(SHREXT)
+LIBNAME = lib$(TARGET).$(SHREXT).$(VER_MAJOR)
 
 
 
@@ -54,16 +56,17 @@
 	$(AR) r $@ $(MODULES)
 
 $(SHAREDLIB): $(MODULES)
-	$(CC) -s -shared -Wl,-soname,$(LIBNAME) -o $@ $(MODULES) $(LIBRARIES)
+	$(CC) -s -shared -Wl,-soname,$(LIBNAME) -o $@ -Wl,--out-implib -Wl,lib$(TARGET).$(SHREXT).a $(MODULES) $(LIBRARIES)
 
 install: OpenJPEG
-	install -d '$(DESTDIR)$(INSTALL_LIBDIR)' '$(DESTDIR)$(INSTALL_INCLUDE)'
-	install -m 644 -o root -g root $(STATICLIB) '$(DESTDIR)$(INSTALL_LIBDIR)'
+	install -d '$(DESTDIR)$(INSTALL_BINDIR)' '$(DESTDIR)$(INSTALL_LIBDIR)' '$(DESTDIR)$(INSTALL_INCLUDE)'
+	install -m 644 $(STATICLIB) '$(DESTDIR)$(INSTALL_LIBDIR)'
 	ranlib '$(DESTDIR)$(INSTALL_LIBDIR)/$(STATICLIB)'
-	install -m 755 -o root -g root $(SHAREDLIB) '$(DESTDIR)$(INSTALL_LIBDIR)'
-	ln -sf $(SHAREDLIB) '$(DESTDIR)$(INSTALL_LIBDIR)/$(LIBNAME)'
-	install -m 644 -o root -g root libopenjpeg/openjpeg.h '$(DESTDIR)$(INSTALL_INCLUDE)'
-	-ldconfig
+	install -m 644 lib$(TARGET).$(SHREXT).a '$(DESTDIR)$(INSTALL_LIBDIR)'
+	install -m 755 $(SHAREDLIB) '$(DESTDIR)$(INSTALL_BINDIR)'
+#	ln -sf $(SHAREDLIB) '$(DESTDIR)$(INSTALL_LIBDIR)/$(LIBNAME)'
+	install -m 644 libopenjpeg/openjpeg.h '$(DESTDIR)$(INSTALL_INCLUDE)'
+#	-ldconfig
 
 clean:
 	rm -rf core dist/ u2dtmp* $(MODULES) $(STATICLIB) $(SHAREDLIB) $(LIBNAME)
EOF

${XMINGW}/cross make COMPILERFLAGS="-O2 -mtune=pentium4 -msse -mno-sse2 -pipe -fomit-frame-pointer -ffast-math -Wall -std=c99 -DWIN32" > make.log 2>&1

mkdir target
${XMINGW}/cross make PREFIX="" DESTDIR="${PWD}/target" install > install.log 2>&1

cd target
7z a openjpeg-1.3-bin.7z bin/*.dll
7z a openjpeg-dev-1.3.7z include lib/*.a

freetype


dll 名は freetype6.dll になります。 libtool の soname_spec を書き換えています。通常は libfreetype-6.dll です。

# The FreeType Project
# http://freetype.sourceforge.net/
# freetype-2.4.4.tar.bz2

# opt: zlib

tar -jxf freetype-2.4.4.tar.bz2
cd freetype-2.4.4

# debian パッチを適用する場合。今回は必要ない。
# zcat ../freetype_2.4.2-2.diff.gz | patch -p 1
# for f in debian/patches-freetype/*.patch; do patch -i $f -p1; done

mkdir target
mkdir build
cd build

# make log を見ると build-cc に CFLAGS を渡してないが、念のため。
${XMINGW}/cross-ppconfigure --prefix=${PWD}/../target CC="gcc -mtune=pentium4 -msse -mno-sse2" CC_BUILD=build-cc CFLAGS="-O2 -pipe -fomit-frame-pointer -ffast-math `${XMINGW}/cross --cflags`" LDFLAGS="-s `${XMINGW}/cross --ldflags`"

# freetype6.dll の形にするため書き換える。
sed -i.orig -e 's#^soname_spec=.*#soname_spec="\\\`echo "\\\${libname}\\\${versuffix}" | \\\$SED -e "s/^lib//" -e "s/-//"\\\`\\\${shared_ext}"#' libtool

${XMINGW}/cross make > make.log 2>&1

${XMINGW}/cross make install > install.log 2>&1

cd ../target/
sed -i.orig -e 's#^\(prefix=\).*#\1\`dirname \$0\`/..#' bin/freetype-config

7z a freetype-2.4.4-bin.7z bin/*.dll
7z a freetype-dev-2.4.4.7z bin/*-config include lib/*.a lib/pkgconfig share/aclocal

fontconfig


dll 名は libfontconfig-1.dll になります。

# fontconfig.org - FrontPage
# http://www.fontconfig.org/wiki/
# fontconfig-2.8.0.tar.gz 

# license: fontconfig

# deps: expat or libxml2
# opt: freetype, iconv

tar -zxf fontconfig-2.8.0.tar.gz 
cd fontconfig-2.8.0
mkdir target
mkdir build
cd build

# target が x86 で build が x86_64 のため CFLAGS の -mtune が引っかかる。
# そのため CC にアーキテクチャー系コンパイル オプションを入れている。
${XMINGW}/cross-ppconfigure --prefix=${PWD}/../target --enable-libxml2 --with-arch=mingw32 CFLAGS="-O2  -pipe -fomit-frame-pointer -ffast-math `${XMINGW}/cross --cflags --ldflags`" CC="gcc -mtune=pentium4 -msse -mno-sse2" CC_FOR_BUILD="build-cc"

${XMINGW}/cross make > make.log 2>&1

${XMINGW}/cross make install > install.log 2>&1

cd ../target
7z a fontconfig-2.8.0-bin.7z bin/*.dll etc
7z a fontconfig-2.8.0-tools.7z bin/*.exe share/man/man1
7z a fontconfig-dev-2.8.0.7z include lib/*.{a,def} lib/pkgconfig share/doc share/man/man{3,5}

etc/fonts/fonts.conf が設定ファイルです。フォントキャッシュは規定では次の場所を参照します。
 <!-- Font cache directory list -->
 
 	<cachedir>WINDOWSTEMPDIR_FONTCONFIG_CACHE</cachedir>
 	<cachedir>~/.fontconfig</cachedir>

通常は %TEMP% に作られます。 WINDOWSTEMPDIR_FONTCONFIG_CACHE がその設定です。 WINDOWSTEMPDIR_FONTCONFIG_CACHE を削除すると %HOME%/.fontconfig に作成されます。

little cms


1.19 の例。 dll 名は liblcms-1.dll です。

# Little CMS ? Great color at small footprint
# http://www.littlecms.com/
# lcms-1.19.tar.gz

# license: Little CMS

# deps: libjpeg, libtiff, zlib

tar -zxf lcms-1.19.tar.gz
cd lcms-1.19
mkdir target
mkdir build
cd build

${XMINGW}/cross-ppconfigure --prefix=${PWD}/../target CFLAGS="-O2 -mtune=pentium4 -msse -mno-sse2 -pipe -fomit-frame-pointer -ffast-math `${XMINGW}/cross --cflags`" LDFLAGS=" `${XMINGW}/cross --ldflags` -Wl,-s"

# libtool を書き換える。 dll を作ってくれないので。
#    allow_undefined_flag を supported に、 always_export_symbols を yes にする。
bash ${XMINGW}/replibtool.sh

# 存在する場合。
mv ../include/icc34.h ../include/icc34.h.off

${XMINGW}/cross make install > install.log 2>&1

cd ../target
7z a lcms-1.19-bin.7z bin/*.dll
7z a lcms-1.19-tools.7z bin/*.exe share/man/man1
7z a lcms-dev-1.19.7z include lib/*.a lib/pkgconfig


2.0a の例。 dll 名は liblcms2-2.dll になります。

# Little CMS ? Great color at small footprint
# http://www.littlecms.com/
# lcms2-2.0a.tar.gz 

# deps: libjpeg, libtiff, zlib

tar -zxf lcms2-2.0a.tar.gz
cd lcms-2.0
mkdir target
mkdir build
cd build
${XMINGW}/cross-ppconfigure --prefix=${PWD}/../target CFLAGS="-O2 -mtune=pentium4 -msse -mno-sse2 -pipe -fomit-frame-pointer -ffast-math `${XMINGW}/cross --cflags`" LDFLAGS=" `${XMINGW}/cross --ldflags` -Wl,-s"

# libtool を書き換える。 dll を作ってくれないので。
#    allow_undefined_flag を supported に、 always_export_symbols を yes にする。

${XMINGW}/cross make install > install.log 2>&1

cd ../target
7z a lcms2-2.0a-bin.7z bin/*.dll
7z a lcms2-2.0a-tools.7z bin/*.exe share/man/man1
7z a lcms2-dev-2.0a.7z include lib/*.a lib/pkgconfig

libgsf


# libgsf - Free Software Directory - Free Software Foundation
# http://directory.fsf.org/project/libgsf/
# libgsf-1.14.18.tar.bz2

# license: GPL v2, LGPLv2.1 ( lib )

# opt: gettext, glib, libxml2, bzip2, zlib

tar -jxf libgsf-1.14.18.tar.bz2
cd libgsf-1.14.18
mkdir target
mkdir build
cd build

${XMINGW}/cross-ppconfigure --prefix=${PWD}/../target --enable-shared --disable-static  CFLAGS="-O2 -mtune=pentium4 -pipe -fomit-frame-pointer -ffast-math `${XMINGW}/cross --cflags --ldflags`"

${XMINGW}/cross make > make.log 2>&1

${XMINGW}/cross make install > install.log 2>&1

cd ../target
7z a libgsf-1.14.18-bin.7z bin/*.dll
7z a libgsf-1.14.18-tools.7z bin/*.exe etc share/locale share/man
7z a libgsf-dev-1.14.18.7z include lib/*.a lib/pkgconfig share/gtk-doc

libcroco


# Libcroco, the CSS C toolkit for GNOME
# http://www.freespiders.org/projects/libcroco/
# libcroco-0.6.2.tar.bz2

# license: GPL v2, LGPL v2

# deps: glib2, libxml2

tar -jxf libcroco-0.6.2.tar.bz2
cd libcroco-0.6.2
mkdir target
mkdir build
cd build

${XMINGW}/cross-ppconfigure --prefix=${PWD}/../target --enable-shared --disable-static CFLAGS="-O2 -mtune=pentium4 -msse -mno-sse2 -pipe -fomit-frame-pointer -ffast-math `${XMINGW}/cross --cflags`" LDFLAGS="-s"

${XMINGW}/cross make > make.log 2>&1

${XMINGW}/cross make install > install.log 2>&1

cd ../target
7z a libcroco-0.6.2-bin.7z bin/*.dll
7z a libcroco-0.6.2-tools.7z bin/*.exe
7z a libcroco-dev-0.6.2.7z bin/*-config include lib/*.a lib/pkgconfig

libexif


# The libexif C EXIF library
# http://libexif.sourceforge.net/
# libexif-0.6.19.tar.bz2

# license: LGPL v2.1

tar -jxf libexif-0.6.19.tar.bz2
cd libexif-0.6.19
mkdir target
mkdir build
cd build

${XMINGW}/cross-ppconfigure --prefix=${PWD}/../target --enable-shared --disable-static CFLAGS="-O2 -mtune=pentium4 -msse -mno-sse2 -pipe -fomit-frame-pointer -ffast-math `${XMINGW}/cross --cflags --ldflags`" LDFLAGS="-s"

${XMINGW}/cross make > make.log 2>&1

${XMINGW}/cross make install > install.log 2>&1

cd ../target
7z a libexif-0.6.19-bin.7z bin/*.dll
7z a libexif-dev-0.6.19-bin.7z include lib/*.a lib/pkgconfig share

librsvg


# Scalable Vector Graphics - librsvg
# http://librsvg.sourceforge.net/
# librsvg-2.31.0.tar.bz2

# license: GPL v2, LGPL v2

tar -jxf librsvg-2.31.0.tar.bz2
cd librsvg-2.31.0
mkdir target
mkdir build
cd build

${XMINGW}/cross-ppconfigure --prefix=${PWD}/../target --enable-shared --disable-static CFLAGS="-O2 -mtune=pentium4 -msse -mno-sse2 -pipe -fomit-frame-pointer -ffast-math `${XMINGW}/cross --cflags --ldflags`" LDFLAGS="-s"

${XMINGW}/cross make > make.log 2>&1

mkdir -p ../target/etc/gtk-2.0
${XMINGW}/cross make install > install.log 2>&1

cd ../target
7z a librsvg-2.31.0-bin.7z bin/*.dll `find lib -name \*.dll` share/pixmaps share/themes
7z a librsvg-2.31.0-tools.7z bin/*.exe bin/rsvg share/man/man1 
7z a librsvg-dev-2.31.0-bin.7z include `find lib -name \*.a` lib/pkgconfig

libmng


configure する場合。 unmaintained と注記されているのが気になる。

# libmng | Download libmng software for free at SourceForge.net
# http://sourceforge.net/projects/libmng/
# libmng-1.0.10.tar.bz2

# license: libmng

# deps: zlib, libjpeg, little cms

tar -jxf libmng-1.0.10.tar.bz2
cd libmng-1.0.10

# configure を作成する。
./unmaintained/autogen.sh 

mkdir target

XLIBRARY_SET=${XLIBRARY}/gimp_build_set

${XMINGW}/cross-configure --prefix=${PWD}/target --enable-shared --disable-static CFLAGS="-O2 -mtune=pentium4 -msse -mno-sse2 -pipe -fomit-frame-pointer -ffast-math `${XMINGW}/cross --cflags --ldflags`" LDFLAGS="-s"

# libtool を書き換える。 dll を作ってくれないので。
#    allow_undefined_flag を supported に、 always_export_symbols を yes にする。
bash ${XMINGW}/replibtool.sh

${XMINGW}/cross make > make.log 2>&1

${XMINGW}/cross make install > install.log 2>&1

cd target
7z a libmng-1.0.10-bin.7z bin/*.dll
7z a libmng-dev-1.0.10.7z include lib/*.a share/man/man{3,5}

libxpm no X


dll 名は libXpm-noX4.dll です。

# Browse GTK+ and GIMP installers for Windows Files on SourceForge.net
# http://sourceforge.net/projects/gimp-win/files/
# mingw32-xpm-nox-4.2.0-4.15.src.rpm

# license: libxpm

bsdtar -zxf mingw32-xpm-nox-4.2.0-4.15.src.rpm
tar -jxf xpm-nox-4.2.0.tar.bz2
patch -i xpm-nox-4.2.0-mingw.patch -p 0
cd xpm-nox-4.2.0

${XMINGW}/cross make CFLAGS="-O2 -mtune=pentium4 -msse -mno-sse2 -pipe -fomit-frame-pointer -ffast-math" LDFLAGS="-s" > make.log 2>&1

mkdir target
${XMINGW}/cross make install prefix="${PWD}/target/" > install.log 2>&1

cd target
7z a libxpm-nox-4.2.0-bin.7z bin/*.dll
7z a libxpm-nox-4.2.0-tools.7z bin/*.exe share/man/man1
7z a libxpm-nox-dev-4.2.0.7z include lib/*.a

libwmf


dll 名は libwmf-0-2-7.dll, libwmflite-0-2-7.dll になります。

configure が依存ライブラリ libpng のチェックで -lpng 決め打ちしているのでごまかしています。 configure.ac を書き換えるのが正しい修正ですが、修正には当該箇所をどこかの configure.ac からパクってくればよいと考えて触ってません。

# http://www.ring.gr.jp/archives/linux/debian/debian/pool/main/libw/libwmf/
# libwmf_0.2.8.4.orig.tar.gz
# libwmf_0.2.8.4-7.debian.tar.gz

# license: GPL v2

# deps: freetype2, glib, libjpeg, libpng, zlib
# opt: expat or libxml

tar -zxf libwmf_0.2.8.4.orig.tar.gz
cd libwmf-0.2.8.4

tar -zxf ../libwmf_0.2.8.4-7.debian.tar.gz
for f in debian/patches/*.patch; do patch -i $f -p1; done

mkdir target
mkdir build
cd build

# configure が -lpng 決め打ちで依存チェックしているのでごまかす。
# 下は libpng14 を設定している。場所は ${XLIBRARY}/lib 
mkdir libpng
ln -s ${XLIBRARY}/lib/include/libpng14 libpng/include
mkdir libpng/lib
ln -s ${XLIBRARY}/lib/lib/libpng14.dll.a libpng/lib/libpng.dll.a

XLIBRARY_SET=${XLIBRARY}/gimp_build_set

${XMINGW}/cross-ppconfigure --prefix=${PWD}/../target --with-libxml2 --without-expat --with-png=${PWD}/libpng --without-x --without-sys-gd --disable-gd CPPFLAGS=" `${XMINGW}/cross --cflags --ldflags`" CFLAGS="-O2 -mtune=pentium4 -msse -mno-sse2 -pipe -fomit-frame-pointer -ffast-math" LDFLAGS="-s"

${XMINGW}/cross make install > make.log 2>&1

cd ../target
7z a libwmf-0.2.8.4-7-bin.7z bin/*.dll share/libwmf `find lib -name \*.dll`
7z a libwmf-0.2.8.4-7-tools.7z bin/*.exe bin/libwmf-fontmap
7z a libwmf-dev-0.2.8.4-7.7z bin/libwmf-config include `find lib -name \*.a`

configure の結果。なぜ gd が有効に...
 Support for X:			no
 Support for GD:			sys
 Support for JPEG though GD:	yes
 Support for XML:		libxml2
 
 Documentation directory:	/usr/xmingw/xmingw32/local/src/libs/pic/libwmf-0.2.8.4/build/../target/share/doc/libwmf
 Font directory:			/usr/xmingw/xmingw32/local/src/libs/pic/libwmf-0.2.8.4/build/../target/share/libwmf/fonts
 System XML fontmap file:	/usr/share/fonts/fontmap
 Non-system XML fontmap file:	/usr/xmingw/xmingw32/local/src/libs/pic/libwmf-0.2.8.4/build/../target/share/libwmf/fonts/fontmap
 ghostscript fontmap file:	/var/lib/defoma/gs.d/dirs/fonts/Fontmap
 ghostscript font directory:	/var/lib/defoma/gs.d/dirs/fonts
 
 building gdk-pixbuf plug-in?	yes

poppler


dll 名は次のようになります。
  • libpoppler-5.dll
  • libpoppler-glib-4.dll

# http://www.ring.gr.jp/archives/linux/debian/debian/pool/main/p/poppler/
# poppler_0.12.4.orig.tar.gz
# poppler_0.12.4-1.1.diff.gz

# deps: fontconfig, freetype2
# opt: abiword, cairo, glib,
#      libjpeg, libpng, little cms, openjpeg
#      qt, splash, zlib

tar -zxf poppler_0.12.4.orig.tar.gz
cd poppler-0.12.4

zcat ../poppler_0.12.4-1.1.diff.gz | patch -p 1
for f in debian/patches/*.patch; do patch -i $f -p1; done

mkdir target
mkdir build
cd build

XLIBRARY_SET=${XLIBRARY}/gimp_build_set

# configure が -lpng 決め打ちで依存チェックしているのでごまかす。
# 下は libpng14 を設定している。場所は ${XLIBRARY}/lib 
mkdir libpng
ln -s ${XLIBRARY}/lib/include/libpng14 libpng/include
mkdir libpng/lib
ln -s ${XLIBRARY}/lib/lib/libpng14.dll.a libpng/lib/libpng.dll.a

${XMINGW}/cross-ppconfigure --prefix="${PWD}/../target" --without-x CPPFLAGS="-I${PWD}/libpng/include `${XMINGW}/cross --cflags`" CFLAGS="-O2 -mtune=pentium4 -msse -mno-sse2 -pipe -fomit-frame-pointer -ffast-math" LDFLAGS="-s -L${PWD}/libpng/lib `${XMINGW}/cross --ldflags`"

${XMINGW}/cross make > make.log 2>&1

${XMINGW}/cross make install > install.log 2>&1

cd ../target
7z a poppler-0.12.4-1-bin.7z bin/*.dll
7z a poppler-0.12.4-1-tools.7z bin/*.exe share/man/man1
7z a poppler-dev-0.12.4-1.7z include lib/*.a lib/pkgconfig share/gtk-doc

configure の結果。 zlib を有効にするには --enable-zlib します。ただし Warning: Using zlib is not totally safe の警告が出ます。
 Building poppler with support for:
   splash output:      yes
   cairo output:       yes
   abiword output:     yes
   qt wrapper:         no
   qt4 wrapper:        no
   glib wrapper:       yes
     use GDK:          yes
   use gtk-doc:        no
   use libjpeg:        yes
   use libpng:         yes
   use zlib:           no
   use libopenjpeg:    no
   use cms:            yes
   command line utils: yes
 
   Warning: Using libopenjpeg is recommended

libpoppler-5.dll が libxml2 をリンクしているのはなぜだろう...
poppler 0.14.4

dll 名は次のようになります。
  • libpoppler-7.dll
  • libpoppler-cpp-0.dll
  • libpoppler-glib-5.dll

# Poppler
# http://poppler.freedesktop.org/
# poppler-0.14.4.tar.gz

# license: GPL v2 or commercial license

# deps: fontconfig, freetype2
# opt: abiword-output, cairo, glib,
#      libjpeg, libpng, little cms, openjpeg
#      qt, zlib

tar -zxf poppler-0.14.4.tar.gz
cd poppler-0.14.4

#  strdup, stricmp は string.h で宣言されているのだけれど、
#  g++ -ansi すると無効化されてしまう。
sed -i.orig -e 's/^\(  CXXFLAGS="$CXXFLAGS\) -ansi"$/\1"/' configure

patch -p 1 << \EOF
--- poppler-0.14.4.orig/goo/JpegWriter.cc
+++ poppler-0.14.4/goo/JpegWriter.cc
@@ -10,12 +10,11 @@
 //
 //========================================================================
 
+#include "poppler/Error.h"
 #include "JpegWriter.h"
 
 #ifdef ENABLE_LIBJPEG
 
-#include "poppler/Error.h"
-
 void outputMessage(j_common_ptr cinfo)
 {
 	char buffer[JMSG_LENGTH_MAX];
EOF

# Makefile.am を書き換えるべき...

patch -p 1 << \EOF
--- poppler-0.14.4.orig/splash/Makefile.in
+++ poppler-0.14.4/splash/Makefile.in
@@ -319,6 +319,7 @@
 INCLUDES = \
 	-I$(top_srcdir)				\
 	-I$(top_srcdir)/goo			\
+	$(LIBPNG_CFLAGS)				\
 	$(FREETYPE_CFLAGS)
 
 noinst_LTLIBRARIES = libsplash.la
--- poppler-0.14.4.orig/utils/Makefile.in
+++ poppler-0.14.4/utils/Makefile.in
@@ -390,6 +390,7 @@
 	-I$(top_srcdir)/utils			\
 	-I$(top_srcdir)/poppler			\
 	$(UTILS_CFLAGS)				\
+	$(LIBPNG_CFLAGS)				\
 	$(FONTCONFIG_CFLAGS)			\
 	$(ABIWORD_CFLAGS)
 
EOF

mkdir target
mkdir build
cd build

XLIBRARY_SET=${XLIBRARY}/gimp_build_set

_CFLAGS="-O2 -mtune=pentium4 -msse -mno-sse2 -pipe -fomit-frame-pointer -ffast-math"
${XMINGW}/cross-ppconfigure --prefix="${PWD}/../target" --without-x CPPFLAGS="`${XMINGW}/cross --cflags`" CFLAGS="${_CFLAGS}" CXXFLAGS="${_CFLAGS}" LDFLAGS="-s `${XMINGW}/cross --ldflags`"

# あまり意味はない...
sed -i.orig -e "s%\(^#define POPPLER_DATADIR \"\)${PWD}/../target\(.*\)\"%\1\2\"%" config.h

${XMINGW}/cross make > make.log 2>&1

${XMINGW}/cross make install > install.log 2>&1

cd ../target
7z a poppler-0.14.4-bin.7z bin/*.dll
7z a poppler-0.14.4-tools.7z bin/*.exe share/man/man1
7z a poppler-dev-0.14.4.7z include lib/*.a lib/pkgconfig share/gtk-doc

configure の結果。
 Building poppler with support for:
   font configuration: win32
   splash output:      yes
   cairo output:       yes
   abiword output:     yes
   qt wrapper:         no
   qt4 wrapper:        no
   glib wrapper:       yes
     use GDK:          yes
   cpp wrapper:        yes
   use gtk-doc:        no
   use libjpeg:        yes
   use libpng:         yes
   use zlib:           no
   use libcurl:        no
   use libopenjpeg:    yes
   use cms:            yes
   command line utils: yes

babl


unit test 関係で pthread が必要。 tests は Makefile の SUBDIR からはずしてしまってもいい。

# ftp://ftp.gimp.org/pub/babl/0.1
# babl-0.1.4.tar.bz2

# license: LGPL v3

tar -jxf babl-0.1.4.tar.bz2
cd babl-0.1.4
mkdir target
mkdir build
cd build

XLIBRARY_SET=${XLIBRARY}/gimp_build_set

${XMINGW}/cross-ppconfigure --prefix=${PWD}/../target --enable-shared --disable-static --enable-mmx --enable-sse CFLAGS="-O2 -mtune=pentium4 -mno-sse2 -pipe -fomit-frame-pointer -ffast-math" CPPFLAGS="`${XMINGW}/cross --cflags`" LDFLAGS="`${XMINGW}/cross --ldflags`"

# tests/Makefile の -pthread を -lpthread に変更する。面倒なら SUBDIRS からはずす。
sed -i.orig -e 's/ -pthread/ -lpthread/' tests/Makefile

# libtool を書き換える。 dll を作ってくれないので。
#    allow_undefined_flag を supported に、 always_export_symbols を yes にする。
bash ${XMINGW}/replibtool.sh

${XMINGW}/cross make SHREXT=.dll install > make.log 2>&1

cd ../target
7z a babl-0.1.4-bin.7z bin/*.dll lib/babl-0.1/*.dll
7z a babl-dev-0.1.4.7z include lib/*.a lib/babl-0.1/*.a lib/pkgconfig

gegl


# ftp://ftp.gimp.org/pub/gegl/0.1
# gegl-0.1.6.tar.bz2

# license: GPL v3, LGPL v3 ( lib )

# deps: babl, gtk+, cairo, pango
#     : libintl, libjpeg, libpng

tar -jxf gegl-0.1.6.tar.bz2
cd gegl-0.1.6
mkdir target
mkdir build
cd build

XLIBRARY_SET=${XLIBRARY}/gimp_build_set

# CPPFLAGS を設定しないと jpeglib.h を見つけてくれない。
${XMINGW}/cross-ppconfigure --prefix=${PWD}/../target --enable-shared --disable-static --disable-largefile --disable-docs CFLAGS="-O2 -mtune=pentium4 -msse -mno-sse2 -pipe -fomit-frame-pointer -ffast-math" CPPFLAGS="`${XMINGW}/cross --cflags`" LDFLAGS="-s `${XMINGW}/cross --ldflags`"

# libtool を書き換える。 shared でリンクしてくれないので。
#    allow_undefined_flag を supported に、 always_export_symbols を yes にする。
bash ${XMINGW}/replibtool.sh

${XMINGW}/cross make SHREXT=".dll" libgegl="-L${PWD}/gegl/.libs -lgegl-0.1" install >make.log 2>&1

cd ../target
7z a gegl-0.1.6-bin.7z bin/*.dll lib/gegl-0.1/*.dll
7z a gegl-0.1.6-tools.7z bin/*.exe
7z a gegl-dev-0.1.6.7z include lib/*.a lib/gegl-0.1/*.a lib/pkgconfig

Gimp


途中経過です。まだ動かしてません。異常なくビルドが終了するのを確認したところまで。

fontconfig のキャッシュ ファイルの作成場所は etc/fonts/fonts.conf に記述されています。規定では WINDOWSTEMPDIR_FONTCONFIG_CACHE (%TEMP%) になっています。 portable にするには当該箇所を削除し、 gimp-2.6.exe の起動前に HOME 環境変数に保存フォルダーを設定します。こうすると保存フォルダーの下にキャッシュが作成されます。保存フォルダーは COMPUTERNAME 環境変数と USERNAME 環境変数を組み合わせれば、ただしそれらの環境変数がコンピューターごとに適切に設定されていて、なおかつ COMPUTERNAME と USERNAME が漏洩する心配がなければですが、 usb などに設定を保存していても問題はない(はず)です。

同様に Gimp の各種設定は GIMP2_DIRECTORY 環境変数にフォルダーを設定します。注意すべきは、既存の空のフォルダーを指定しないことです。古い Gimp では既存の空のフォルダーを指定すると設定ファイルをうまく作成してくれませんでした。次にくる問題はフォルダー名のつけ方です。フォルダー名の生成に COMPUTERNAME 環境変数と USERNAME 環境変数を参照するべきでしょうか? 僕はユーザーが選択可能にするべきと考えます。 todo

gtk+ bundle では etc/gtk-2.0 に gtkrc を欠いています。そのためコントローラー フェイスが gtk+ 標準になっています。昔は Windows 用の gtkrc が share/themes/MS-Windows/gtk-2.0 にあったのですが、今は存在しません( bundle の問題? bundle のパッケージング ミスだったようです )。当時のファイルの内容は次のようになっていました。
gtk-icon-sizes = "gtk-menu=13,13:gtk-small-toolbar=16,16:gtk-large-toolbar=24,24:gtk-dnd=32,32"
gtk-toolbar-icon-size = small-toolbar

# disable images in buttons. i've only seen ugly delphi apps use this feature.
gtk-button-images = 0

# enable/disable images in menus. most "stock" microsoft apps don't use these, except sparingly.
# the office apps use them heavily, though.
gtk-menu-images = 1

# use the win32 button ordering instead of the GNOME HIG one, where applicable
gtk-alternative-button-order = 1

# use the win32 sort indicators direction, as in Explorer
gtk-alternative-sort-arrows = 1

# Windows users don't expect the PC Speaker beeping at them when they backspace in an empty textview and stuff like that
gtk-error-bell = 0

style "msw-default"
{
  GtkWidget::interior-focus = 1
  GtkOptionMenu::indicator-size = { 9, 5 }
  GtkOptionMenu::indicator-spacing = { 7, 5, 2, 2 }
  GtkSpinButton::shadow-type = in

  # Owen and I disagree that these should be themable
  #GtkUIManager::add-tearoffs = 0
  #GtkComboBox::add-tearoffs = 0
  
  GtkComboBox::appears-as-list = 1
  GtkComboBox::focus-on-click = 0
  
  GOComboBox::add_tearoffs = 0

  GtkTreeView::allow-rules = 0
  GtkTreeView::expander-size = 12

  GtkExpander::expander-size = 12

  GtkScrolledWindow::scrollbar_spacing = 1

  GtkSeparatorMenuItem::horizontal-padding = 2

  engine "wimp" 
  {
  }
}
class "*" style "msw-default"

binding "ms-windows-tree-view"
{
  bind "Right" { "expand-collapse-cursor-row" (1,1,0) }
  bind "Left" { "expand-collapse-cursor-row" (1,0,0) }
}

class "GtkTreeView" binding "ms-windows-tree-view"

style "msw-combobox-thickness" = "msw-default"
{
  xthickness = 0 
  ythickness = 0
}

widget_class "*TreeView*ComboBox*" style "msw-combobox-thickness"
widget_class "*ComboBox*GtkFrame*" style "msw-combobox-thickness"

%APPDATA%/gtk-2.0 が作成されます。 todo

memo

Running GTK+ Applications <http://library.gnome.org/devel/gtk/stable/gtk-runn...>
Using GTK+ on Windows <http://library.gnome.org/devel/gtk/stable/gtk-wind...>
2.6.11

# ftp://ftp.gimp.org/pub/gimp/2.6
# gimp-2.6.11.tar.bz2

# license: GPL v2

# deps: babl, glib, gtk+, cairo, pango, atk
#       libintl, gettext, gail
#       libjpeg, libpng, libtiff
#       fontconfig, freetype
#       zlib
#       todo

# opt: libexif, libmng, libwmf, librsvg, libxpm-no X
#       libcroco, poppler, little cms, libgsf
#       libxml2

tar -jxf gimp-2.6.11.tar.bz2
cd gimp-2.6.11
mkdir target
mkdir build
cd build

XLIBRARY_SET=${XLIBRARY}/gimp_build_set

${XMINGW}/cross-ppconfigure --prefix=${PWD}/../target --enable-shared --disable-static --disable-python --disable-largefile --without-x --without-gtk-doc CPPFLAGS="`${XMINGW}/cross --cflags --ldflags` -DXPM_NO_X -I${XLIBRARY}/gimp-dep/include/noX" LDFLAGS="`${XMINGW}/cross --ldflags`"

${XMINGW}/cross windres -I ../app -i ../app/gimp.rc -o gimp.rc.o

# libtool を書き換える。 shared でリンクしてくれないので。
#    allow_undefined_flag を supported に、 always_export_symbols を yes にする。
bash ${XMINGW}/replibtool.sh

# libwmf が -lpng 決め打ちしているのでごまかす。
# 下は libpng14 を設定している。場所は ${XLIBRARY}/lib 
mkdir libpng
ln -s ${XLIBRARY}/lib/include/libpng14 libpng/include
mkdir libpng/lib
ln -s ${XLIBRARY}/lib/lib/libpng14.dll.a libpng/lib/libpng.dll.a

# little cms の問題で -Dcdecl=LCMSAPI している。
# mail プラグインを作成しようとするので抑止している。
${XMINGW}/cross make CFLAGS="-O2 -mtune=pentium4 -msse -mno-sse2 -pipe -fomit-frame-pointer -ffast-math `${XMINGW}/cross --cflags` -Dcdecl=LCMSAPI" mwindows="-mwindows ${PWD}/gimp.rc.o" LDFLAGS="-lwsock32 -lole32 -Wl,-s `${XMINGW}/cross --ldflags` -L${PWD}/libpng/lib" MAIL="" install > make.log 2>&1

cd ../target
rm bin/gimp.exe bin/gimp-console.exe
7z a gimp-2.6.11-bin.`date +%Y%m%d%H%M`.7z bin/*.{exe,dll} etc `find lib/gimp -xtype f -not -iname \*.a -and -not -iname \*.la` share/locale share/gimp [ACHILNR]*
7z a gimp-dev-2.6.11.`date +%Y%m%d%H%M`.7z bin/gimptool-2.0* include `find lib -xtype f -iname \*.a` lib/pkgconfig share/aclocal share/icons

configure の結果。
 Building GIMP with prefix=/usr/xmingw/xmingw32/local/src/gimp/core/gimp-2.6.10/build/../target, datarootdir=${prefix}/share
 Desktop files install into ${datarootdir}
 
 Extra Binaries:
   gimp-console:        yes
   gimp-remote:         no (not enabled)
 
 Optional Features:
   D-Bus service:       no
   Language selection:  yes
 
 Optional Plug-Ins:
   Ascii Art:           no (AA library not found)
   Help Browser:        no (WebKit not found)
   LCMS:                yes
   JPEG:                yes
   MNG:                 yes
   PDF:                 yes
   PNG:                 yes
   Print:               yes
   PSP:                 yes
   Python:              no
   Script-Fu:           yes
   SVG:                 yes
   TIFF:                yes
   TWAIN (MacOS X):     no
   TWAIN (Win32):       no
   URI:                 yes (using GIO/GVfs)
   Windows ICO          yes
   WMF:                 yes
   XJT:                 yes
   XPM:                 yes
 
 Plug-In Features:
   EXIF support:        yes
   GNOME UI:            no (libgnomeui-2.0 not found)
   GNOME keyring:       no (gnome-keyring-1 not found)
 
 Optional Modules:
   ALSA (MIDI Input):   no (libasound not found or unusable)
   Linux Input:         no (linux input support disabled) (HAL support: no)
   DirectInput (Win32): no
   Color Correction:    yes
   Soft Proof:          yes
2.7.2

ビルドに Gtk+ 2.24.3 以上を要求するのですが、現時点(2011/4/24sun)では gnome や Ring Server Project で配布されている Windows Binary が 2.24.0-1 であるためそのままではビルドできません。 Gtk+ のヘッダーファイルと Gimp のソースを書き換えています。

# ftp://ftp.gimp.org/pub/gimp/2.7
# gimp-2.7.2.tar.bz2

# license: GPL v3

# deps: babl, glib, gtk+, cairo, pango, atk
#       libintl, gettext, gail
#       libjpeg, libpng, libtiff
#       fontconfig, freetype
#       zlib
#       todo

# opt: libexif, libmng, libwmf, librsvg, libxpm-no X
#       libcroco, poppler, little cms, libgsf
#       libxml2

tar -jxf gimp-2.7.2.tar.bz2 
cd gimp-2.7.2
mkdir target
# build ディレクトリーが存在するので注意。 mybuild にしたほうがいいのかな。
mkdir build_

# パッケージング ミスなのだろうか...
cp build/windows/wilber.ico build/windows/plug-ins.ico

# build ディレクトリーを掘って作業する場合の不具合を修正する。
patch -i ../fix.gimp2.7.2.patch -p 1

cd build_

XLIBRARY_SET=${XLIBRARY}/gimp_build_set

# gtk+ 2.24.3 以上を要求するが windows binary が 2.24.0-1 しか用意されてない
# configure を書き換える。
# sed -i.orig ../configure -e "s/2\.24\.3/2.24.0/"
# app/gui/gui.c のマクロを書き換える。
# sed -i.orig ../app/gui/gui.c -e "s/^\(#define GTK_REQUIRED_MICRO\) 3/\1 0/"
# gtk+ のヘッダー ファイル gdkwin32.h を書き換える。
> #define gdk_win32_window_foreign_new_for_display gdk_window_foreign_new_for_display
> #define gdk_win32_window_lookup_for_display gdk_window_lookup_for_display

#  --target=i386-pc-mingw32 しないと色々問題がでる模様。
${XMINGW}/cross-ppconfigure --prefix=${PWD}/../target --enable-shared --disable-static --disable-python --disable-largefile --without-x CPPFLAGS="`${XMINGW}/cross --cflags --ldflags` -DXPM_NO_X -I${XLIBRARY}/gimp-dep/include/noX" LDFLAGS="`${XMINGW}/cross --ldflags`"  --target=i386-pc-mingw32

# build ディレクトリーを掘って作業する場合の不具合を修正する。
# コマンド中に作業ディレクトリー名が含まれている。
( cd .. && for f in `find -name \*.def`; do cp $f build_/$f ; done )

# libtool を書き換える。 shared でリンクしてくれないので。
#    allow_undefined_flag を supported に、 always_export_symbols を yes にする。
bash ${XMINGW}/replibtool.sh

# libwmf が -lpng 決め打ちしているのでごまかす。
# 下は libpng14 を設定している。場所は ${XLIBRARY}/lib 
mkdir libpng
ln -s ${XLIBRARY}/lib/include/libpng14 libpng/include
mkdir libpng/lib
ln -s ${XLIBRARY}/lib/lib/libpng14.dll.a libpng/lib/libpng.dll.a

# リソースファイルを make するためのサフィック スルールが
# 機能してないのでパッチをあてる。
# Makefile.in を書き換えるよりは害が少ないのでこちらを書き換える。
for f in `find -name Makefile`; do sed -i.orig -e "s/^\.rc\(\.rc\.o:\)/%\1/" $f; done

# little cms の問題で -Dcdecl=LCMSAPI している。
# 作成されないプラグイン(mail , file_xmc)を作成しようとするので抑止している。
${XMINGW}/cross make CFLAGS="-O2 -mtune=pentium4 -msse -mno-sse2 -pipe -fomit-frame-pointer -ffast-math `${XMINGW}/cross --cflags` -Dcdecl=LCMSAPI" LDFLAGS="-lwsock32 -lole32 -Wl,-s `${XMINGW}/cross --ldflags` -L${PWD}/libpng/lib" MAIL="" FILE_XMC="" install > make.log 2>&1

cd ../target

# 外観を windows 標準にする。
echo "gtk-theme-name = \"MS-Windows\"\n" > etc/gtk-2.0/gtkrc

# side-by-side
echo > bin/gimp-2.7.exe.local
echo > bin/gimp-console-2.7.exe.local

7z a gimp-2.7.2-bin.7z bin/*.{exe,dll} etc `find lib/gimp -xtype f -not -iname \*.a -and -not -iname \*.la` share/{gimp,icons,locale}  [ACHILNR]*
7z a gimp-dev-2.7.2.7z bin/gimptool-2.0* include `find lib -xtype f -iname \*.a -or -iname \*.def` lib/pkgconfig share/{aclocal,icons}

configure の結果。

Building GIMP with prefix=/usr/xmingw/xmingw32/local/src/gimp/core/gimp-2.7.2/build_/../target, datarootdir=${prefix}/share
Desktop files install into ${datarootdir}

Extra Binaries:
  gimp-console:        yes
  gimp-remote:         no (not enabled)

Optional Features:
  D-Bus service:       no
  Language selection:  yes

Optional Plug-Ins:
  Ascii Art:           no (AA library not found)
  Help Browser:        no (WebKit not found)
  LCMS:                yes
  JPEG:                yes
  JPEG 2000:           no (JasPer library not found)
  MNG:                 yes
  PDF (import):        yes
  PDF (export):        yes
  PNG:                 yes
  Print:               yes
  PSP:                 yes
  Python:              no
  Script-Fu:           yes
  SVG:                 yes
  TIFF:                yes
  TWAIN (MacOS X):     no
  TWAIN (Win32):       no
  URI:                 yes (using GIO/GVfs)
  Webpage:             no (WebKit not found)
  Windows ICO:         yes
  WMF:                 yes
  XJT:                 yes
  X11 Mouse Cursor:    yes
  XPM:                 yes

Plug-In Features:
  EXIF support:        yes

Optional Modules:
  ALSA (MIDI Input):   no (libasound not found or unusable)
  Linux Input:         no (linux input support disabled) (HAL support: no)
  DirectInput (Win32): no
  Color Correction:    yes
  Soft Proof:          yes

Tests:
  Use xvfb-run         no (not found)

fix.gimp2.7.2.patch
--- gimp-2.7.2.orig/plug-ins/win-snap/Makefile.in
+++ gimp-2.7.2/plug-ins/win-snap/Makefile.in
@@ -766,8 +766,8 @@
 	tags uninstall uninstall-am uninstall-libexecPROGRAMS
 
 
-winsnap-win32res.o: winsnap.rc select.cur small.ico winsnap.ico
-	$(WINDRES) winsnap.rc winsnap-win32res.o
+winsnap-win32res.o: $(srcdir)/winsnap.rc $(srcdir)/select.cur $(srcdir)/small.ico $(srcdir)/winsnap.ico
+	$(WINDRES) $(srcdir)/winsnap.rc winsnap-win32res.o
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.

2.6.11 の最小構成

Gimp の最小構成は次の5つのライブラリを用意すればビルドできます。
  • gtk+ bundle
  • babl
  • gegl
  • libjpeg
  • libtiff

ビルドに使用した&有効になっていると思われるライブラリ。ちょっと古い。
  • gimp 2.6.10
  • gtk+ bundle 2.20.0-20100406 win32
    • atk 1.30.0-1
    • cairo 1.8.10-3
    • expat 2.0.1-1
    • fontconfig 2.8.0-2
    • freetype 2.3.12-1
    • glib 2.24.0-2
    • gtk+ 2.20.0-1
    • libpng 1.4.0-1
    • pango 1.28.0-1
  • babl 0.1.2
  • gegl 0.1.2

追加予定のライブラリ。
  • gtk+ bundle 2.20.1-20100912 win32
  • bzip2 1.0.6
  • little cms 1.19
  • libgsf 1.14.18
  • libxml2 2.7.7
  • librsvg 2.31.0
  • libexif 0.6.19
  • libmng 1.0.10
  • libxpm-noX 4.2.0-4.15
  • libwmf 0.2.8.4-7
  • gettext 0.18.1.1
  • poppler 0.14.4

gimp-2.6.10 (simoncic) に含まれているがよくわからないもの。 webkit がらみで増えたのか...
  • libbonobo
  • libdbus
  • libenchant
  • libexslt
  • libgailutil
  • libgcc_s_sjlj
  • libgcrypt
  • libgeoclue
  • libgnutls
  • GNU Smalltalk
  • libIDL
  • libORBit
  • libhunspell
  • libjasper
  • libpoppler
  • libsoup
  • libsqlite3
  • libssp
  • libstdc++
  • libtasn
  • libtermcap
  • libwebkit
  • libxslt


手順など。

# ftp://ftp.gimp.org/pub/gimp/2.6
# gimp-2.6.10.tar.bz2

# deps: babl, gtk+, cairo, pango
#       libintl, libjpeg, libpng
#       todo

tar -jxf gimp-2.6.10.tar.bz2
cd gimp-2.6.10
mkdir target
mkdir build
cd build

XLIBRARY_SET=${XLIBRARY}/gimp_build_set

${XMINGW}/cross-ppconfigure --prefix=${PWD}/../target --enable-shared --disable-static --disable-python --disable-largefile --without-x --without-gtk-doc CPPFLAGS="`${XMINGW}/cross --cflags --ldflags`"

${XMINGW}/cross windres -I ../app -i ../app/gimp.rc -o gimp.rc.o

# libtool を書き換える。 shared でリンクしてくれないので。
#    allow_undefined_flag を supported に、 always_export_symbols を yes にする。
bash ${XMINGW}/replibtool.sh

# mail プラグインを作成しようとするので抑止する。

${XMINGW}/cross make CFLAGS="-O2 -mtune=pentium4 -msse -mno-sse2 -pipe -fomit-frame-pointer -ffast-math `${XMINGW}/cross --cflags`" mwindows="-mwindows ${PWD}/gimp.rc.o" LDFLAGS="-lwsock32 -lole32 -Wl,-s `${XMINGW}/cross --ldflags`" MAIL="" install >make.log 2>&1

cd ../target
7z a gimp-2.6.10-bin.7z bin/*.{exe,dll} etc `find lib/gimp -xtype f -not -iname \*.a -and -not -iname \*.la` share/locale share/gimp [ACHILNR]*
7z a gimp-dev-2.6.10.7z bin/gimptool-2.0.exe include `find lib -xtype f -iname \*.a` lib/pkgconfig share/aclocal share/icons

configure の結果。
 Building GIMP with prefix=/usr/xmingw/xmingw32/local/src/gimp/core/gimp-2.6.10/build/../target, datarootdir=${prefix}/share
 Desktop files install into ${datarootdir}
 
 Extra Binaries:
   gimp-console:        yes
   gimp-remote:         no (not enabled)
 
 Optional Features:
   D-Bus service:       no
   Language selection:  yes
 
 Optional Plug-Ins:
   Ascii Art:           no (AA library not found)
   Help Browser:        no (WebKit not found)
   LCMS:                no (lcms not found or unusable)
   JPEG:                yes
   MNG:                 no (MNG header file not found)
   PDF:                 Using PostScript plug-in (libpoppler not found)
   PNG:                 yes
   Print:               yes
   PSP:                 yes
   Python:              no
   Script-Fu:           yes
   SVG:                 no (librsvg not found)
   TIFF:                yes
   TWAIN (MacOS X):     no
   TWAIN (Win32):       no
   URI:                 yes (using GIO/GVfs)
   Windows ICO          yes
   WMF:                 no (libwmf not found)
   XJT:                 yes
   XPM:                 no (XPM library not found)
 
 Plug-In Features:
   EXIF support:        no (libexif not found or too old)
   GNOME UI:            no (libgnomeui-2.0 not found)
   GNOME keyring:       no (gnome-keyring-1 not found)
 
 Optional Modules:
   ALSA (MIDI Input):   no (libasound not found or unusable)
   Linux Input:         no (linux input support disabled) (HAL support: no)
   DirectInput (Win32): no
   Color Correction:    no (lcms not found or unusable)
   Soft Proof:          no (lcms not found or unusable)

todo


今後の予定。

- bzip2
- fontconfig
- freetype2
- gettext
- libcroco
- libexif
- libgsf
- libiconv
- liblcms
- libmng
- librsvg
- libxpm no X
- libxml2
- libwmf
- poppler

更新履歴



2011/5/4wed gimp 2.7.2 をすこし修正。
2011/4/25mon gimp 2.7.2 を追記。
2011/4/21thu libtiff を修正(まだ問題がありそうだけど調査不足...)。 freetype の dll 名を gtk+ bundles に合わせた。 babl 1.4, gegl 1.6 に置き換えた。 gegl の記述をもうすこし簡潔にした。
2010/12/10fri ページを分割しました。
2010/10/17sun Gimp に関するもろもろを追記。
2010/10/13wed poppler 0.14.4, gimp 2.6.11 を記述。libpng を修正。こまごまとした修正。
2010/10/6wed openjpeg を記述。 patch まわりを修正。
2010/9/27mon fftw3 を記述。 bzip2 1.0.6 を追記。
2010/9/24fri fontconfig, freetype, poppler を記述。
2010/9/23thu libwmf, gettext を記述。
2010/9/14tue libxpm no X を記述。
2010/9/13mon little cms 1.19, libmng を記述。 libpng, libxml2 を修正。
2010/9/10fri libpng に追記。 libexif, librsvg を記述。
2010/9/9thu libxml2, libcroco, libgsf を記述。
2010/9/7tue libiconv を記述。
2010/9/5sun bzip2, little cms を記述。
2010/9/4sat gegl, gimp を記述。
2010/9/1wed ぐだぐだな記述をやや修正。 babl を修正。
2010/8/30mon babl を記述。
タグ

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Wiki内検索

編集にはIDが必要です