The following build script works for me. It assumes you have a working msys/mingw install. Read comments for additional depends.
#!/bin/sh
# builds gstreamer, the base, good & ffmpeg plugin packs, and all the runtime deps *I* use, with MinGW/MSYS
# everything's targeted at /build, so make sure you don't have other stuff there in advance
# takes about 2h on a reasonably high-end box.
#prerequisites:
# need pkg-config in /mingw - http://www.gimp.org/~tml/gimp/win32/pkg-config-0.20.zip
# need glib in /mingw - http://ftp.gnome.org/pub/gnome/binaries/win32/glib/2.14/glib-2.14.5.zip
# need intl in /mingw - http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/gettext-runtime-0.17-1.zip
# need one more intl in /mingw - http://kent.dl.sourceforge.net/sourceforge/gnuwin32/libintl-0.14.4-bin.zip
# need iconv in /mingw - http://kent.dl.sourceforge.net/sourceforge/gnuwin32/libiconv-1.9.2-1-bin.zip
# need bison in /mingw - http://kent.dl.sourceforge.net/sourceforge/gnuwin32/bison-2.1-bin.zip
# need flex in /mingw - http://kent.dl.sourceforge.net/sourceforge/gnuwin32/flex-2.5.4a-1-bin.zip
# need bash 3 for msys, in / - http://kent.dl.sourceforge.net/sourceforge/mingw/bash-3.1-MSYS-1.0.11-1.tar.bz2
# need all the source tarballs for deps. base names listed at end of the script
# Want to edit this thing while it's running, and timing's handy as well
if [ -z "`echo $0 | grep tmp.bld.sh`" ]
then
cp -v $0 "`dirname $0`/tmp.bld.sh"
exec /bin/sh -c "time \"`dirname $0`/tmp.bld.sh\""
fi
basedir="`pwd`"
# Vista UAC heuristics is the worst piece of crap ever. "it's named install so it MUST run as admin"
[ -f /bin/ins.exe ] || cp /bin/install.exe /bin/ins.exe
export INSTALL="/bin/ins"
# Everything assumes you're installing to /build
# force-including one header just for the fun of it.
export CFLAGS="-I/build/include -I/mingw/include -mms-bitfields -include mingwstuff.h"
export PKG_CONFIG_PATH=/build/lib/pkgconfig
export CXXFLAGS="$CFLAGS"
export LDFLAGS="-Wl,--enable-runtime-pseudo-reloc -L/build/lib -L/mingw/lib"
export PATH="$PATH:/build/bin"
# mingw lacks some headers.... Probably a correct way of getting them, but this is easier.
if [ ! -f /mingw/include/alloca.h ]
then
echo '#ifndef allocaH' > /mingw/include/alloca.h
echo '#define allocaH' >> /mingw/include/alloca.h
echo '#include <stdlib.h>' >> /mingw/include/alloca.h
echo '#ifndef alloca' >> /mingw/include/alloca.h
echo 'void * alloca(int);' >> /mingw/include/alloca.h
echo '#endif' >> /mingw/include/alloca.h
echo '#endif' >> /mingw/include/alloca.h
fi
echo '#ifndef mingwstuffH' > /mingw/include/mingwstuff.h
echo '#define mingwstuffH' >> /mingw/include/mingwstuff.h
echo '#define HAVE_INLINE 1' >> /mingw/include/mingwstuff.h
echo '#define HAVE_ATEXIT 1' >> /mingw/include/mingwstuff.h
echo '#define SIZE_T_MAX 4294967295' >> /mingw/include/mingwstuff.h
echo '#endif' >> /mingw/include/mingwstuff.h
# print something, do it, and whine if it broke
check() {
echo $*
$*
if [ $? -gt 0 ]
then
echo "$* failed in `pwd`"
exit 1
fi
}
# find the tarball, unpack it and cd into the dir
prebuild() {
cd "$basedir"
fname=`find . -maxdepth 1 -type f -iname $1\* | sed 's,^./,,' | grep -e tar.bz2 -e tar.gz -e tbz2 -e tgz`
if [ ! -f "$fname" ]
then
echo "Couldn't find $1 sources"
exit 1
fi
libname="`echo $fname | sed -e 's,[.]tar.bz2$,,' -e 's,[.]tar.gz$,,' -e 's,[.]tgz$,,' -e 's,[.]tbz2$,,'`"
if [ -n "`echo $fname | grep -e 'bz2$'`" ]
then
tarflags="j"
else
tarflags="z"
fi
if [ -d "$libname" ]
then
echo "$libname exists. rm it."
exit 1
fi
check tar ${tarflags}xf $fname
check cd $libname
}
# enable shared/static if supported
doconf() {
if [ -n "`./configure --help | grep enable-shared`" ]
then
f1="--enable-shared"
fi
if [ -n "`./configure --help | grep enable-static`" ]
then
f2="--enable-static"
fi
check ./configure --prefix=/build $f1 $f2 $*
}
# just call the passed patchfunction if it's not --
dopatch() {
if [ -n "$1" ]
then
$1
if [ $? -gt 0 ]
then
echo "patches failed: $1"
exit 1
fi
fi
}
#
dobuild() {
check make
}
#
doinstall() {
check make install
}
# condbuild file-to-test-for tarball-prefix patchfunction configure-options
# build the specified lib unless the specified testfile exists in /build/lib
condbuild() {
testfile="$1"
lib="$2"
patchfunc="$3"
shift
shift
shift
if [ ! -f "/build/lib/$testfile" ]
then
echo -ne "\033];$lib\007"
prebuild $lib
doconf $*
[ "$patchfunc" = "--" ] || dopatch "$patchfunc"
dobuild
doinstall
fi
}
#big ugly hack, the sed script in this file doesn't work with mingw sed so I hardcoded the versions
libiconvpatch() {
check cp -v $basedir/libiconv.windows.windres-options windows/windres-options
}
# gettext wants to link with atexit.c, for some reason it thinks we're on Sun and have on_exit
gettextpatch() {
cat gettext-tools/gnulib-lib/Makefile | sed -r 's,atexit[.][col]+,,' > gettext-tools/gnulib-lib/Makefile.tmp && mv gettext-tools/gnulib-lib/Makefile.tmp gettext-tools/gnulib-lib/Makefile
}
# vorbis should preferrably link to ogg
vorbispatch() {
cat lib/Makefile |
sed 's,libvorbisfile_la_LDFLAGS =,libvorbisfile_la_LDFLAGS = -logg ,' |
sed 's,libvorbisenc_la_LDFLAGS =,libvorbisenc_la_LDFLAGS = -logg ,' > lib/Makefile.tmp &&
mv lib/Makefile.tmp lib/Makefile
}
# fixing some obvious bugs in liboilcpu, such as e.g. a bare #elif (do they even build before release?)
# disabling the unguarded sig* use in liboilcpu
# disabling SSE and turning off the sse stack alignment wrapper which is broken
# disabling the jpeg test, it's broken
# most of these have been filed with liboil's bugtracker
oilpatch() {
cat liboil/sse/sse_wrapper.h |
sed 's,USE_SSE_WRAPPER,USE_SSE_WRAPPER_NOT,g' > liboil/sse/sse_wrapper.h.tmp &&
mv liboil/sse/sse_wrapper.h.tmp liboil/sse/sse_wrapper.h
cat liboil/liboilcpu.c |
sed -r -e 's,(sigset_t set;),//\1,' -e 's,(sigemptyset .&set.;),//\1,' \
-e 's,(sigaddset .&set. SIGILL.;),//\1,' \
-e 's,(sigprocmask .SIG_UNBLOCK. &set. NULL.;),//\1,' \
-e 's,^#elif$,#else,' \
-e 's,return _oil_ticks_per_second,return 1,' \
-e '/which might cause problems".*/n;s/#if 0/#if 1/' > liboil/liboilcpu.c.tmp && mv liboil/liboilcpu.c.tmp liboil/liboilcpu.c
cat examples/Makefile | sed 's,SUBDIRS = jpeg,SUBDIRS = ,' > examples/Makefile.tmp && mv examples/Makefile.tmp examples/Makefile
}
# sdp requires getaddrinfo/freeaddrinfo which aren't around in mingw.
gstbasepatch() {
cat gst-libs/gst/Makefile | grep -v 'sdp \\' > gst-libs/gst/Makefile.tmp && mv gst-libs/gst/Makefile.tmp gst-libs/gst/Makefile
}
# disable mmx, doesn't build. I'll live with the C implementation.
# define random/srandom as rand/srand, and turn off the "(s)rand is forbidden" stuff
gstffmpegpatch() {
for f in configure configure.ac
do
cat gst-libs/ext/ffmpeg/$f | sed 's,HAVE_MMX=yes,HAVE_MMX=no,g' > gst-libs/ext/ffmpeg/$f.tmp && mv gst-libs/ext/ffmpeg/$f.tmp gst-libs/ext/ffmpeg/$f
done
cat gst-libs/ext/ffmpeg/libavutil/internal.h | sed -e 's,#define rand ,#define random rand //#define rand ,g' -e 's,#define srand ,#define srandom srand//#define srand ,g' > gst-libs/ext/ffmpeg/libavutil/internal.h.tmp && mv gst-libs/ext/ffmpeg/libavutil/internal.h.tmp gst-libs/ext/ffmpeg/libavutil/internal.h
}
condbuild libz.a zlib
condbuild libpng.a libpng
condbuild libiconv.a libiconv libiconvpatch
condbuild libxml2.a libxml2 -- --without-ftp --without-http --without-python
condbuild libgettextpo.a gettext gettextpatch --enable-threads=win32 --enable-nls --disable-java --disable-native-java --disable-rpath --enable-relocatable --disable-openmp --with-included-glib --with-included-gettext --with-included-libcroco --without-emacs
condbuild libglib-2.0.la glib -- --enable-debug=no
condbuild libogg.a libogg
condbuild libvorbis.a libvorbis vorbispatch
condbuild libtheora.a libtheora -- --disable-examples
condbuild libFLAC.a flac
condbuild libspeex.a speex
condbuild libao.a libao
condbuild liboil-0.3.a liboil oilpatch
condbuild libgstreamer-0.10.a gstreamer -- --disable-rpath --disable-nls --enable-registry --enable-enumtypes --disable-net --disable-debug --disable-examples --enable-tests --enable-failing-tests --enable-largefile
condbuild libgstfft-0.10.a gst-plugins-base gstbasepatch --disable-rpath --disable-nls --disable-examples --disable-x --disable-xvideo --disable-xshm --disable-gst_v4l --disable-alsa --disable-gnome_vfs --disable-libvisual --disable-pango --disable-freetypetest --disable-cdparanoia
condbuild libgstvideo-0.10.a gst-plugins-good -- --disable-rpath --disable-nls --disable-examples --disable-gconftool --disable-oss --disable-sunaudio --disable-osx_audio --disable-osx_video --disable-gst_v4l2 --disable-x --disable-xshm --disable-xvideo --disable-aalib --disable-aalibtest --disable-cairo --disable-esd --disable-esdtest --disable-gconf --disable-gdk_pixbuf --disable-libcaca --disable-dv1394 --disable-shout2 --disable-shout2test
condbuild libgstfft-0.10.a gst-ffmpeg gstffmpegpatch
And here's the libiconv.windows.windres-options file
#!/bin/sh
escape=
if test "$1" = "--escape"; then
escape=yes
shift
fi
{
echo "-DPACKAGE_VERSION_STRING=\"1.12\""
echo "-DPACKAGE_VERSION_MAJOR=1"
echo "-DPACKAGE_VERSION_MINOR=12"
echo "-DPACKAGE_VERSION_SUBMINOR=0"
} |
{
if test -n "$escape"; then
sed -e 's,\(["\\]\),\\\1,g'
else
cat
fi
}

