#!/bin/sh
#
# Download and build Qt for desktop
#
# Usage:  build-qt.sh [-h] [-n] -[<n>]
# Options:
#
# -h   Help
# -n   No-execute, just show commands
# -<n> Perform build step <n>, where <n> is:
#
# 0 - download
# 1 - extract source
# 2 - configure
# 3 - build
# 4 - install
# 5 - build docs
# 6 - install docs
# 7 - remove source
# 8 - make tar file of build
# 9 - remove install

# Qt version to build
VERSION_MAJOR=5
VERSION_MINOR=15
VERSION_PATCH=2

# Set if needed for a beta or RC version, e.g. "-beta4"
# Leave empty for release.
VERSION_SUFFIX=

# Build type, "full" or "minimal"
#BUILD_TYPE="full"
BUILD_TYPE="minimal"

# Number of parallel jobs to run
PAR=1

# Stop on error
set -e

# Build directory
BUILD_DIR=${HOME}/qtbuild

# Parse command line options
while getopts "hn0123456789" opt; do
  case $opt in
    h)
      echo "usage: $0 [-h] [-n] -[<n>]"
      echo ""
      echo "Options:"
      echo "  -h   Help"
      echo "  -n   No-execute, just show commands"
      echo "  -<n> Perform only build step <n>, where <n> is:"
      echo "        0 - download"
      echo "        1 - extract source"
      echo "        2 - configure"
      echo "        3 - build"
      echo "        4 - install"
      echo "        5 - build docs"
      echo "        6 - install docs"
      echo "        7 - remove source"
      echo "        8 - make tar file of build"
      echo "        9 - remove install"
      exit
      ;;
    n)
      no_exec=1
      ;;
    0)
      step_0=1
      ;;
    1)
      step_1=1
      ;;
    2)
      step_2=1
      ;;
    3)
      step_3=1
      ;;
    4)
      step_4=1
      ;;
    5)
      step_5=1
      ;;
    6)
      step_6=1
      ;;
    7)
      step_7=1
      ;;
    8)
      step_8=1
      ;;
    9)
      step_9=1
      ;;
    \?)
      exit
      ;;
  esac
done

# If no build steps were specified, enable them all.
if [ -z "$step_0$step_1$step_2$step_3$step_4$step_5$step_6$step_7$step_8$step_9" ]
then
    step_0=1
    step_1=1
    step_2=1
    step_3=1
    step_4=1
    step_5=1
    step_6=1
    step_7=1
    step_8=1
    step_9=1
fi

# Generate name of archive file
VER2="${VERSION_MAJOR}.${VERSION_MINOR}"
VER3="${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}"
SOURCE="qt-everywhere-src-${VER3}${VERSION_SUFFIX}.tar.xz"
# Releases prior to Qt 5.10.0 use this format:
#SOURCE="qt-everywhere-opensource-src-${VER3}${VERSION_SUFFIX}.tar.xz"

# Name of source directory
DIR=${BUILD_DIR}/`basename ${SOURCE} .tar.xz`

# Name of created build archive file
if [ ${BUILD_TYPE} = "full" ]
then
    BUILD="Qt${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}-RaspberryPi4-bin-full.tgz"
elif [ ${BUILD_TYPE} = "minimal" ]
then
    BUILD="Qt${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}-RaspberryPi4-bin-minimal.tgz"
else
    echo "Unknown build type: ${BUILD_TYPE}"
    exit 1
fi

echo "*** Building Qt ${VER3}${VERSION_SUFFIX} (${BUILD_TYPE})"
if [ ! -d "${BUILD_DIR}" ]
then
    if [ -n "$no_exec" ]
    then
        echo mkdir -p "${BUILD_DIR}"
    else
        mkdir -p "${BUILD_DIR}"
    fi
fi

if [ -n "$no_exec" ]
then
    echo cd ${BUILD_DIR}
else
    cd ${BUILD_DIR}
fi

# Download source if needed.
if [ -n "$step_0" ]
then
    if [ -f "${SOURCE}" ]
    then
        echo "*** Source found, not downloading it"
    else
        echo "*** Downloading source"
        if [ -n "$no_exec" ]
        then
            echo wget http://download.qt.io/official_releases/qt/${VER2}/${VER3}/single/${SOURCE}
        else
            wget http://download.qt.io/official_releases/qt/${VER2}/${VER3}/single/${SOURCE}
        fi
    fi
fi

# Check that a build was not already extracted
if [ -n "$step_1" ]
then
    if [ -d ${DIR} ]
    then
        echo "A build already exists in ${DIR}"
        echo "Remove it before doing a build."
        if [ -z "$no_exec" ]
        then
            exit 1
        fi
    fi

    # Extract source
    echo "*** Extracting source"
    if [ -n "$no_exec" ]
    then
        echo tar xJf ${SOURCE}
        echo cd ${DIR}
    else
        tar xJf ${SOURCE}
        cd ${DIR}
    fi

fi

# Configure
if [ -n "$step_2" ]
then
    echo "*** Configuring"
    if [ ${BUILD_TYPE} = "minimal" ]
    then
        if [ -n "$no_exec" ]
        then
            echo cd ${DIR}
            echo ./configure -opensource -confirm-license -skip qtwebengine -skip qtlocation -nomake examples -nomake tests -no-assimp
        else
            cd ${DIR}
            ./configure -opensource -confirm-license -skip qtwebengine -skip qtlocation -nomake examples -nomake tests -no-assimp
        fi
    else
        if [ -n "$no_exec" ]
        then
            echo cd ${DIR}
            echo ./configure -opensource -confirm-license -skip qtwebengine -skip qtlocation -no-assimp
        else
            cd ${DIR}
            ./configure -opensource -confirm-license -no-assimp
        fi
    fi
fi

# Build
if [ -n "$step_3" ]
then
    echo "*** Building"
    if [ -n "$no_exec" ]
    then
        echo cd ${DIR}
        echo make -s -j${PAR}
    else
        cd ${DIR}
        make -s -j${PAR}
    fi
fi

# Install
if [ -n "$step_4" ]
then
    echo "*** Installing"
    if [ -n "$no_exec" ]
    then
        echo cd ${DIR}
        echo sudo make -s install
    else
        cd ${DIR}
        sudo make -s install
    fi
fi

# Build docs
if [ -n "$step_5" ]
then
    if [ ${BUILD_TYPE} = "full" ]
    then
        echo "*** Building docs"
        if [ -n "$no_exec" ]
        then
            echo cd ${DIR}
            echo make -s -j${PAR} docs
        else
            cd ${DIR}
            make -s -j${PAR} docs
        fi
    fi
fi

# Install docs
if [ -n "$step_6" ]
then
    if [ ${BUILD_TYPE} = "full" ]
    then
        echo "*** Installing docs"
        if [ -n "$no_exec" ]
        then
            echo cd ${DIR}
            echo sudo make -s install_docs
        else
            cd ${DIR}
            sudo make -s install_docs
        fi
    fi
fi

# Remove source
if [ -n "$step_7" ]
then
    echo "*** Removing source"
    if [ -n "$no_exec" ]
    then
        echo rm -rf ${DIR}
    else
        rm -rf ${DIR}
    fi
fi

# Make tar file of build
if [ -n "$step_8" ]
then
    echo "*** Making tar file of build"
    if [ -n "$no_exec" ]
    then
        echo cd ${DIR}/..
        echo tar czf ${BUILD} /usr/local/Qt-${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}
    else
        cd ${DIR}/..
        tar czf ${BUILD} /usr/local/Qt-${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}
    fi
fi

# Remove install
if [ -n "$step_9" ]
then
    echo "*** Removing install"
    if [ -n "$no_exec" ]
    then
        echo sudo rm -rf /usr/local/Qt-${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}
    else
        sudo rm -rf /usr/local/Qt-${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}
    fi
fi

# Done.
echo "*** Done, build is in ${BUILD}"
