#!/bin/bash
##
##  Copyright (c) 2010 The VP8 project authors. All Rights Reserved.
##
##  Use of this source code is governed by a BSD-style license 
##  that can be found in the LICENSE file in the root of the source
##  tree. An additional intellectual property rights grant can be found
##  in the file PATENTS.  All contributing project authors may 
##  be found in the AUTHORS file in the root of the source tree.
##



self=$0

for opt; do
    case $opt in
        --clean) clean=yes;;
        -j*) jopt=$opt;;
        *) echo "Unsupported option $opt"; exit 1;;
    esac
done

TAB=$'\t'
cat > release.mk << EOF
%\$(BUILD_SFX).tar.bz2: %/.done
${TAB}@echo "\$(subst .tar.bz2,,\$@): tarball"
${TAB}@cd \$(dir \$<); tar -cf - \$(subst .tar.bz2,,\$@) | bzip2 > ../\$@

%\$(BUILD_SFX).zip: %/.done
${TAB}@echo "\$(subst .zip,,\$@): zip"
${TAB}@rm -f \$@; cd \$(dir \$<); zip -rq ../\$@ \$(subst .zip,,\$@)

logs/%\$(BUILD_SFX).log.bz2: %/.done
${TAB}@echo "\$(subst .log.bz2,,\$(notdir \$@)): tarlog"
${TAB}@mkdir -p logs
${TAB}@cat \$< | bzip2 > \$@

%/.done:
${TAB}@mkdir -p \$(dir \$@)
${TAB}@echo "\$(dir \$@): configure \$(CONFIG_OPTS) \$(EXTRA_PATH)"
${TAB}@cd \$(dir \$@); export PATH=\$\$PATH\$(EXTRA_PATH); ../\$(SRC_ROOT)/configure \$(CONFIG_OPTS) >makelog.txt 2>&1
${TAB}@echo "\$(dir \$@): make"
${TAB}@cd \$(dir \$@); PATH=\$\$PATH\$(EXTRA_PATH) \$(MAKE) >>makelog.txt 2>&1
${TAB}@echo "\$(dir \$@): test install"
${TAB}@cd \$(dir \$@); PATH=\$\$PATH\$(EXTRA_PATH) \$(MAKE) install >>makelog.txt 2>&1
${TAB}@cd \$(dir \$@)/dist/build; PATH=\$\$PATH\$(EXTRA_PATH) \$(MAKE) >>makelog.txt 2>&1
${TAB}@echo "\$(dir \$@): install"
${TAB}@cd \$(dir \$@); PATH=\$\$PATH\$(EXTRA_PATH) \$(MAKE) install DIST_DIR=\$(TGT) >>makelog.txt 2>&1
${TAB}@touch \$@

#include release-deps.mk
EOF

#[ -f release-deps.mk ] || \
#    find ${self%/*} -name .git -prune -o -type f -print0 \
#    | xargs -0 -n1 echo \
#    | sed -e 's; ;\\ ;g' | awk '{print "$(TGT)/.done: "$0}' > release-deps.mk

build_config_list() {
    for codec in $CODEC_LIST; do
        for arch in $ARCH_LIST; do
            if [ -n "$OS_LIST" ]; then
                for os in $OS_LIST; do
                    CONFIGS="$CONFIGS vpx-${codec}-${arch}-${os}"
                done
            else
                CONFIGS="$CONFIGS vpx-${codec}-${arch}"
            fi
        done
    done
}

CODEC_LIST="vp8 vp8cx vp8dx"
case `uname` in
    Linux*)
        ARCH_LIST="x86 x86_64"
        OS_LIST="linux"
        build_config_list
        ARCH_LIST="armv5te armv6 armv7"
        OS_LIST="linux-gcc"

        ;;
    CYGWIN*)
        TAR_SFX=.zip
        for vs in vs7 vs8; do
            for arch in x86-win32 x86_64-win64; do
                for msvcrt in md mt; do
                    case $vs,$arch in
                        vs7,x86_64-win64) continue ;;
                    esac
                    ARCH_LIST="$ARCH_LIST ${arch}${msvcrt}-${vs}"
                done
            done
        done
        ;;
    Darwin*)
        ARCH_LIST="universal"
        OS_LIST="darwin8 darwin9"
        ;;
    sun_os*)
        ARCH_LIST="x86 x86_64"
        OS_LIST="solaris"
        ;;
esac
build_config_list

TAR_SFX=${TAR_SFX:-.tar.bz2}
ARM_TOOLCHAIN=/usr/local/google/csl-2009q3-67
for cfg in $CONFIGS; do
    full_cfg=$cfg
    cfg=${cfg#vpx-}
    opts=
    rm -f makelog.txt

    case $cfg in
        src-*)  opts="$opts --enable-codec-srcs"
                cfg=${cfg#src-}
                ;;
        eval-*) opts="$opts --enable-eval-limit"
                cfg=${cfg#src-}
                ;;
    esac

    case $cfg in
        #
        # Linux
        #
        *x86-linux)
            opts="$opts --target=x86-linux-gcc" ;;
        *x86_64-linux)
            opts="$opts --target=x86_64-linux-gcc" ;;
        *arm*-linux-gcc)
            armv=${cfg##*armv}
            armv=${armv%%-*}
            opts="$opts --target=armv${armv}-linux-gcc" ;;
        *arm*-linux-rvct)
            armv=${cfg##*armv}
            armv=${armv%%-*}
            opts="$opts --target=armv${armv}-linux-rvct"
            opts="$opts --libc=${ARM_TOOLCHAIN}/arm-none-linux-gnueabi/libc" ;;


        #
        # Windows
        #
        # need --enable-debug-libs for now until we're smarter about
        # building the debug/release from the customer installed
        # environment
        *-x86-win32*-vs*)
            opts="$opts --target=x86-win32-vs${cfg##*-vs} --enable-debug-libs";;
        *-x86_64-win64*-vs8)
            opts="$opts --target=x86_64-win64-vs8 --enable-debug-libs" ;;

        #
        # Darwin
        #
        *-universal-darwin*)
            opts="$opts --target=universal-darwin${cfg##*-darwin}-gcc" ;;

        #
        # Solaris
        #
        *x86-solaris)
            opts="$opts --target=x86-solaris-gcc" ;;
        *x86_64-solaris)
            opts="$opts --target=x86_64-solaris-gcc" ;;
    esac

    case $cfg in
        *x86-linux | *x86-solaris) opts="$opts --enable-pic" ;;
    esac

    case $cfg in
        *-win[36][24]mt*)  opts="$opts --enable-static-msvcrt" ;;
        *-win[36][24]md*)  opts="$opts --disable-static-msvcrt" ;;
    esac

    opts="$opts --disable-codecs"
    case $cfg in
        vp8*) opts="$opts --enable-vp8" ;;
    esac
    case $cfg in
        *cx-*) opts="${opts}-encoder" ;;
        *dx-*) opts="${opts}-decoder" ;;
    esac
    opts="$opts --enable-postproc"

    [ "x${clean}" == "xyes" ] \
        && rm -rf ${full_cfg}${BUILD_SFX}${TAR_SFX} \
        && rm -rf logs/${full_cfg}${BUILD_SFX}.log.bz2

    TGT=${full_cfg}${BUILD_SFX}
    BUILD_TARGETS="logs/${TGT}.log.bz2 ${TGT}${TAR_SFX}"
    echo "${BUILD_TARGETS}: CONFIG_OPTS=$opts" >>release.mk
    echo "${BUILD_TARGETS}: TGT=${TGT}" >>release.mk
    case $cfg in
        *-arm*-linux-*)
            echo "${BUILD_TARGETS}: EXTRA_PATH=:${ARM_TOOLCHAIN}/bin/" >>release.mk ;;
        *-vs7)
            echo "${BUILD_TARGETS}: EXTRA_PATH=:/cygdrive/c/Program\ Files/Microsoft\ Visual\ Studio\ .NET\ 2003/Common7/IDE" >>release.mk ;;
        *-vs8)
            echo "${BUILD_TARGETS}: EXTRA_PATH=:/cygdrive/c/Program\ Files/Microsoft\ Visual\ Studio\ 8/Common7/IDE" >>release.mk ;;
    esac
    MAKE_TGTS="$MAKE_TGTS ${TGT}${TAR_SFX} logs/${TGT}.log.bz2"
done


${MAKE:-make} ${jopt:--j3} -f release.mk  \
    SRC_ROOT=${self%/*} BUILD_SFX=${BUILD_SFX} ${MAKE_TGTS}
