#!/bin/sh
#############################################################################
##
## Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
## All rights reserved.
## Contact: Nokia Corporation (qt-info@nokia.com)
##
## This file is part of the Qt Components project.
##
## $QT_BEGIN_LICENSE:BSD$
## You may use this file under the terms of the BSD license as follows:
##
## "Redistribution and use in source and binary forms, with or without
## modification, are permitted provided that the following conditions are
## met:
##   * Redistributions of source code must retain the above copyright
##     notice, this list of conditions and the following disclaimer.
##   * Redistributions in binary form must reproduce the above copyright
##     notice, this list of conditions and the following disclaimer in
##     the documentation and/or other materials provided with the
##     distribution.
##   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
##     the names of its contributors may be used to endorse or promote
##     products derived from this software without specific prior written
##     permission.
##
## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
## $QT_END_LICENSE$
##
#############################################################################

BUILD_TREE=`/bin/pwd`
SOURCE_TREE=`dirname $0`
SOURCE_TREE=`cd "$SOURCE_TREE"; /bin/pwd`

INSTALL_PREFIX=/usr
INSTALL_SYSCONFDIR=/etc

BUILD_MEEGO_STYLE=no
BUILD_FREMANTLE_STYLE=no
BUILD_SYMBIAN_STYLE=no
BUILD_DEMOS=no
BUILD_EXAMPLES=yes
BUILD_EXTRAS=yes
BUILD_TRANSLATIONS=yes
BUILD_TESTS=no
BUILD_CSSU=no
HAVE_MEEGOTOUCH=no
HAVE_MALIIT_FRAMEWORK=no
HAVE_XDAMAGE=no
HAVE_XRANDR=no
HAVE_CONTEXTSUBSCRIBER=no
HAVE_MEEGOGRAPHICSSYSTEM=no
HAVE_SHADER=no
HAVE_THEMEDAEMON_PROTOCOL_V1=yes
FORCE_LOCAL_THEME=no
DEFAULT_THEME="blanco"
HAVE_MOBILITY=auto
HAVE_SYMBIAN_INTERNAL=no
HAVE_GCONF=no
QMAKE_CONFIG=
QMAKE_DEBUG=
OPT_HELP=no

if [ -z "$QTDIR" ]; then
    QMAKE=`which qmake` 2> /dev/null
fi
if [ ! -f "$QMAKE" ]; then
    QMAKE=$QTDIR/bin/qmake
    if [ ! -f $QMAKE ]; then
        echo "ERROR: Unable to find qmake. Try QTDIR=/path/to/qt $0."
        exit 1
    fi
fi

QMAKE_CACHE=$BUILD_TREE/.qmake.cache
[ -f $QMAKE_CACHE ] && rm -f $QMAKE_CACHE

QMAKEFEATURES=$SOURCE_TREE/features
[ ! -d "$BUILD_TREE/features" ] && mkdir "$BUILD_TREE/features"

CONFIG_PRF="$BUILD_TREE/features/qt-components-config.prf"
[ -f $CONFIG_PRF ] && rm -f $CONFIG_PRF

# Test for pkg-config enabled dependencies
which pkg-config > /dev/null
if [ $? -eq 0 ]; then
    pkg-config --exists meegotouch && HAVE_MEEGOTOUCH=yes
    pkg-config --exists maliit-1.0 && HAVE_MALIIT_FRAMEWORK=yes
    pkg-config --atleast-version=0.5.25 contextsubscriber-1.0 && HAVE_CONTEXTSUBSCRIBER=yes
    pkg-config --exists xdamage && HAVE_XDAMAGE=yes
    pkg-config --exists xrandr && HAVE_XRANDR=yes
    pkg-config --exists gconf-2.0 && HAVE_GCONF=yes
fi

#-------------------------------------------------------------------------------
# parse command line arguments
#-------------------------------------------------------------------------------

# parse the arguments, setting things to "yes" or "no"
while [ "$#" -gt 0 ]; do
    CURRENT_OPT="$1"
    UNKNOWN_ARG=no
    case "$1" in
    #Qt style no options
    -no-*)
        VAR=`echo $1 | sed 's,^-no-\(.*\),\1,'`
        VAL=no
        ;;
    #Qt style yes options
    -meego|-fremantle|-symbian|-meegotouch|-maliit|-contextsubscriber|-xdamage|-xrandr|-meegographicssystem|-shader|-force-local-theme|-mobility)
        VAR=`echo $1 | sed 's,^-\(.*\),\1,'`
        VAL=yes
        ;;
    -prefix|-sysconfdir|-theme)
        VAR=`echo $1 | sed 's,^-\(.*\),\1,'`
        shift
        VAL="$1"
        ;;
    -*)
        VAR=`echo $1 | sed 's,^-\(.*\),\1,'`
        VAL=unknown
        ;;
    *)
        UNKNOWN_ARG=yes
        ;;
    esac
    if [ "$UNKNOWN_ARG" = "yes" ]; then
        echo "$1: unknown argument"
        OPT_HELP=yes
        ERROR=yes
        shift
        continue
    fi
    shift

    UNKNOWN_OPT=no
    case "$VAR" in
    prefix)
        INSTALL_PREFIX=$VAL
        ;;
    sysconfdir)
	INSTALL_SYSCONFDIR=$VAL
	;;
    theme)
	DEFAULT_THEME=$VAL
	;;
    meego)
        BUILD_MEEGO_STYLE=yes
        ;;
    fremantle)
        BUILD_FREMANTLE_STYLE=yes
        ;;
    force-local-theme)
        FORCE_LOCAL_THEME=yes
	HAVE_THEMEDAEMON_PROTOCOL_V1=yes
        ;;
    symbian)
        BUILD_SYMBIAN_STYLE=yes
        ;;
    symbian-internal)
        HAVE_SYMBIAN_INTERNAL=yes
        ;;
    nomake)
        case "$1" in
        demos)
            BUILD_DEMOS=no
            shift
            ;;
        examples)
            BUILD_EXAMPLES=no
            shift
            ;;
        extras)
            BUILD_EXTRAS=no
            shift
            ;;
        tests)
            BUILD_TESTS=no
            shift
            ;;
        cssu)
            BUILD_CSSU=no
            shift
            ;;
        *)
            CURRENT_OPT="$1"
            UNKNOWN_OPT=yes
            ;;
        esac
        ;;
    make)
        case "$1" in
        demos)
            BUILD_DEMOS=yes
            ;;
        examples)
            BUILD_EXAMPLES=yes
            ;;
        extras)
            BUILD_EXTRAS=yes
            ;;
        tests)
            BUILD_TESTS=yes
            ;;
        cssu)
            BUILD_CSSU=yes
            ;;
        *)
            CURRENT_OPT="$1"
            UNKNOWN_OPT=yes
            ;;
        esac
        shift
        ;;
    config)
        QMAKE_CONFIG="$QMAKE_CONFIG $1"
        shift
        ;;
    d)
        QMAKE_DEBUG="$QMAKE_DEBUG -d"
        ;;
    # autodetection overrides
    meegotouch)
        if [ "$VAL" = "yes" ] || [ "$VAL" = "no" ]; then
            HAVE_MEEGOTOUCH=$VAL
        else
            UNKNOWN_OPT=yes
        fi
        ;;
    gconf)
        if [ "$VAL" = "yes" ] || [ "$VAL" = "no" ]; then
            HAVE_GCONF=$VAL
        else
            UNKNOWN_OPT=yes
        fi
        ;;
    maliit)
        if [ "$VAL" = "yes" ] || [ "$VAL" = "no" ]; then
            HAVE_MALIIT_FRAMEWORK=$VAL
        else
            UNKNOWN_OPT=yes
        fi
        ;;
    contextsubscriber)
        if [ "$VAL" = "yes" ] || [ "$VAL" = "no" ]; then
            HAVE_CONTEXTSUBSCRIBER=$VAL
        else
            UNKNOWN_OPT=yes
        fi
        ;;
    meegographicssystem)
        if [ "$VAL" = "yes" ] || [ "$VAL" = "no" ]; then
            HAVE_MEEGOGRAPHICSSYSTEM=$VAL
        else
            UNKNOWN_OPT=yes
        fi
        ;;
    xdamage)
        if [ "$VAL" = "yes" ] || [ "$VAL" = "no" ]; then
            HAVE_XDAMAGE=$VAL
        else
            UNKNOWN_OPT=yes
        fi
        ;;
    xrandr)
        if [ "$VAL" = "yes" ] || [ "$VAL" = "no" ]; then
            HAVE_XRANDR=$VAL
        else
            UNKNOWN_OPT=yes
        fi
        ;;
    shader)
        if [ "$VAL" = "yes" ] || [ "$VAL" = "no" ]; then
            HAVE_SHADER=$VAL
        else
            UNKNOWN_OPT=yes
        fi
        ;;
    mobility)
        if [ "$VAL" = "yes" ] || [ "$VAL" = "no" ]; then
            HAVE_MOBILITY=$VAL
        else
            UNKNOWN_OPT=yes
        fi
        ;;
    *)
        UNKNOWN_OPT=yes
        ;;
    esac
    if [ "$UNKNOWN_OPT" = "yes" ]; then
        echo "${CURRENT_OPT}: unknown option"
        OPT_HELP=yes
        ERROR=yes
    fi
done

if [ "$OPT_HELP" = "yes" ]; then
    cat << EOF
Usage:  configure [-meego] [-fremantle] [-symbian] [-config <config>]
    [-make <part>] [-nomake <part>] [-help]

Configure options:

    -meego ................... Build MeeGo Style
    -fremantle ............... Build Maemo Fremantle Style
    -symbian ................. Build Symbian Style
    -config (config) ......... Configuration options recognized by qmake
    -make (part) ............. Add part to the list of parts to be built at
                               make time (available parts: demos examples extras tests)
    -nomake (part) ........... Exclude part from the list of parts to be built

Additional options:

 A plus (+) denotes a default value that needs to be evaluated. If the
 evaluation succeeds, the feature is included. Here is a short explanation
 of each option:

    -no-meegotouch ........... Do not compile MeeGo Touch framework support
 +  -meegotouch .............. Compile MeeGo Touch framework support

    -no-maliit ............... Do not compile Maliit IM framework support
 +  -maliit .................. Compile Maliit IM framework support

    -no-contextsubscriber .... Do not compile Context Subscriber support
 +  -contextsubscriber ....... Compile Context Subscriber support

    -no-xdamage .............. Do not compile XDamage support
 +  -xdamage ................. Compile XDamage support

    -no-meegographicssystem .. Do not compile MeeGo graphics system support
    -meegographicssystem ..... Compile MeeGo graphics system support

    -no-mobility ............. Do not compile Qt Mobility support
 +  -mobility ................ Compile Qt Mobility support

EOF
    [ "x$ERROR" = "xyes" ] && exit 1
    exit 0
fi

[ "$BUILD_MEEGO_STYLE" = "yes" ] && QMAKE_CONFIG="$QMAKE_CONFIG meego"
[ "$BUILD_FREMANTLE_STYLE" = "yes" ] && QMAKE_CONFIG="$QMAKE_CONFIG fremantle"
[ "$BUILD_SYMBIAN_STYLE" = "yes" ] && QMAKE_CONFIG="$QMAKE_CONFIG symbian3"
[ "$BUILD_DEMOS" = "yes" ] && QMAKE_CONFIG="$QMAKE_CONFIG demos"
[ "$BUILD_EXAMPLES" = "yes" ] && QMAKE_CONFIG="$QMAKE_CONFIG examples"
[ "$BUILD_EXTRAS" = "yes" ] && QMAKE_CONFIG="$QMAKE_CONFIG extras"
[ "$BUILD_TRANSLATIONS" = "yes" ] && QMAKE_CONFIG="$QMAKE_CONFIG i18n"
[ "$BUILD_TESTS" = "yes" ] && QMAKE_CONFIG="$QMAKE_CONFIG tests"
[ "$BUILD_CSSU" = "yes" ] && [ "$BUILD_FREMANTLE_STYLE" = "yes" ] && QMAKE_CONFIG="$QMAKE_CONFIG cssu"

[ "$HAVE_MALIIT_FRAMEWORK" = "yes" ] && [ "$BUILD_FREMANTLE_SYLE" = "yes" ] && HAVE_MEEGOTOUCH="no"
[ "$HAVE_MEEGOTOUCH" = "yes" ] && [ "$BUILD_MEEGO_SYLE" = "yes" ] && HAVE_MALIIT_FRAMEWORK="no"

[ "$HAVE_MEEGOTOUCH" = "yes" ] && QMAKE_CONFIG="$QMAKE_CONFIG meegotouch"
[ "$HAVE_MALIIT_FRAMEWORK" = "yes" ] && QMAKE_CONFIG="$QMAKE_CONFIG maliit"
[ "$HAVE_CONTEXTSUBSCRIBER" = "yes" ] && QMAKE_CONFIG="$QMAKE_CONFIG contextsubscriber"
[ "$HAVE_MEEGOGRAPHICSSYSTEM" = "yes" ] && QMAKE_CONFIG="$QMAKE_CONFIG meegographicssystem"
[ "$HAVE_THEMEDAEMON_PROTOCOL_V1" = "yes" ] && QMAKE_CONFIG="$QMAKE_CONFIG themedaemonprotocolv1"
[ "$HAVE_SHADER" = "yes" ] && QMAKE_CONFIG="$QMAKE_CONFIG shader"
[ "$HAVE_XDAMAGE" = "yes" ] && QMAKE_CONFIG="$QMAKE_CONFIG xdamage"
[ "$HAVE_XRANDR" = "yes" ] && QMAKE_CONFIG="$QMAKE_CONFIG xrandr"
[ "$FORCE_LOCAL_THEME" = "yes" ] && QMAKE_CONFIG="$QMAKE_CONFIG force-local-theme"
[ "$FORCE_LOCAL_THEME" = "yes" ] && [ "$HAVE_GCONF" = "yes" ] && QMAKE_CONFIG="$QMAKE_CONFIG gconf"
[ "$HAVE_MOBILITY" = "yes" ] && QMAKE_CONFIG="$QMAKE_CONFIG mobility"
[ "$HAVE_MOBILITY" = "no" ] && QMAKE_CONFIG="$QMAKE_CONFIG no_mobility"

[ "$HAVE_SYMBIAN_INTERNAL" = "yes" ] && QMAKE_CONFIG="$QMAKE_CONFIG symbian_internal"

echo "CONFIG +=$QMAKE_CONFIG" > $CONFIG_PRF
echo "Q_COMPONENTS_SOURCE_TREE = $SOURCE_TREE" > $QMAKE_CACHE
echo "Q_COMPONENTS_BUILD_TREE = $BUILD_TREE" >> $QMAKE_CACHE
echo "Q_COMPONENTS_VERSION = 10" >> $QMAKE_CACHE

echo
echo "Running qmake..."

QMAKEFEATURES=$QMAKEFEATURES $QMAKE $QMAKE_DEBUG -r "CONFIG+=$QMAKE_CONFIG" $SOURCE_TREE/qt-components.pro INSTALL_PREFIX="$INSTALL_PREFIX" INSTALL_SYSCONFDIR="$INSTALL_SYSCONFDIR" DEFAULT_THEME="$DEFAULT_THEME"
if [ $? != 0 ]; then
    echo "ERROR: qmake run failed."
    exit 1
fi

echo
echo
echo "Qt Components build configuration:"
echo "Configuration ....................$QMAKE_CONFIG"
echo "MeeGo Style ...................... $BUILD_MEEGO_STYLE"
if [ "$BUILD_MEEGO_STYLE" = "yes" ]; then
    echo "  MeeGo Touch support  ........... $HAVE_MEEGOTOUCH"
    echo "  ContextSubscriber support  ..... $HAVE_CONTEXTSUBSCRIBER"
    echo "  XDamage support  ............... $HAVE_XDAMAGE"
    echo "  XRandr support  ................ $HAVE_XRANDR"
    echo "  MeeGo Graphics System support .. $HAVE_MEEGOGRAPHICSSYSTEM"
    echo "  Shader support ................. $HAVE_SHADER"
    echo "  Force local theme .............. $FORCE_LOCAL_THEME"
fi
if [ "$BUILD_CSSU" = "yes" ]; then
    echo "Fremantle Style (and meego NS).... $BUILD_FREMANTLE_STYLE"
else
    echo "Fremantle Style .................. $BUILD_FREMANTLE_STYLE"
fi
if [ "$BUILD_FREMANTLE_STYLE" = "yes" ]; then
    echo "  Maliit Framework ............... $HAVE_MALIIT_FRAMEWORK"
    echo "  Qt Mobility support ............ $HAVE_MOBILITY"
    echo "  XDamage support  ............... $HAVE_XDAMAGE"
    echo "  XRandr support  ................ $HAVE_XRANDR"
    echo "  Shader support ................. $HAVE_SHADER"
    if [ "$FORCE_LOCAL_THEME" = "yes" ]; then
	echo "  Default theme .................. $DEFAULT_THEME"
	echo "  Gconf support .................. $HAVE_GCONF"
    fi
fi

echo "Symbian Style .................... $BUILD_SYMBIAN_STYLE"
if [ "$BUILD_SYMBIAN_STYLE" = "yes" ]; then
    echo "  Qt Mobility support ............ $HAVE_MOBILITY"
    echo "  Symbian internal SDK ........... $HAVE_SYMBIAN_INTERNAL"
fi
echo "Extras ........................... $BUILD_EXTRAS"
echo "Demos ............................ $BUILD_DEMOS"
echo "Examples ......................... $BUILD_EXAMPLES"
echo "Tests ............................ $BUILD_TESTS"

echo
if [ "$BUILD_MEEGO_STYLE" = "yes" ] || [ "$BUILD_FREMANTLE_STYLE" = "yes" ]; then
echo "Install prefix: $INSTALL_PREFIX"
echo
fi
echo Qt Components is now configured for building. Just run \'make\'.
echo
