#!/bin/sh
#
# $Id: dpgen.sh,v 1.3 2000/10/02 15:33:15 jpc Exp $
#                                                                        
# /------------------------------------------------------------------\
# |                                                                  |
# |        A l l i a n c e   C A D   S y s t e m                     |
# |                      D p G e n                                   |
# |                                                                  |
# |  Author    :                      Jean-Paul CHAPUT               |
# |  E-mail    :         alliance-support@asim.lip6.fr               |
# | ================================================================ |
# |  sh script :         "./dpgen/dpgen.sh"                          |
# | **************************************************************** |
# |  U p d a t e s                                                   |
# |                                                                  |
# \------------------------------------------------------------------/
#


# /------------------------------------------------------------------\
# |                                                                  |
# |                      Functions Definitions                       |
# |                                                                  |
# \------------------------------------------------------------------/


# --------------------------------------------------------------------
# Function  :  `print_usage()'.

 print_usage()
 {
   echo ""
   echo "  usage: dpgen [-cdlknv] [--keep-exec] [--no-exec] [--no-rm-core] \\"
   echo "               [--keep-log] [--verbose] \\"
   echo "               <progam> [-e [args]]"
   echo ""
   echo "  Options:"
   echo "    [-c|--no-rm-core] : Don't remove core file."
   echo "    [-l|--keep-log]   : Keep log file (.frr) after execution."
   echo "    [-k|--keep-exec]  : Keep binary after execution."
   echo "    [-n|--no-exec]    : Do not execute the binary."
   echo "    [-v|--verbose]    : Issue more informations."
   echo "    [-e [args]]       : [args] are passed to the binary."
   echo ""
 }


# --------------------------------------------------------------------
# Function  :  `vecho()'.

 vecho()
 { 
   ECHOFLAGS="" 
   if [ $1 -gt $VERBOSE ]; then return 0; fi
   if [ "$2" = "-n" ]; then
     ECHOFLAGS="-n"; shift;
   fi
   echo $ECHOFLAGS "$2" 2>&1 | tee -a $CSOURCE.frr
 }


# /------------------------------------------------------------------\
# |                                                                  |
# |                  Main Part of the Shell Script                   |
# |                                                                  |
# \------------------------------------------------------------------/


 alcbanner "DpGen" "1.0" "Datapath Generation Language" "2000"


# --------------------------------------------------------------------
# Process the command line.

# If no arguments, print usage.
 if [ $# -eq 0 ]; then print_usage; exit 0; fi


  KEEP_BIN="n"
  KEEP_LOG="n"
 KEEP_CORE="n"
   VERBOSE=0
   EXECUTE="y"
 ARGUMENTS=""
   PROGRAM="not set"
     DEVEL="n"


# Parse the arguments.
 while [ $# -gt 0 ]; do

   case $1 in

     --no-rm-core) KEEP_CORE="y";;
     --keep-exec)  KEEP_BIN="y";;
     --keep-log)   KEEP_LOG="y";;
     --no-exec)    EXECUTE="n";;
     --verbose)    VERBOSE=1;;
     --devel)      DEVEL="y";;

     -*) NB=2; CH=`echo $1 | cut -c$NB`
	 while [ "$CH" != "" ]; do

	   case $CH in

             c) KEEP_CORE="y";;
             k) KEEP_BIN="y";;
             l) KEEP_LOG="y";;
             n) EXECUTE="n";;
             v) VERBOSE=1;;
             d) DEVEL="y";;
             e) echo "dpgen:warning: misplaced -e option.";
                print_usage; exit 1;;
             *) echo "dpgen:warning: Invalid option \`$CH' (ignored)."
                print_usage;;

	   esac

           NB=`expr $NB + 1`
           CH=`echo $1 | cut -c$NB`

         done;;

     *)            PROGRAM=$1; shift; break;;

   esac

   shift

 done


# Parse optionals program arguments.
 if [ $# -gt 0 ]; then
   if [ "$1" != "-e" ]; then

     echo "dpgen:warning: ignored \`$1' parameter after program name."
     print_usage

   else

     shift; ARGUMENTS="$*"

   fi
 fi


# Check arguments coherency.
 if [ "$PROGRAM" = "not set" ]; then

   echo "dpgen:error: Missing <program> argument."
   print_usage; exit 1;

 fi

 CSOURCE=`basename $PROGRAM .c`


# Removing previously generated files.
 rm -f $CSOURCE.frr $CSOURCE.o > /dev/null 2>&1


# --------------------------------------------------------------------
# Print the current MBK environment.

 if [ ! -z "$ALLIANCE_TOP" ]; then ALLIANCE_TOP=$ALLIANCE_TOP; fi
 if [ ! -z "$ALLIANCE_OS"  ]; then  ALLIANCE_OS=$ALLIANCE_OS;  fi

 vecho 1    "  o  Current Alliance environment:"
 vecho 1    "     - ALLIANCE_TOP    : ${ALLIANCE_TOP-not set}"
 vecho 1    "     - ALLIANCE_OS     : ${ALLIANCE_OS-not set}"
 vecho 1    "  o  Current MBK environment:"
 vecho 1    "     - MBK_IN_LO       : ${MBK_IN_LO-not set}"
 vecho 1    "     - MBK_OUT_LO      : ${MBK_OUT_LO-not set}"
 vecho 1    "     - MBK_IN_PH       : ${MBK_IN_PH-not set}"
 vecho 1    "     - MBK_OUT_PH      : ${MBK_OUT_PH-not set}"
 vecho 1    "     - MBK_WORK_LIB    : ${MBK_WORK_LIB-not set}"
 vecho 1 -n "     - MBK_CATA_LIB    : "

 if [ -z "$MBK_CATA_LIB" ]; then

   vecho 1 "not set"

 else

   STRING=`echo ${MBK_CATA_LIB} |                            \
             awk 'BEGIN { FS=":"; }                          \
                  { for( i=1; i<=NF; i++) {                  \
                      printf("%s\n", $i);                    \
                      if (i < NF)                            \
                        printf("                         "); \
                    }                                        \
                  }' -`

   vecho 1 "$STRING"

 fi

 vecho 1    "     - MBK_CATAL_NAME  : ${MBK_CATAL_NAME-not set}"
 vecho 1    "     - MBK_VDD         : ${MBK_VDD-not set}"
 vecho 1    "     - MBK_VSS         : ${MBK_VSS-not set}"
 vecho 1    "     - RDS_TECHNO_NAME : ${RDS_TECHNO_NAME-not set}"
 vecho 1    ""


# --------------------------------------------------------------------
# Development hacks.

 if [ "$DEVEL" = "y" ]; then
   ALLIANCE_INSTALL_DIR="/usr/local/alliance/archi/Cygwin"
   ALLIANCE_DEVEL_INCLUDE="-I${ALLIANCE_INSTALL_DIR}/include"
   ALLIANCE_DEVEL_LIB="-L${ALLIANCE_INSTALL_DIR}/lib"
 fi


# --------------------------------------------------------------------
# Build and execute the Makefile.

 vecho 1 "  o  Program generation."
 vecho 1 "     - Creating Makefile."

 MAKEFILE="Makefile-$$"


# --------------------------------------------------------------------
# Start of the Makefile text.

cat << EOF > $MAKEFILE

include \$(ALLIANCE_TOP)/etc/\$(ALLIANCE_OS).mk
include \$(ALLIANCE_TOP)/etc/libraries.mk

  LOCAL_ALC_IDIR = $ALLIANCE_DEVEL_INCLUDE -I\$(ALLIANCE_INCLUDE)
  LOCAL_ALC_DEFS = -DALLIANCE_VERSION=\$(ALLIANCE_VERSION) \\
                   -DDGN_H='<dgn001.h>' \\
                   -DMGN_H='<\$(MGN_H)>' \\
                   -DMLU_H='<\$(MLU_H)>' \\
                   -DMLO_H='<\$(MLO_H)>' \\
                   -DMPH_H='<\$(MPH_H)>' \\
                   -DMPU_H='<\$(MPU_H)>' \\
                   -DMUT_H='<\$(MUT_H)>' \\
                   -DMGN_H='<\$(MGN_H)>' \\
                   -DBEH_H='<\$(BEH_H)>' \\
                   -DLOG_H='<\$(LOG_H)>'
  LOCAL_ALC_INCS = \$(LOCAL_ALC_IDIR) \$(LOCAL_ALC_DEFS)

  LOCAL_ALC_LDIR = $ALLIANCE_DEVEL_LIB -L\$(ALLIANCE_LIB)
  LOCAL_ALC_LDGN = -lDgn001 
  LOCAL_ALC_LVBE = \$(BVL_L) \\
                   \$(BEH_L) \\
                   \$(BHL_L) \\
                   \$(LOG_L)
  LOCAL_ALC_LMGN = \$(MGN_L)
  LOCAL_ALC_LMUT = \$(MUT_L)
  LOCAL_ALC_LMLO = \$(MLU_L) \\
                   \$(MLO_L) \\
                   \$(MAL_L) \\
                   \$(MCL_L) \\
                   \$(MGL_L) \\
                   \$(MEL_L) \\
                   \$(MHL_L) \\
                   \$(MSL_L) \\
                   \$(MVL_L) \\
                   \$(RCN_L)
  LOCAL_ALC_LMPH = \$(MPU_L) \\
                   \$(MPH_L) \\
                   \$(MAP_L) \\
                   \$(MCP_L) \\
                   \$(MMG_L)
  LOCAL_ALC_LIBS = \$(LOCAL_ALC_LDIR) \\
                   \$(LOCAL_ALC_LDGN) \\
                   \$(LOCAL_ALC_LVBE) \\
                   \$(LOCAL_ALC_LMGN) \\
                   \$(LOCAL_ALC_LMLO) \\
                   \$(LOCAL_ALC_LMPH) \\
                   \$(LOCAL_ALC_LMUT)

  LOCAL_STD_LIBS = -lm

#  C Flags for normal compilation.
 LOCAL_CFLAGS = \$(CFLAGS) -c -g -D\$(ALLIANCE_OS)
 LOCAL_OFLAGS = \$(OFLAGS) -o


all: $CSOURCE

$CSOURCE: $CSOURCE.o
	\$(CC) \$(LOCAL_OFLAGS) \$@ \$? \$(LOCAL_ALC_LIBS) \$(LOCAL_STD_LIBS)
	rm -f \$?

$CSOURCE.o: $CSOURCE.c
	\$(CC) \$(LOCAL_CFLAGS) \$(LOCAL_ALC_INCS) \$?


clean:
	rm -f $CSOURCE $CSOURCE.o


EOF


# --------------------------------------------------------------------
# End of the Makefile text.


 vecho 1 "     - Running Makefile."

 make -f $MAKEFILE ALLIANCE_TOP=$ALLIANCE_TOP \
         CSOURCE=$CSOURCE clean all >> $CSOURCE.frr 2>&1

 exit_code=$?

 if [ $exit_code -ne 0 ]; then

   rm -f $MAKEFILE

   echo "dpgen:error: Compilation failed."
   exit $exit_code

 else

   if [ "$EXECUTE" = "y" ]; then

     vecho 1 "  o  Execute program..."
     ./$CSOURCE $ARGUMENTS; exit_code=$?

     vecho 1 "     - Exit code := $exit_code."
     if [ $exit_code -ne 0 ]; then
       rm -f $MAKEFILE
       echo "dpgen:error: Execution failed."
     fi

     if [ "$KEEP_CORE" != "y" ]; then rm -f core >> $CSOURCE.frr 2>&1; fi

   else
     vecho 1 "  o  Execution step skipped."
     exit_code=0
   fi

 fi


 vecho 1 ""
 vecho 1 "  o  Remove temporary file."

 rm -f $MAKEFILE

 if [ "$KEEP_BIN"  != "y" ]; then rm -f $CSOURCE >> $CSOURCE.frr 2>&1; fi

 if [ \( $exit_code -eq 0 \) -a \( "$KEEP_LOG" != "y" \) ]; then
   rm -f $CSOURCE.frr > /dev/null 2>&1
 fi

 echo ""


 exit $exit_code
