Introduction ------------ MinGW is short for the Minimalist GNU Windows. It's package which allows you to use GCC and other GNU tools to compile native windows programs. In this case "native" means programs which don't require extra DLLs like cygwin DLL. Mingw32 programs use DLLs supplied with all current Win32 platforms. Thus the programs are light weight and easy to distribute. This document describes by shell commands how to compile and install MinGW cross development tools on Unix host and how to use it for building windows version of xine. Download -------- MinGW packages: http://mingw.org/download.shtml 1) binutils (sources), binutils-build.sh 2) gcc-core, gcc-c++ (sources), gcc-build.sh 3) w32api, mingw-runtime (binaries and sources) DirectX headers (tested with version 7): http://www.google.com/search?hl=cs&q=win32-dx7headers.tgz http://www.google.com/search?q=dx7adxf.exe Pthread Win32: ftp://sources.redhat.com/pub/pthreads-win32/ zlib: http://www.zlib.net Build ----- In following text are used symbols $PREFIX and $USER with this meaning: $PREFIX .... directory of the mingw cross environtment $USER ...... current user 1. compile binutils tar xzf binutils-2.13.90-20030111-1-src.tar.gz mkdir bin cd bin ../binutils-2.13.90-20030111-1-src/configure \ --target=i386-mingw32 \ --prefix=$PREFIX make su make install exit 2. add $PREFIX/bin into PATH ... 3. compile compiler (gcc-core, gcc-c++) # # it's always good doing things under unprivileged user, # this commands ensure write permission to target # su chmod g+w $PREFIX{/lib,/i386-mingw32{/,/lib}} chown root:$USER $PREFIX{/lib,/i386-mingw32{/,/lib}} exit # # prepare runtime environment from binaries # mkdir runtime cd runtime tar xzf ../w32api-2.5.tar.gz tar xzf ../mingw-runtime-3.3.tar.gz cd .. # # compile and install the compiler # # if you'll want rerun this step, I recommend delete # $PREFIX/i386-mingw32/sys-include # tar xzf gcc-core-3.3.1-20030804-1-src.tar.gz tar xzf gcc-g++-3.3.1-20030804-1-src.tar.gz mkdir gcc-bin cd gcc-bin # more option may be needed for successfull compilation, # see gcc-3.3.1-1-build.sh ../gcc-3.3.1-20030804-1/configure \ --disable-shared \ --target=i386-mingw32 \ --with-headers=../runtime/include \ --with-libs=../runtime/lib \ --prefix=$PREFIX make #or recommended: make CFLAGS=-O2 LDFLAGS=-s su make install exit # # set the permissions back # su chmod -R g-w $PREFIX chown -R root:root $PREFIX exit 4. recompile w32api and mingw-runtime from sources (optional) # # installing must be into $PREFIX/i386-mingw32 # tar xzf w32api-2.5-src.tar.gz cd w32api-2.5 ./configure --prefix=$PREFIX/i386-mingw32 --host=i386-mingw32 make su make install exit # # installing must be into $PREFIX/i386-mingw32 # tar xzf mingw-runtime-3.3-src.tar.gz cd mingw-runtime-3.3 # copying w32api headers into ./include (because of a bug in runtime # package) ... # compiling CC=i386-mingw32-gcc \ DLLTOOL=i386-mingw32-dlltool \ AR=i386-mingw32-ar \ AS=i386-mingw32-as \ RANLIB=i386-mingw32-ranlib \ ./configure --prefix=$PREFIX/i386-mingw32 --target=i386-mingw32 make su make install exit 5. install DirectX headers and other libraries su cd $PREFIX/include # untar dx7headers.tar.gz (maybe to a subdirectory) ... exit 6. compile and install pthreads-win32 tar xzf pthreads-w32-2-7-0-release.tar.gz cd pthreads-w32-2-7-0-release/ make CROSS=i386-mingw32- PTHREAD_DEF=pthreadGC2.def clean GC # # possibility to use pthread library in M$ Visual C (optional) # mv pthread.def pthreadGC2.def wine LIB.EXE /machine:i386 /def:pthreadGC2.def su mkdir -p $PREFIX/pthreads-win32/bin mkdir -p $PREFIX/pthreads-win32/include mkdir -p $PREFIX/pthreads-win32/lib cp pthreadGC2.dll $PREFIX/pthreads-win32/bin/ cp libpthreadGC2.a pthreadGC2.lib $PREFIX/pthreads-win32/lib/ ln -s libpthreadGC2.a $PREFIX/pthreads-win32/lib/libpthread.a ln -s pthreadGC2.lib $PREFIX/pthreads-win32/lib/pthread.lib cp pthread.h semaphore.h sched.h $PREFIX/pthreads-win32/include/ exit 7. compile and install zlib tar xjf zlib-1.2.3.tar.bz2 cd zlib-1.2.3 # # small workaround in Makefile: # sed -e 's/dllwrap /i386-mingw32-dllwrap /g' win32/Makefile.gcc > Makefile make CC=i386-mingw32-gcc AR=i386-mingw32-ar RC=i386-mingw32-windres STATICLIB=libz-static.a IMPLIB=libz.a # # possibility to use zlib library in M$ Visual C (optional) # cp win32/zlib.def zlib1.def wine LIB.EXE /machine:i386 /def:zlib1.def su mkdir -p $PREFIX/zlib/{include,lib,bin} cp zconf.h zlib.h $PREFIX/zlib/include/ cp libz.a libz-static.a zlib1.lib $PREFIX/zlib/lib/ cp zlib1.dll $PREFIX/zlib/bin/ exit Using MinGW cross development tools ----------------------------------- Now we can build xine library for Windows by this way: # # configure for mingw cross compiling # (the build option is needed only for forcing cross compilation mode) # ./configure \ --host=i386-mingw32 \ --build=i686-debian-linux \ --disable-freetype \ --disable-vcd \ --with-dxheaders=$PREFIX/include/dx7headers \ --with-zlib-prefix=$PREFIX/zlib \ --with-pthread-prefix=$PREFIX/pthreads-win32 # # build system isn't fully prepared for cross compiling, so it's needed # manually or by patch disable plugins in Makefiles depending on wrongly # detected libraries # ... # # compile # make # # install # make install DESTDIR=/tmp/xine-lib-mingwcross rm /tmp/xine-lib-mingwcross/lib/xine/plugins/1.1.0{/,/post}/*.a # # if we want to use xine library in M$ compilers, we will need wine and some # tools from M$ Visual C: LIB.EXE, LINK.EXE, MSPDB60.DLL # # create libxine-1.lib file # cd /lib cp ../bin/libxine-1.dll . wine LIB.EXE /machine:i386 /def:libxine-1.def rm libxine-1.dll