Cross-compilation for windows with mingw
If you know how to compile everything on Linux, there's not much new to learn.
Two things are important:
- use the cross-compile toolchain (i.e. i486-mingw32-gcc instead of gcc and i486-mingw32-ranlib instead of ranlib)
- use the headers and libraries for the target system
If something goes wrong, you can expect one of these two points to be the culprit. Wrong/different headers or additional libraries (like ws2_32 for sockets) are another major source of trouble.
Most software using autotools will compile using ./configure --host=i486-mingw32; other software may require further changes.
Install mingw32:
Arch:
pacman -S mingw32-{binutils,gcc,runtime,w32api}
Debian/Ubuntu:
aptitude install mingw32{,-binutils,-runtime}
The value for TARGET depends on mingw32, it's i486-mingw32 for arch and i586-mingw32msvc for Debian.
export TARGET=i486-mingw32 #export TARGET=i586-mingw32msvc
Set a directory for building aMule. These two export commands have to be once in every terminal used to execute other command blocks shown here.
export BUILDDIR=$HOME/mingw32
Prepare build directory:
mkdir -p $BUILDDIR mkdir -p $BUILDDIR/tmp
Build zlib
cd $BUILDDIR wget http://www.zlib.net/zlib-1.2.3.tar.gz tar xzf zlib-1.2.3.tar.gz cd zlib-1.2.3 CC=$TARGET-gcc AR="$TARGET-ar rc" RANLIB=$TARGET-ranlib ./configure --prefix=$BUILDDIR/tmp make install
Build libiconv (needed for gettext)
cd $BUILDDIR wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.13.tar.gz tar xzf libiconv-1.13.tar.gz cd libiconv-1.13 ./configure --host=$TARGET --prefix=$BUILDDIR/tmp make install
Build gettext (patch needed)
cd $BUILDDIR wget http://ftp.gnu.org/pub/gnu/gettext/gettext-0.17.tar.gz tar xzf gettext-0.17.tar.gz cd gettext-0.17 echo "29,30d28 < VARIABLE(rpl_optarg) < VARIABLE(rpl_optind) " | patch gettext-tools/woe32dll/gettextlib-exports.c ./configure --host=$TARGET --prefix=$BUILDDIR/tmp --with-libiconv-prefix=$BUILDDIR/tmp make install
Build wxwidgets
cd $BUILDDIR wget http://prdownloads.sourceforge.net/wxwindows/wxWidgets-2.8.10.tar.bz2 tar xjf wxWidgets-2.8.10.tar.bz2 cd wxWidgets-2.8.10 ./configure --host=$TARGET --prefix=$BUILDDIR/tmp --with-libiconv-prefix=$BUILDDIR/tmp --enable-unicode --disable-shared make install
Build cryptopp, quite some patching necessary.
cd $BUILDDIR wget http://cryptopp.com/cryptopp560.zip mkdir cryptopp cd cryptopp unzip -a ../cryptopp560.zip echo "71a72,73 > #include <malloc.h> > " | patch rijndael.cpp echo "69d68 < LDFLAGS += -pthread" | patch GNUmakefile echo "9c9 < RANLIB = ranlib --- > RANLIB = $TARGET-ranlib" | patch GNUmakefile CXX=$TARGET-g++ RANLIB=$TARGET-ranlib AR=$TARGET-ar LDLIBS=-lws2_32 make -f GNUmakefile PREFIX=$BUILDDIR/tmp make -f GNUmakefile install
And finally aMule:
cd $BUILDDIR wget http://prdownloads.sourceforge.net/amule/aMule-2.2.5.tar.bz2 tar xjf aMule-2.2.5.tar.bz2 cd aMule-2.2.5 ./configure --host=$TARGET --with-zlib=$BUILDDIR/tmp --with-wx-prefix=$BUILDDIR/tmp --with-wx-config=$BUILDDIR/tmp/bin/wx-config --with-crypto-prefix=$BUILDDIR/tmp --prefix=$BUILDDIR/tmp make install
Copying everything together:
cd $BUILDDIR mkdir pkg cp /usr/$TARGET/bin/mingwm10.dll $BUILDDIR/pkg cp $BUILDDIR/tmp/lib/*.dll $BUILDDIR/pkg cp $BUILDDIR/tmp/bin/amule.exe $BUILDDIR/pkg
Testing:
cd $BUILDDIR/pkg wine amule
Stripping binaries:
It significantly reduces the binary sizes, but you will loose debug information! So don't do it if you need to send crash reports to the aMule developers.
Locate the cross-compile strip tool. It can be i486-mingw32-strip , i686-pc-mingw32-strip or similar depending on your distribution. Then :
cd $BUILDDIR/pkg i486-mingw32-strip amule