#!/bin/sh
#########################################################################
#                                                                       #
#                                 OCaml                                 #
#                                                                       #
#          Damien Doligez, projet Gallium, INRIA Rocquencourt           #
#                                                                       #
#   Copyright 2014 Institut National de Recherche en Informatique et    #
#   en Automatique.  All rights reserved.  This file is distributed     #
#   under the terms of the Q Public License version 1.0.                #
#                                                                       #
#########################################################################

# This script is run on our continuous-integration servers to recompile
# from scratch and run the test suite.

# arguments:
# 1. architecture: bsd, macos, linux, cygwin, mingw, mingw64, msvc, msvc64
# 2. for windows, directory in which to build (trunk, 4.02, etc)
# 3. options:
#    -conf configure-option
#    -patch1 file-name       apply patch with -p1

error () {
  echo "$1" >&2
  exit 3
}

#########################################################################
# If we are called from a Windows batch script, we must set up the
# Unix environment variables (e.g. PATH).

case "$1" in
  bsd|macos|linux) ;;
  cygwin|mingw|mingw64)
    . /etc/profile
    . "$HOME/.profile"
  ;;
  msvc)
    . /etc/profile
    . "$HOME/.profile"
    . "$HOME/.msenv32"
  ;;
  msvc64)
    . /etc/profile
    . "$HOME/.profile"
    . "$HOME/.msenv64"
  ;;
  *) error "unknown architecture: $1";;
esac

#########################################################################

# be verbose and stop on error
set -ex

# parse command line
# Configure options are not allowed to have spaces or special characters
# for the moment. We'll fix that when needed.
arch="$1"
branch="$2"
confoptions=""
shift 2
while [ $# -gt 0 ]; do
  case $1 in
    -conf) confoptions="$confoptions $2"; shift 2;;
    -patch1) patch -f -p1 <"$2"; shift 2;;
    *) error "unknown option $1";;
  esac
done

#########################################################################
# set up variables

# default values
make=make
instdir="$HOME/ocaml-tmp-install"
workdir=.
docheckout=false
nt=

case "$arch" in
  bsd)
    make=gmake
  ;;
  macos) ;;  # FIXME to be checked
  linux) ;;
  cygwin)
    workdir="$HOME/jenkins-workspace/$branch"
    docheckout=true
  ;;
  mingw)
    instdir=/cygdrive/c/ocamlmgw
    workdir="$HOME/jenkins-workspace/$branch"
    docheckout=true
    nt=.nt
  ;;
  mingw64)
    instdir=/cygdrive/c/ocamlmgw64
    workdir="$HOME/jenkins-workspace/$branch"
    docheckout=true
    nt=.nt
  ;;
  msvc)
    instdir=/cygdrive/c/ocamlms
    workdir="$HOME/jenkins-workspace/$branch"
    docheckout=true
    nt=.nt
  ;;
  msvc64)
    instdir=/cygdrive/c/ocamlms64
    workdir="$HOME/jenkins-workspace/$branch"
    docheckout=true
    nt=.nt
  ;;
  *) error "unknown architecture: $arch";;
esac

#########################################################################

cd "$workdir"

$make -f Makefile$nt distclean || :

if $docheckout; then
  svn update --accept theirs-full
fi

case $nt in
  "") ./configure -prefix "$instdir" $confoptions;;
  .nt)
    cp config/m-nt.h config/m.h
    cp config/s-nt.h config/s.h
    cp config/Makefile.$arch config/Makefile
  ;;
  *) error "internal error";;
esac

$make -f Makefile$nt world.opt
$make -f Makefile$nt install

rm -rf "$instdir"
cd testsuite
$make all
