#!/bin/sh

#*********************************************************************#
#                                                                     #
#                              Htmlc                                  #
#                                                                     #
#            Pierre Weis, projet Cristal, INRIA Rocquencourt          #
#                                                                     #
#  Copyright 2001, 2009                                               #
#  Institut National de Recherche en Informatique et en Automatique.  #
#  Distributed under the QPL licence.                                 #
#                                                                     #
#*********************************************************************#

# $Id: configure,v 1.21 2013-04-24 07:14:04 fclement Exp $

SCRIPT=`basename $0`
TRACE=false

#
# PREFIXINSTALLDIR
#

MSG="Automatically generated by generic makefiles configuration."

do_mkfile () {
    FILE=$1
    PRIVATE_TOOL=$2
    MIMIC_INSTALL_ROOT_DIR=$3
    INSTALL_ROOT_DIR=$4
    OCAML_COMMAND_SEARCH_PATH=$5
    echo  "# $MSG" > $FILE
    echo "PRIVATE_TOOL=$PRIVATE_TOOL" >> $FILE
    echo "MIMIC_INSTALL_ROOT_DIR=$MIMIC_INSTALL_ROOT_DIR" >> $FILE
    echo "PREFIXINSTALLDIR=$INSTALL_ROOT_DIR" >> $FILE
    echo "OCAML_COMMAND_SEARCH_PATH=$OCAML_COMMAND_SEARCH_PATH" >> $FILE
}

MKFILE=config/Makefile.prefixinstalldir

# Intrinsic defaults.
PRIVATE_TOOL_INTRINSIC_DEFAULT=false
MIMIC_INSTALL_ROOT_DIR_INTRINSIC_DEFAULT="$PWD"
INSTALL_ROOT_DIR_INTRINSIC_DEFAULT="/usr/local"
OCAML_COMMAND_SEARCH_PATH_INTRINSIC_DEFAULT=""

usage () {
    
    cat << eof

Usage: ./$SCRIPT [<option>...]

OPTIONS

Paths:

--install-root-dir <ird>, -ird <ird>
        Set the installation root directory to <ird>.
        Default is "$INSTALL_ROOT_DIR_INTRINSIC_DEFAULT".

--ocaml-command-search-path <-ocsp>, -ocsp <ocsp>
        Set the command search path for the OCaml compiler to <ocsp>.
        Default is the first one in your search path.

Service:

--trace, -x
        Trigger the fine debugging mode on. Default is "$TRACE".

--help, -h
        Display this help and exit.

eof
    
} >&2

while test $# -gt 0; do
    
    case "$1" in
    
    # Installation root directory name.
    ( --install-root-dir | -install-root-dir | -ird | --prefix | -prefix )
        VAL=`eval echo "$2"`; shift
        # Perform sanity check: nonempty install root directory.
        if test -z "$VAL"; then
            echo "Error:" \
              "The installation root directory name must be nonempty" >&2
            exit 2
        fi
        INSTALL_ROOT_DIR_FROM_COMMAND_LINE="$VAL"
        ;;
    
    # OCaml command search path.
    ( --ocaml-command-search-path | -ocaml-command-search-path | -ocsp )
        VAL=`eval echo "$2"`; shift
        OCAML_COMMAND_SEARCH_PATH_FROM_COMMAND_LINE="$VAL"
        ;;

    # Operating modes.
    ( --trace | -trace | -x) set -x;;
        
    # Help.
    ( --help | -help | -h )
        usage
        exit 0
        ;;
        
    # Private tool.
    ( --private-tool | -private-tool | -pt )
        PRIVATE_TOOL_FROM_COMMAND_LINE=true
        VAL=`eval echo "$2"`; shift
        MIMIC_INSTALL_ROOT_DIR_FROM_COMMAND_LINE="$VAL"
        ;;

    # Unknown option name.
    ( -* )
        echo "Error: unknown option name \"$1\"" >&2
        exit 3
        ;;

    # Invalid argument.
    ( * )
        echo "Error: invalid argument \"$1\"" >&2
        exit 4
        ;;
            
    esac
    
    shift
    
done

## Private tool / mimic installation root directory.

if [ -n "$PRIVATE_TOOL_INTRINSIC_DEFAULT" ]; then
    PRIVATE_TOOL=$PRIVATE_TOOL_INTRINSIC_DEFAULT
else
    echo "Internal error! Please report."
    exit 1
fi
if [ -n "$MIMIC_INSTALL_ROOT_DIR_INTRINSIC_DEFAULT" ]; then
    MIMIC_INSTALL_ROOT_DIR=$MIMIC_INSTALL_ROOT_DIR_INTRINSIC_DEFAULT
else
    echo "Internal error! Please report."
    exit 1
fi

# Already defined?
ALREADY=""
if [ -s $MKFILE ]; then
    ALREADY=`grep -w "PRIVATE_TOOL=" $MKFILE | \
             tail -1 | cut -d = -f 2`
fi
if [ -n "$ALREADY" ]; then
    PRIVATE_TOOL=`eval echo $ALREADY`
fi
ALREADY=""
if [ -s $MKFILE ]; then
    ALREADY=`grep -w "MIMIC_INSTALL_ROOT_DIR=" $MKFILE | \
             tail -1 | cut -d = -f 2`
fi
if [ -n "$ALREADY" ]; then
    MIMIC_INSTALL_ROOT_DIR=`eval echo $ALREADY`
fi

# From command line
if [ -n "$PRIVATE_TOOL_FROM_COMMAND_LINE" ]; then
    PRIVATE_TOOL=$PRIVATE_TOOL_FROM_COMMAND_LINE
fi
if [ -n "$MIMIC_INSTALL_ROOT_DIR_FROM_COMMAND_LINE" ]; then
    MIMIC_INSTALL_ROOT_DIR=$MIMIC_INSTALL_ROOT_DIR_FROM_COMMAND_LINE
fi

## Install_root_dir.

if [ -n "$INSTALL_ROOT_DIR_INTRINSIC_DEFAULT" ]; then
    INSTALL_ROOT_DIR=$INSTALL_ROOT_DIR_INTRINSIC_DEFAULT
else
    echo "Internal error! Please report."
    exit 1
fi

# Already defined?
ALREADY=""
if [ -s $MKFILE ]; then
    ALREADY=`grep -w "INSTALL_ROOT_DIR=" $MKFILE | \
             tail -1 | cut -d = -f 2`
fi
if [ -n "$ALREADY" ]; then
    INSTALL_ROOT_DIR=`eval echo $ALREADY`
fi

# From command line
if [ -n "$INSTALL_ROOT_DIR_FROM_COMMAND_LINE" ]; then
    INSTALL_ROOT_DIR=$INSTALL_ROOT_DIR_FROM_COMMAND_LINE
fi

## OCaml command_search_path.

# Already defined?
ALREADY=""
if [ -s $MKFILE ]; then
    ALREADY=`grep -w "OCAML_COMMAND_SEARCH_PATH=" $MKFILE | \
             tail -1 | cut -d = -f 2`
fi
if [ -n "$ALREADY" ]; then
    OCAML_COMMAND_SEARCH_PATH=`eval echo $ALREADY`
fi

# From command line
if [ -n "$OCAML_COMMAND_SEARCH_PATH_FROM_COMMAND_LINE" ]; then
    OCAML_COMMAND_SEARCH_PATH=$OCAML_COMMAND_SEARCH_PATH_FROM_COMMAND_LINE
fi

# Add a trailing slash if nonempty and not already there.
case "$OCAML_COMMAND_SEARCH_PATH" in
( "" | */ ) ;;
( * ) OCAML_COMMAND_SEARCH_PATH="$OCAML_COMMAND_SEARCH_PATH/";;
esac

# Do it!
do_mkfile $MKFILE \
    $PRIVATE_TOOL "$MIMIC_INSTALL_ROOT_DIR" \
    "$INSTALL_ROOT_DIR" "$OCAML_COMMAND_SEARCH_PATH"

# To prevent developers from editing a volatile file.
chmod 0444 config/Makefile

## Mimic installed hierarchy when private tool (for Pph).
if $PRIVATE_TOOL; then
    HERE="$PWD"
    case "$MIMIC_INSTALL_ROOT_DIR" in
    ( $HERE )
        echo "Error:" \
             "a private tool cannot mimic its installation in itself." >&2
        exit 2
        ;;
    ( */private ) :;;
    ( * )
        echo "Error: no \"/private\" suffix" \
             "in mimic installation root directory" \
             "\"$MIMIC_INSTALL_ROOT_DIR\"." >&2
        exit 2
        ;;
    esac
    LINK_ROOT_DIR="$MIMIC_INSTALL_ROOT_DIR"
    TARGET_ROOT_DIR="$HERE"
    TARGET_PATHS="compiler/htmlc.byt compiler/htmlc.bin"
    for TARGET_PATH in $TARGET_PATHS; do
        LINK_SUB_DIR="bin"
        LINK_NAME="htmlc"
        LINK_DIR="$LINK_ROOT_DIR/$LINK_SUB_DIR"
        mkdir -p "$LINK_DIR"
        (\cd "$LINK_DIR" >/dev/null && \
         rm -f $LINK_NAME && \
         ln -s "$TARGET_ROOT_DIR/$TARGET_PATH" $LINK_NAME)
    done
fi

exit 0
