#!/bin/bash

set -e                     # Terminate script at the first line that fails.
set -o pipefail            # Return the first non-zero pipe command error.
set -x                     # Print commands as they are executed

# This script performs an automated build on i686-pc-mingw32 of
# llvm-gcc for i686-pc-mingw32. It assumes the valid native
# compiler for i686-pc-mingw32 is in place and available as well as
# libraries and headers for i686-pc-mingw32.

# --build=i686-pc-mingw32
# --host=i686-pc-mingw32
# --target=i686-pc-mingw32

# The usage:
# Run this build from the build from the build root directory as
# build-native-mingw32 [<step>] [<extra args>]

# Expected project tree structure:
# <build root>
#    +-- ${LLVM_src}
#    +-- ${LLVM_GCC_src}
#    +-- ${LLVM_obj}
#    +-- ${LLVM_GCC_obj}
#    +-- ${INSTALL}

LLVM_src=llvm.src          # The LLVM source code root directory name.
LLVM_GCC_src=llvm-gcc.src  # The LLVM-GCC source code root directory name.
LLVM_obj=llvm.obj          # The LLVM build root directory name.
LLVM_GCC_obj=llvm-gcc.obj  # The LLVM-GCC build root directory name.
INSTALL=install            # Where the result will be installed.

# CFLAGS and CXXFLAGS must not be set during the building of cross-tools.
unset CFLAGS
unset CXXFLAGS

BUILD_ROOT=$PWD            # Where build happens.
PRIVATE_INSTALL="c:/mingw" # Where the result will be installed.

#------------------------------------------------------------------------------
# Define build steps, parse and validate input parameters
#------------------------------------------------------------------------------

# This script supports the following steps:
do_clean=no             # Clean up the build directory.
do_copy_tools=no        # Copy tools.
do_configure_llvm=no    # Configure LLVM.
do_make_llvm=no         # Make LLVM.
do_test_llvm=no         # Test LLVM.
do_configure_llvmgcc=no # Configure LLVM-GCC.
do_make_llvmgcc=no      # Make LLVM-GCC.
do_install_llvmgcc=no   # Install LLVM-GCC.
do_all=no               # Runs all steps at once when requested.

# Set step parameter
if (( $# == 0 )) ; then
   do_all=yes
fi
# else
if (( ! $# == 0 )) ; then
   # First check that the parameter actually defines a step.
   case $1 in
      clean             |  \
      copy_tools        |  \
      configure_llvm    |  \
      make_llvm         |  \
      test_llvm         |  \
      configure_llvmgcc |  \
      make_llvmgcc      |  \
      install_llvmgcc   |  \
      all)
         eval do_$1=yes    # Set the flag for the requested step .
         shift             # Remove it since is is ours and already precessed.
         ;;

      *)
         # Not our parameter. Pass it as is.
   esac
fi

# Set all steps if do_all requested
if [ "$do_all" == "yes" ] ; then
   # Set all steps to yes
   do_clean=yes
   do_copy_tools=yes
   do_configure_llvm=yes
   do_make_llvm=yes
   do_test_llvm=yes
   do_configure_llvmgcc=yes
   do_make_llvmgcc=yes
   do_install_llvmgcc=yes
fi

#------------------------------------------------------------------------------
# Step: Clean up.
#------------------------------------------------------------------------------
if [ "$do_clean" == "yes" ] ; then

   # Remove everything from where we will be installing the result.
   rm -rf ${PRIVATE_INSTALL}
   mkdir -p ${PRIVATE_INSTALL}
   chmod a+rx ${PRIVATE_INSTALL}

fi

#------------------------------------------------------------------------------
# Step: Copy tools.
#------------------------------------------------------------------------------
if [ "$do_copy_tools" == "yes" ] ; then

   # We need a local copy of binutils, system libraries and headers,
   # since we will be installing there.
   cp -RL c:/clean_copy_mingw/MinGW/* ${PRIVATE_INSTALL}/

fi

#------------------------------------------------------------------------------
# Step: Configure LLVM.
#------------------------------------------------------------------------------
if [ "$do_configure_llvm" == "yes" ] ; then

   # Remove previously build files if any.
   rm -rf ${BUILD_ROOT}/${LLVM_obj}
   mkdir -p ${BUILD_ROOT}/${LLVM_obj}
   chmod a+rx ${BUILD_ROOT}/${LLVM_obj}
   cd ${BUILD_ROOT}/${LLVM_obj}
   
   ../${LLVM_src}/configure --prefix=${PRIVATE_INSTALL}            \
      --build=i686-pc-mingw32 --host=i686-pc-mingw32               \
      --target=i686-pc-mingw32 --disable-shared --disable-multilib \
      --disable-nls --disable-bootstrap --disable-sjlj-exceptions  \
      --disable-win32-registry --without-llvmgcc --without-llvmgxx \
      --enable-optimized --enable-assertions                       \
      $@  # Extra args if any

fi

#------------------------------------------------------------------------------
# Step: Make LLVM.
#------------------------------------------------------------------------------
if [ "$do_make_llvm" == "yes" ] ; then

   cd ${BUILD_ROOT}/${LLVM_obj}
   make ENABLE_OPTIMIZED=1 \
      $@  # Extra args if any, like -j16 for example.

fi

#------------------------------------------------------------------------------
# Step: Test LLVM.
#------------------------------------------------------------------------------
if [ "$do_test_llvm" == "yes" ] ; then

   cd ${BUILD_ROOT}/${LLVM_obj}
   make check-lit VERBOSE=1  \
      $@  # Extra args if any, like -j16 for example.

fi

#------------------------------------------------------------------------------
# Step: Configure LLVM-GCC.
#------------------------------------------------------------------------------
if [ "$do_configure_llvmgcc" == "yes" ] ; then

   # Remove previously build files if any.
   rm -rf ${BUILD_ROOT}/${LLVM_GCC_obj}
   mkdir -p ${BUILD_ROOT}/${LLVM_GCC_obj}
   chmod a+rx ${BUILD_ROOT}/${LLVM_GCC_obj}
   cd ${BUILD_ROOT}/${LLVM_GCC_obj}
   
   ../${LLVM_GCC_src}/configure --prefix=${PRIVATE_INSTALL}            \
      --build=i686-pc-mingw32 --host=i686-pc-mingw32                   \
      --target=i686-pc-mingw32 --disable-shared --disable-bootstrap    \
      --disable-nls --disable-win32-registry --disable-sjlj-exceptions \
      --enable-languages=c,c++ --program-prefix=llvm-                  \
      --enable-llvm=${BUILD_ROOT}/${LLVM_obj}                          \
      $@  # Extra args if any

fi

#------------------------------------------------------------------------------
# Step: Make LLVM-GCC.
#------------------------------------------------------------------------------
if [ "$do_make_llvmgcc" == "yes" ] ; then

   cd ${BUILD_ROOT}/${LLVM_GCC_obj}
   make \
      $@  # Extra args if any

fi

#------------------------------------------------------------------------------
# Step: Install LLVM-GCC.
#------------------------------------------------------------------------------
if [ "$do_install_llvmgcc" == "yes" ] ; then

   cd ${BUILD_ROOT}/${LLVM_GCC_obj}
   make install  \
      $@  # Extra args if any

fi
