#!/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
