#!/bin/bash
# 
# Build Xvnc with Xorg from git master. Script adapted from http://www.x.org/wiki/Development/git
#

set -e

PREFIX="/tmp/xorg-git-${USER}"
PKG_CONFIG_PATH=${PREFIX}/lib/pkgconfig
MAKE="make"
REPOS="\
git://git.freedesktop.org/git/xorg/util/macros \
git://git.freedesktop.org/git/xorg/proto/x11proto \
git://git.freedesktop.org/git/xorg/proto/damageproto \
git://git.freedesktop.org/git/xorg/proto/xextproto \
git://git.freedesktop.org/git/xorg/proto/fontsproto \
git://git.freedesktop.org/git/xorg/proto/videoproto \
git://git.freedesktop.org/git/xorg/proto/renderproto \
git://git.freedesktop.org/git/xorg/proto/inputproto \
git://git.freedesktop.org/git/xorg/proto/xf86vidmodeproto \
git://git.freedesktop.org/git/xorg/proto/xf86dgaproto \
git://git.freedesktop.org/git/xorg/proto/xf86driproto \
git://git.freedesktop.org/git/xorg/proto/xcmiscproto \
git://git.freedesktop.org/git/xorg/proto/scrnsaverproto \
git://git.freedesktop.org/git/xorg/proto/bigreqsproto \
git://git.freedesktop.org/git/xorg/proto/resourceproto \
git://git.freedesktop.org/git/xorg/proto/compositeproto \
git://git.freedesktop.org/git/xorg/proto/fixesproto \
git://git.freedesktop.org/git/xorg/proto/evieproto \
git://git.freedesktop.org/git/xorg/proto/kbproto \
git://git.freedesktop.org/git/xorg/lib/libxtrans \
git://git.freedesktop.org/git/xorg/lib/libX11 \
git://git.freedesktop.org/git/xorg/lib/libXext \
git://git.freedesktop.org/git/xorg/lib/libxkbfile \
git://git.freedesktop.org/git/xorg/lib/libfontenc \
git://git.freedesktop.org/git/xorg/lib/libXfont \
git://git.freedesktop.org/git/xorg/lib/libXfixes \
git://git.freedesktop.org/git/xorg/lib/libXdamage \
git://git.freedesktop.org/git/xorg/lib/libXv \
git://git.freedesktop.org/git/xorg/lib/libXvMC \
git://git.freedesktop.org/git/xorg/lib/libXxf86vm \
git://git.freedesktop.org/git/xorg/lib/libXinerama \
git://git.freedesktop.org/git/xorg/proto/dri2proto \
git://git.freedesktop.org/git/xorg/proto/glproto \
git://git.freedesktop.org/git/xorg/lib/libpciaccess \
git://git.freedesktop.org/git/pixman \
git://git.freedesktop.org/git/xcb/proto \
git://git.freedesktop.org/git/xcb/pthread-stubs \
git://git.freedesktop.org/git/xcb/libxcb \
git://git.freedesktop.org/git/xorg/proto/randrproto \
git://git.freedesktop.org/git/mesa/drm \
git://git.freedesktop.org/git/mesa/mesa \
git://git.freedesktop.org/git/xorg/xserver \
git://git.freedesktop.org/git/xorg/driver/xf86-input-mouse \
git://git.freedesktop.org/git/xorg/driver/xf86-input-keyboard \
git://git.freedesktop.org/git/xorg/driver/xf86-video-intel"

modules="\
fontsproto \
x11proto \
xextproto \
videoproto \
renderproto \
inputproto \
damageproto \
xf86vidmodeproto \
xf86dgaproto \
xf86driproto \
xcmiscproto \
scrnsaverproto \
bigreqsproto \
resourceproto \
compositeproto \
resourceproto \
evieproto \
kbproto \
fixesproto \
libxtrans \
proto \
pthread-stubs \
libxcb \
libX11 \
libXext \
libxkbfile \
libfontenc \
libXfont \
libXv \
libXvMC \
libXxf86vm \
libXfixes \
libXdamage \
dri2proto \
glproto \
libpciaccess \
pixman \
randrproto"

init()
{
    mv xserver xserver.vnc
    for repo in $REPOS; do
        echo "Cloning $repo";
        git clone $repo || true
    done
    mv xserver xserver.xorg
    mv xserver.vnc xserver

    tar c -C xserver.xorg . | tar x -C xserver
    cd xserver
    patch -p1 < ../xserver16.patch
    autoreconf -fiv
    cd ..

    cd macros
    echo "Building macros"
    ./autogen.sh --prefix="$PREFIX";
    ($MAKE);
    make install
    cd ..
}

update_modules()
{
    for module in $modules; do
        cd $module
        git pull
        cd ..
    done
}

build ()
{
    export ACLOCAL="aclocal -I $PREFIX/share/aclocal"
    export PKG_CONFIG_PATH="$PREFIX/lib/pkgconfig"

    # Build VNC
    make distclean || true
    ./configure --prefix=${PREFIX}
    make

    # Build Xorg
    for i in $modules; do
        cd $i
        echo ======================
        echo configuring $i
        echo ======================
        ./autogen.sh --prefix="$PREFIX";
        echo ======================
        echo building $i
        echo ======================
        if [ $? -ne 0 ]; then
                echo "Failed to configure $i."
                exit
        fi
        ($MAKE);
        make install
        cd ..
    done

    # build drm
    cd drm
    ./autogen.sh --prefix="$PREFIX"
    ($MAKE)
    make -C linux-core
    # assuming you're on Linux, otherwise use bsd-core
    make install
    cd ..

    # build mesa
    cd mesa
    ./autogen.sh --prefix=$PREFIX --with-driver=dri --disable-glut
    if [ $? -ne 0 ]; then
	echo "Failed to configure Mesa."
	exit
    fi
    ($MAKE)
    make install
    cd ..

    # build xserver
    cd xserver
    ./autogen.sh --prefix=$PREFIX --disable-xinerama --disable-xvfb --disable-xnest --disable-xorg
    if [ $? -ne 0 ]; then
	echo "Failed to configure X server."
	exit
    fi
    ($MAKE)
    make install
    cd ..
}

case "$1" in
    init)
	init
	;;
    build)
	build
	;;
    update)
	update_modules
	;;
    *)
	echo "Usage: $0 init | build | update"
	exit 3
esac
