#!/bin/bash
#
# Copyright (C) 2006-2011 Princeton University
# All rights reserved.
# Author: Christian Bienia
#
# parsecmgmt - A tool to manage the PARSEC benchmark suite
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#     * Redistributions of source code must retain the above copyright
#       notice, this list of conditions and the following disclaimer.
#     * Redistributions in binary form must reproduce the above copyright
#       notice, this list of conditions and the following disclaimer in the
#       documentation and/or other materials provided with the distribution.
#     * Neither the name of Princeton University nor the
#       names of its contributors may be used to endorse or promote products
#       derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY CHRISTIAN BIENIA ``AS IS'' AND ANY
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL CHRISTIAN BIENIA BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

# CHANGELOG
#
# From PARSEC 2.1 to PARSEC 3.0:
#  - Added package configuration files and eliminated central parsec.conf file
#  - Make parsecmgmt display more information about packages
#
# From PARSEC 2.0 to PARSEC 2.1:
#  - Made PARSECPLAT string detection more robust
#  - Place log files in separate log/${PARSECPLAT} subdirectories
#  - Always append build config name to PARSECPLAT
#
# From PARSEC 1.0 to PARSEC 2.0:
#  - parsecmgmt now adds '$CC_HOME/lib' and '$CC_HOME/lib64' to LD_LIBRARY_PATH
#  - file 'compile-info' renamed to 'build-info'
#  - option `-x' added to append extention to platform descriptor string
#  - option `-k' to keep run directory
#  - eliminated need for "inputs" list from file parsec.conf
#  - auto-detect available aliases and packages
#  - conditional package dependencies (also depend on build configuration now)
#  - Renamed action `uninstallall' to `fulluninstall'
#  - Renamed action `cleanall' to `fullclean'



#################################################################
#                                                               #
#                         CONFIGURATION                         #
#                                                               #
#################################################################

# Define directory of PARSEC benchmark suite
# If $PARSECDIR is not set, the script tries to autodetect the path
#export PARSECDIR=""

# Define platform name to use
# If $PARSECPLAT is not set, the script will automaticaly determine a name
#export PARSECPLAT=""

# Should output be logged? Anything other than "TRUE" will turn off logging
create_log="TRUE"



##### There should be no need to touch anything below here #####

# Output prefix to use
oprefix="[PARSEC]"



#################################################################
#                                                               #
#                           FUNCTIONS                           #
#                                                               #
#################################################################

# parsec_init
#
# Initialize the script
#
# Arguments: none
function parsec_init {
  # We need to hard-wire a few commands because we need them for the path detection
  PWD="pwd"
  BASENAME="basename"
  DIRNAME="dirname"

  # Determine script name
  eval me=$(${BASENAME} $0)

  # Try to find path
  uniquefile=".parsec_uniquefile"
  parsecdir=""
  if [ ! -z "${PARSECDIR}" ]; then
    # User defined PARSECDIR, check it
    parsecdir="${PARSECDIR}"
    if [ ! -f "${parsecdir}/${uniquefile}" ]; then
      echo "${oprefix} Error: Variable PARSECDIR points to '${PARSECDIR}', but this does not seem to be the PARSEC directory. Either unset PARSECDIR to make me try to autodetect the path or set it to the correct value."
      exit 1
    fi
  else
    # Try to autodetect path by looking at path used to invoke this script

    # Try to extract absoute or relative path
    if [ "${0:0:1}" == "/" ]; then
      # Absolute path given
      eval parsecdir=$(${DIRNAME} $(${DIRNAME} $0))
      # Check
      if [ -f "${parsecdir}/${uniquefile}" ]; then
        PARSECDIR=${parsecdir}
      fi
    else
      # No absolute path, maybe relative path?
      eval parsecdir=$(${PWD})/$(${DIRNAME} $(${DIRNAME} $0))
      # Check
      if [ -f "${parsecdir}/${uniquefile}" ]; then
        PARSECDIR=${parsecdir}
      fi
    fi

    # If PARSECDIR is still undefined, we try to guess the path
    if [ -z "${PARSECDIR}" ]; then
      # Check current directory
      if [ -f "./${uniquefile}" ]; then
        parsecdir="$(${PWD})"
        PARSECDIR=${parsecdir}
      fi
    fi
    if [ -z "${PARSECDIR}" ]; then
      # Check next-higher directory
      if [ -f "../${uniquefile}" ]; then
        parsecdir="$(${PWD})/.."
        PARSECDIR=${parsecdir}
      fi
    fi
  fi

  # Make sure PARSECDIR is defined and exported
  if [ -z "${PARSECDIR}" ]; then
    echo "${oprefix} Error: Unable to autodetect path to the PARSEC benchmark suite. Either define an environment variable PARSECDIR, or edit ${me} and set PARSECDIR to the correct value at the beginning of the file."
    exit 1
  fi
  export PARSECDIR

  # Eliminate trailing `/.' from PARSECDIR
  PARSECDIR=${PARSECDIR/%\/./}

  # Determine OS name to use for automatically determined PARSECPLAT
  case "${OSTYPE}" in
  *linux*)   ostype="linux";;
  *solaris*) ostype="solaris";;
  *bsd*)     ostype="bsd";;
  *aix*)     ostype="aix";;
  *hpux*)    ostype="hpux";;
  *irix*)    ostype="irix";;
  *amigaos*) ostype="amigaos";;
  *beos*)    ostype="beos";;
  *bsdi*)    ostype="bsdi";;
  *cygwin*)  ostype="windows";;
  *darwin*)  ostype="darwin";;
  *interix*) ostype="interix";;
  *os2*)     ostype="os2";;
  *osf*)     ostype="osf";;
  *sunos*)   ostype="sunos";;
  *sysv*)    ostype="sysv";;
  *sco*)     ostype="sco";;
  *)         ostype="${OSTYPE}";;
  esac

  # Determine HOST name to use for automatically determined PARSECPLAT
  case "${HOSTTYPE}" in
  *i386*)    hosttype="i386";;
  *x86_64*)  hosttype="amd64";;
  *amd64*)   hosttype="amd64";;
  *i486*)    hosttype="amd64";;
  *sparc*)   hosttype="sparc";;
  *sun*)     hosttype="sparc";;
  *ia64*)    hosttype="ia64";;
  *itanium*) hosttype="ia64";;
  *powerpc*) hosttype="powerpc";;
  *ppc*)     hosttype="powerpc";;
  *alpha*)   hosttype="alpha";;
  *mips*)    hosttype="mips";;
  *arm*)     hosttype="arm";;
  *)         hosttype="${HOSTTYPE}";;
  esac

  # Determine first part of value to use for PARSECPLAT environment variable if not defined by user
  # Note: We will append the compiler configuration to that to get the final value for PARSECPLAT
  hostostype="${hosttype}-${ostype}"

  # Define some global directories
  benchdir=${parsecdir}/pkgs
  logdir=${parsecdir}/log

  # Try to load OS-specific configuration to get binaries and correct arguments
  sysconfig="${PARSECDIR}/config/${ostype}.sysconf"
  if [ -f "${sysconfig}" ]; then
    source ${sysconfig}
  else
    echo "${oprefix} Error: Cannot load system configuration file '${sysconfig}' for OS type '${ostype}'. Please create a new system configuration file."
    exit 1
  fi

  # Setup environment so PARSEC tools are usable by other programs
  if [ -z "${PATH}" ]; then
    export PATH="${PARSECDIR}/bin"
  else
    export PATH="${PARSECDIR}/bin:${PATH}"
  fi

  # Build list of aliases from package configurations
  list_of_aliases=""
  for file in ${PARSECDIR}/config/packages/*.*.pkgconf; do
    source $file
    # Append unique aliases to global list, build package list for each alias
    for newalias in ${pkg_aliases}; do
      local is_duplicate=""
      for alias in ${list_of_aliases}; do
        if [[ "$newalias" == "$alias" ]]; then
          is_duplicate=TRUE
          break
        fi
      done
      # Initialize new aliases
      if [[ "$is_duplicate" != "TRUE" ]]; then
        list_of_aliases="$list_of_aliases $newalias"
        eval alias_${newalias}=\"\"
      fi
      is_duplicate=""
      # Append package to alias list
      local pkg
      local pkglist
      eval pkg=$(${BASENAME} $file)
      pkg=${pkg%\.pkgconf}

      # Add prefex ('parsec' or 'splash2')to the pkg 
      pkg=${pkg/\./_}

      eval  pkglist=\"\$alias_${newalias}\"
      eval alias_${newalias}=\"$pkglist $pkg\"
    done
  done
}

# process_args
#
# Process args and setup argument-dependent environment
#
# Arguments: all arguments given to the script (i.e. "$@")
function process_args {
  # Default configuration to use
  default_pkgs="parsec splash2 splash2x"
  default_build="gcc"
  default_rundir="${PARSECDIR}"
  default_inputsize="test"
  default_nthreads="1"
  default_submit="time"

  # Usage
  usage="\
Usage: $me -a ACTION [OPTION]...

Manage the installation of the PARSEC benchmark suite.

Options:
    -a ACTION        Specifies the action to perform. See below for a
                     list of valid actions.
    -p PACKAGE       A list of packages or aliases on which the action is to be
                     performed.
    -c CONFIG        Which build configuration to use. Default: '$default_build'
    -d RUNDIR        Use directory RUNDIR as root in which to run the
                     benchmarks.
    -i INPUT         The input to use to run the benchmarks. Default: '$default_inputsize'
    -n THREADS       The minimum number of threads to use. Default: '$default_nthreads'
    -s SUBMIT        Command to use to submit the benchmark for execution.
                     Default: '$default_submit'
    -x EXTENSION     Extension to append to platform descriptor string.
                     Default: none
    -k               Keep & use run directory as found, do not unpack inputs for
                     benchmark execution. Assume everything is already set up.
    -m NETMODE       Execution mode for network workloads. 
                     NETMODE can be either 'server' or 'client'. 
    -t THREADS       The number of user threads talking to the upTCP/IP stack. Default: '1'
    -r THREADS       The number of TCP/IP protocol receving threads. Default: '1'
    -l               Disable log.
    -h               Displays this help message.


Actions:
    'build'          Builds and installs the specified packages.
    'run'            Runs the specified packages.
    'clean'          Removes all files generated during the build and run phase
                     of the listed packages for the current platform, but
                     leaves the installed files untouched.
    'uninstall'      Removes the installed files of the listed packages for the
                     current platform.
    'fullclean'      Like 'clean', but for all architectures.
    'fulluninstall'  Like 'uninstall', but for all architectures.
    'status'         Shows a summary of the current status of the PARSEC
                     installation.
    'info'           List available packages and configurations.


Examples (1) [Compatible to PARSEC 2.1 but Extended]:
    - Build all benchmarks of three suites, i.e., PARSEC, SPLASH-2 and SPLASH-2x:
        $me -a build -p all
    - Build only applications, use 'icc' as build configuration:
        $me -a build -c icc -p apps
    - Do a full cleanup after a build or benchmark run:
        $me -a fullclean -p all
    - Remove all generated files of the current architecture:
        $me -a uninstall -p all
    - Run benchmark 'ferret' w/ input 'simsmall' and 4 threads:
        $me -a run -p ferret -i simsmall -n 4
    - Get a quick summary of all available packages and features:
        $me -a info
    - Show which kernel binaries have been installed:
        $me -a status -p kernels


Examples (2) [NEW: Network Benchmarks]:
    - Check the status of all components involved in network benchmarks:
        $me -a status -p netapps
    - Build network benchmark 'netstreamcluster':
        $me -a build -p raytrace
    - Build all network benchmark:
        $me -a build -p netapps
    - Run network benchmark 'netdedup' w/ input 'native' and 2 server threads:
        $me -a run -p netdedup -i native -n 2
    - Run network benchmark 'netferret' w/ input 'simlarge', 4 server threads and 2 client connections:
        $me -a run -p netferret -i simlarge -n 4 -t 2
    - For simulation, run 'netdedup' server on a simulator w/ 4 threads and run client on a real machine:
        $me -a run -p netdedup -i simlarge -n 4 -m server
        $me -a run -p netdedup -i simlarge -m client
    - Do a full cleanup for network benchmarks:
        $me -a fullclean -p netapps


Examples (3) [NEW: SPLASH-2 Suite and SPLASH-2x Suite]:
    - Check the status of SPLASH-2 suite and SPLASH-2x suite:
        $me -a status -p splash2
        $me -a status -p splash2x
    - Build benchmark 'raytrace' from SPLASH-2x suite other than PARSEC:
        $me -a build -p splash2x.raytrace
        $me -a build -p raytrace   ## defaultly from PARSEC (for comparison)
    - Build benchmark 'fft' from SPLASH-2 suite with 'gcc-serial' build configuration:
        $me -a build -c gcc-serial -p splash2.fft
    - Build all benchmarks from SPLASH-2 suite and SPLASH-2x suite:
        $me -a build -p splash2
        $me -a build -p splash2x
    - Run benchmark 'fft' from SPLASH-2x w/ input 'simsmall' and 4 threads:
        $me -a run -p splash2x.fft -i simsmall -n 4
    - Do a full cleanup for SPLASH-2 suite
        $me -a fullclean -p splash2"

  # Define valid actions
  valid_actions="build run clean uninstall fullclean fulluninstall status info"

  # Parse arguments
  parsemode="none"
  need_arg_for=""
  action=""
  pkgs=""
  build=""
  rundir=""
  inputsize=""
  netmode=""
  nthreads=""
  userthreads=""
  rxthreads=""
  submit=""
  extension=""
  extcmd=""
  keep_rundir=""
  while [ ! -z "$1" ]; do
    arg="$1"
    case "${arg}" in
      "-a" )
        if [ ! -z "${need_arg_for}" ]; then
          echo "${oprefix} Error: ${parsemode} expected between '${need_arg_for}' and '-a'"
          echo "${usage}"
          exit 1
        fi
        if [ ! -z "${action}" ]; then
          echo "${oprefix} Error: Two actions specified"
          exit 1
        fi
        need_arg_for="-a"
        parsemode="ACTION";;
      "-p" )
        if [ ! -z "${need_arg_for}" ]; then
          echo "${oprefix} Error: ${parsemode} expected between '${need_arg_for}' and '-p'"
          echo "${usage}"
          exit 1
        fi
        need_arg_for="-p"
        parsemode="PKGS";;
      "-c" )
        if [ ! -z "${need_arg_for}" ]; then
          echo "${oprefix} Error: ${parsemode} expected between '${need_arg_for}' and '-c'"
          echo "${usage}"
          exit 1
        fi
        need_arg_for="-c"
        parsemode="CONFIG";;
      "-d" )
        if [ ! -z "${need_arg_for}" ]; then
          echo "${oprefix} Error: ${parsemode} expected between '${need_arg_for}' and '-d'"
          echo "${usage}"
          exit 1
        fi
        need_arg_for="-d"
        parsemode="RUNDIR";;
      "-i" )
        if [ ! -z "${need_arg_for}" ]; then
          echo "${oprefix} Error: ${parsemode} expected between '${need_arg_for}' and '-i'"
          echo "${usage}"
          exit 1
        fi
        need_arg_for="-i"
        parsemode="INPUT";;
      "-n" )
        if [ ! -z "${need_arg_for}" ]; then
          echo "${oprefix} Error: ${parsemode} expected between '${need_arg_for}' and '-n'"
          echo "${usage}"
          exit 1
        fi
        need_arg_for="-n"
        parsemode="NTHREADS";;
      "-t" )
        if [ ! -z "${need_arg_for}" ]; then
          echo "${oprefix} Error: ${parsemode} expected between '${need_arg_for}' and '-t'"
          echo "${usage}"
          exit 1
        fi
        need_arg_for="-t"
        parsemode="USERTHREADS";;
      "-r" )
        if [ ! -z "${need_arg_for}" ]; then
          echo "${oprefix} Error: ${parsemode} expected between '${need_arg_for}' and '-r'"
          echo "${usage}"
          exit 1
        fi
        need_arg_for="-r"
        parsemode="RXTHREADS";;
      "-s" )
        if [ ! -z "${need_arg_for}" ]; then
          echo "${oprefix} Error: ${parsemode} expected between '${need_arg_for}' and '-s'"
          echo "${usage}"
          exit 1
        fi
        need_arg_for="-s"
        parsemode="SUBMIT";;
      "-x" )
        if [ ! -z "${need_arg_for}" ]; then
          echo "${oprefix} Error: ${parsemode} expected between '${need_arg_for}' and '-x'"
          echo "${usage}"
          exit 1
        fi
        need_arg_for="-x"
        parsemode="EXTENSION";;
      "-X" )
        if [ ! -z "${need_arg_for}" ]; then
          echo "${oprefix} Error: ${parsemode} expected between '${need_arg_for}' and '-X'"
          echo "${usage}"
          exit 1
        fi
        need_arg_for="-X"
        parsemode="EXTCMD";;
      "-m" )
        if [ ! -z "${need_arg_for}" ]; then
          echo "${oprefix} Error: ${parsemode} expected between '${need_arg_for}' and '-m'"
          echo "${usage}"
          exit 1
        fi
        need_arg_for="-m"
        parsemode="NETMODE";;
     "-k" )
        if [ ! -z "${need_arg_for}" ]; then
          echo "${oprefix} Error: ${parsemode} expected between '${need_arg_for}' and '-k'"
          echo "${usage}"
          exit 1
        fi
        keep_rundir="yes";;
      "-h" )
        echo "${usage}"
        exit 0;;
      "-l" )
	create_log="FALSE";;
     *    )
        if [ ${arg:0:1} == "-" ]; then
          echo "${oprefix} Error: Unknown argument '${arg}'"
          echo "${usage}"
          exit 1
        fi
        need_arg_for=""
        case "${parsemode}" in
          "ACTION"   )
            parsemode="none"
            # Check whether specified action is valid
            is_valid=""
            for valid_action in ${valid_actions}; do
              if [ "${arg}" == "${valid_action}" ]; then
                is_valid="TRUE"
                break
              fi
            done
            if [ -z "$is_valid" ]; then
              echo "${oprefix} Error: Unknown action '${arg}'."
              echo "${usage}"
              exit 1
            fi
            action="${arg}";;
          "PKGS"   )
            # Check whether specified package is valid
            is_valid=""
            # Is it a recognized alias?
            tmparg=""
            tmparg=${arg/\./_} #arg could be "splash2" or "splash2.fmm"
            if [ ${tmparg} == ${arg} ]; then
                eval tmparg="\"\${alias_${arg}}\""
                if [ ! -z "${tmparg}" ]; then
                    is_valid="TRUE"
                else # parsec pkg 
                    tmparg=parsec_${arg}
                    arg=parsec.${arg}
                fi
            fi
            # Is it a recognized package?
            if [[ -e "${PARSECDIR}/config/packages/${arg}.pkgconf" ]]; then
              is_valid="TRUE"
            fi
            # Interpret result
            if [ -z "$is_valid" ]; then
              echo "${oprefix} Error: Invalid package '${arg}'."
              exit 1
            fi
            pkgs="${pkgs} ${tmparg}";;
          "CONFIG"   )
            parsemode="none"
            # Check whether specified config file exists
            buildfile="${PARSECDIR}/config/${arg}.bldconf"
            if [ ! -f "${buildfile}" ]; then
              echo "${oprefix} Error: Cannot find build configuration file '${buildfile}'."
              exit 1
            fi
            build="${arg}";;
          "RUNDIR"   )
           parsemode="none"
            # Check whether specified run directory exists
            if [ ! -d "${arg}" ]; then
              echo "${oprefix} Error: Cannot find directory '${arg}'."
              exit 1
            fi
            rundir="${arg}";;
          "INPUT"    )
            parsemode="none"
            # Check whether specified input set exists
            runconfigfile="${PARSECDIR}/config/${arg}.runconf"
            if [ ! -f "${runconfigfile}" ]; then
              echo "${oprefix} Error: Unknown input set '${arg}'."
              exit 1
            fi
            inputsize="${arg}";;
          "NTHREADS" )
            parsemode="none"
            declare -i nthreads
            nthreads="${arg}"
            # Note: This check also filters out strings (nthreads==0 in that case)
            if [ "${nthreads}" -lt "1" ]; then
              echo "${oprefix} Error: Illegal number of threads: '${arg}'."
              echo "${usage}"
              exit 1
            fi;;
          "USERTHREADS" )
            parsemode="none"
            userthreads="${arg}"
            # Note: This check also filters out strings (userthreads==0 in that case)
            if [ "${userthreads}" -lt "1" ]; then
              echo "${oprefix} Error: Illegal number of user threads: '${arg}'."
              echo "${usage}"
              exit 1
            fi;;
          "RXTHREADS" )
            parsemode="none"
            rxhreads="${arg}"
            # Note: This check also filters out strings (rxthreads==0 in that case)
            if [ "${rxthreads}" -lt "1" ]; then
              echo "${oprefix} Error: Illegal number of receiving threads: '${arg}'."
              echo "${usage}"
              exit 1
            fi;;
          "SUBMIT" )
            parsemode="none"
            # Check whether specified program exists
            cmd=$(echo "${arg}" | awk '{print $1}')
            if [ ! -e "${cmd}" ]; then
              # Check whether program is in path and give it a second try
              cmd=$(which ${cmd}); rv=$?
              if [ ! $rv -eq 0 ]; then
                echo "${oprefix} Error: Cannot find file '${arg}'."
                exit 1
              fi
            fi
            # Check whether specified file is executable
            if [ ! -x "${cmd}" ]; then
              echo "${oprefix} Error: '${arg}' is not executable."
              exit 1
            fi
            submit="${arg}";;
          "EXTENSION" )
            parsemode="none"
            extension="${arg}";;
          "EXTCMD" )
            parsemode="none"
            extpkg="${arg}"
            extcmd="${PARSECDIR}/toolkit/${extpkg}/${extpkg}.sh ${PARSECDIR}/toolkit/${extpkg}/parameter.cfg &"
            eval ${extcmd}
            echo ""
            echo "NOTE: The external package ${extpkg} is running in background. Please check results later."
            echo ""
            exit 0;;
         "NETMODE" )
            parsemode="none"
            if [ ! ${arg} == "server" ] && [ ! ${arg} == "client" ]; then
		echo "illegal value for NETMODE: NETMODE should be either 'server' or 'client'"
		exit 1
	    fi
            netmode="${arg}";;
         *        )
            echo "${oprefix} Error: Unknown argument '${arg}'"
            echo "${usage}"
            exit 1;;
        esac;;
    esac

    shift
  done
  if [ ! -z "${need_arg_for}" ]; then
    echo "${oprefix} Error: ${parsemode} expected after '${need_arg_for}'"
    echo "${usage}"
    exit 1
  fi

  # Make sure we have an action and at least one package
  if [ -z "${action}" ]; then
    echo "${oprefix} Error: No action specified."
    echo "${usage}"
    exit 1
  fi

  if [ -z "${pkgs}" ]; then
    # Is it a recognized alias?
    for arg in ${default_pkgs} ; do
            tmparg=""
            tmparg=${arg/\./_} #arg could be "splash2" or "splash2.fmm"
            if [ ${tmparg} == ${arg} ]; then
                eval tmparg="\"\${alias_${arg}}\""
                if [ -z "${tmparg}" ]; then
                    tmparg=parsec_${arg}
                    arg=parsec.${arg}
                fi
            fi
            pkgs="${pkgs} ${tmparg}"
    done
  fi

  # Set NTHREADS
  if [ -z "${nthreads}" ]; then
    # Use default value
    NTHREADS="${default_nthreads}"
  else
    NTHREADS="${nthreads}"
  fi

  # Set rundir
  if [ -z "${rundir}" ]; then
    # Use default value
    rundir="${default_rundir}"
  fi

  # Set input size
  if [ -z "${inputsize}" ]; then
    # Use default value
    inputsize="${default_inputsize}"
  fi

  # Set submit program
  if [ -z "${submit}" ]; then
    # Use default value
    submit="${default_submit}"
  fi

  # Determine build
  if [ -z "${build}" ]; then
    build="${default_build}"
  fi

  # Define PARSECPLAT, if not set by user
  if [ -z "${PARSECPLAT}" ]; then
    PARSECPLAT=${hostostype}.${build}
  else
    PARSECPLAT=${PARSECPLAT}.${build}
  fi
  # Append extension if specified
  if [ ! -z "${extension}" ]; then
    PARSECPLAT=${PARSECPLAT}.${extension}
  fi

  export PARSECPLAT
  # Load build configuration
  if [ "${action}" == "build" -o "${action}" == "run" ]; then
    buildfile="${PARSECDIR}/config/${build}.bldconf"
    if [ -f "${buildfile}" ]; then
      source ${buildfile}
    else
      echo "${oprefix} Error: Cannot find build configuration file '${buildfile}'."
      exit 1
    fi
  fi

  # Expand aliases to get full list of packages to build
  # there are three kinds of token in $pkgs:
  #    1) parsec_pthread, parsec_opemmp, etc. alias, remove "parsec_" and just expand them
  #    2) parsec_streamcluster etc. not alias but parsec workloads, just add them
  #    3) splash2_raytrace, splash2_xxx. not alias but splash2 workloads, just add them
  expanded_aliases=""
  for token in ${pkgs}; do
    # Is it a recognized alias?
    local tmpbench
    tmpbench=${token:0:5}
    if [ $tmpbench == "parsec" ]; then
        local tmppkg
        tmppkg=${token:7}
        eval temp="\"\${alias_${tmppkg}}\""
        if [ ! -z "${temp}" ]; then
          # Yes it is, expand alias
          expanded_aliases="${expanded_aliases} ${temp}"
        else
          # Otherwise keep it in the list
          expanded_aliases="${expanded_aliases} ${token}"
        fi
    else
        expanded_aliases="${expanded_aliases} ${token}"
    fi
  done

  # Rebuild list with packages, remove duplicate packages
  pkgs=""
  pkgs_nonapps="${alias_tools} ${alias_libs}"
  for pkg in $expanded_aliases; do
    is_included=""
    local tmppkg
    # restore to xxxx.xxxx format
    tmppkg=${pkg/_/\.}
    for dummy in $pkgs; do
      if [ "$tmppkg" == "$dummy" ]; then
        is_included="TRUE"
        break
      fi
    done

    if [ "${action}" == "run" ]; then
        for tmppkg2 in ${pkgs_nonapps}; do
           tmppkg3=${tmppkg2/_/\.}
           if [ "${tmppkg3}" == "$tmppkg" ]; then
                is_included="TRUE"
                break
           fi
        done
    fi

    if [ -z "$is_included" ]; then
      pkgs="${pkgs} ${tmppkg}"
    fi
  done

  # Initialize logging functionality
  logfile=""
  if [ "${action}" == "build" ]; then
    eval logfile="build_\$(${LOGDATE}).log"
  elif [ "${action}" == "run" ]; then
    eval logfile="run_${NTHREADS}_${inputsize}_\$(${LOGDATE}).log"
  fi
  if [ "$create_log" == "TRUE" ] && [ ! -z "$logfile" ]; then
    ${MKDIR} ${logdir}/${PARSECPLAT}
    log=${logdir}/${PARSECPLAT}/${logfile}
  else
    log="/dev/null"
  fi
}

# build_info
#
# Create a text file containing information about the build.
# Assumes that all relevant configuration files have already been sourced.
#
# Arguments: $1 - Package name
#            $2 - The name of the text file to create
function build_info {
  if [ -z "$1" ]; then
    echo "${oprefix} Error: build_info called with no arguments." 2>&1 | ${TEE} ${log}
    exit 1
  fi
  local package_name="$1"
  if [ -z "$2" ]; then
    echo "${oprefix} Error: build_info called with insufficient number of arguments." 2>&1 | ${TEE} ${log}
    exit 1
  fi
  local cinfo_file="$2"

  echo "PARSEC Compile Information" > ${cinfo_file}
  echo "==========================" >> ${cinfo_file}
  echo "Package '${package_name}'" >> ${cinfo_file}
  eval echo "Built on \$(${DATE})" >> ${cinfo_file}
  echo >> ${cinfo_file}

  # Package-specific build information
  local env_package="${build_env}"
  local build_conf_package="${build_conf} ${build_conf_global}"

  echo "Configure arguments: ${build_conf_package}" >> ${cinfo_file}
  echo >> ${cinfo_file}
  echo "Environment modifications: ${env_package}" >> ${cinfo_file}
  echo >> ${cinfo_file}

  echo "CC: ${CC}" >> ${cinfo_file}
  echo "Version: ${CC_ver}" >> ${cinfo_file}
  echo "CFLAGS: ${CFLAGS}" >> ${cinfo_file}
  echo >> ${cinfo_file}

  echo "CXX: ${CXX}" >> ${cinfo_file}
  echo "Version: ${CXX_ver}" >> ${cinfo_file}
  echo "CXXFLAGS: ${CXXFLAGS}" >> ${cinfo_file}
  echo >> ${cinfo_file}

  echo "CCAS: ${CCAS}" >> ${cinfo_file}
  echo "Version: ${CCAS_ver}" >> ${cinfo_file}
  echo "CCASFLAGS: ${CCASFLAGS}" >> ${cinfo_file}
  echo >> ${cinfo_file}

  echo "LD: ${LD}" >> ${cinfo_file}
  echo "Version: ${LD_ver}" >> ${cinfo_file}
  echo "LDFLAGS: ${LDFLAGS}" >> ${cinfo_file}
  echo >> ${cinfo_file}

  echo "JAVAC: ${JAVAC}" >> ${cinfo_file}
  echo "Version: ${JAVAC_ver}" >> ${cinfo_file}
  echo "JFLAGS: ${JFLAGS}" >> ${cinfo_file}
  echo >> ${cinfo_file}

  echo "[EOF]" >> ${cinfo_file}
}

# build_package
#
# Build a software package and recursively all packages it depends on
#
# Arguments: $1 - The package name
function build_package {
  if [ -z "$1" ]; then
    echo "${oprefix} Error: build_package called with no arguments." 2>&1 | ${TEE} ${log}
    exit 1
  fi
  local pkg=$1

  echo "${oprefix} [---------- Analyzing package ${pkg} ----------]" 2>&1 | ${TEE} ${log}

  # Load package configuration
  source ${PARSECDIR}/config/packages/${pkg}.pkgconf

  # Define package-specific directories
  if [ -z "$pkg_group" ]; then
    echo "${oprefix} Error: Group of package ${pkg} is unknown." 2>&1 | ${TEE} ${log}
    exit 1
  fi

  # determine top directory
  local bench
  bench=`expr match ${pkg} '\(.*\.\)'`
  eval pkgname="${pkg#${bench}}"
  bench=${bench%\.}

  if [ ${bench} == "parsec" ]; then
      benchdir="pkgs"
  else
      eval benchdir="ext\/${bench}"
  fi
  
  local pkgdir=${PARSECDIR}/${benchdir}/${pkg_group}/${pkgname}
  local pkgsrcdir=${pkgdir}/src
  local pkgobjdir=${pkgdir}/obj/${PARSECPLAT}
  local pkginstdir=${pkgdir}/inst/${PARSECPLAT}
  local pkgparsecdir=${pkgdir}/parsec

  # Check whether package has already been built
  if [ -f "${pkginstdir}/build-info" ]; then
    echo "${oprefix} Package ${pkg} already exists, proceeding." 2>&1 | ${TEE} ${log}
    return 0
  fi

  # Source local build configuration to get dependencies
  if [ ! -f "${pkgparsecdir}/${build}.bldconf" ]; then
    echo "${oprefix} Error: Cannot find local build configuration '${build}.bldconf' for package ${pkg}." 2>&1 | ${TEE} ${log}
    exit 1
  else
    source ${pkgparsecdir}/${build}.bldconf
  fi

  # Build packages on which pkg depends
  if [ -z "${build_deps}" ]; then
    echo "${oprefix} ${pkg} does not depend on any other packages." 2>&1 | ${TEE} ${log}
  else
    echo "${oprefix} ${pkg} depends on: ${build_deps}" 2>&1 | ${TEE} ${log}
  fi

  local dep=""
  for dep in ${build_deps}; do
    local tmpdep
    local index
    tmpdep=${dep}
    eval index=`expr "${dep}" : '\.'`
    if [ $index -eq 0 ]; then
        eval tmpdep="parsec.${dep}"
    fi
    build_package "${tmpdep}"
  done

  # Now build pkg itself
  echo "${oprefix} [---------- Building package ${pkg} ----------]" 2>&1 | ${TEE} ${log}

  # Source local package build configuration again (might have gotten overwritten by recursion)
  if [ ! -f "${pkgparsecdir}/${build}.bldconf" ]; then
    echo "${oprefix} Error: Cannot find local build configuration '${build}.bldconf' for package ${pkg}." 2>&1 | ${TEE} ${log}
    exit 1
  else
    source ${pkgparsecdir}/${build}.bldconf
  fi

  # Check for obvious errors
  if [ -z "${build_inplace}" ]; then
    echo "${oprefix} Variable 'build_inplace' for package '${benchmark}' has not been set in file '${build}.bldconf'." | ${TEE} ${log}
    exit 1
  fi

  # Global arguments to configure script
  build_conf_global="--prefix=${pkginstdir}"

  # We need either configure or a Makefile
  if [ ! -x ${pkgsrcdir}/configure -a ! -f ${pkgsrcdir}/[Mm]akefile ]; then
    echo "${oprefix} Error: Need 'configure' script or a '[Mm]akefile' to build package ${pkg}." 2>&1 | ${TEE} ${log}
    exit 1
  fi

  # Remove an already existing build directory
  if [ -e "${pkgobjdir}" ]; then
     echo "${oprefix} Removing old build directory." 2>&1 | ${TEE} ${log}
     ${RM} ${pkgobjdir} 
  fi

  # Set up build directory
  if [ "${build_inplace}" == "TRUE" ]; then
    local pkgbuildsrcdir=${pkgobjdir}
    echo "${oprefix} Copying source code of package ${pkg}." 2>&1 | ${TEE} ${log}
    ${MKDIR} ${pkgobjdir} > /dev/null
    ${CP} ${pkgsrcdir}/* ${pkgobjdir}
  else
    local pkgbuildsrcdir=${pkgsrcdir}
    ${MKDIR} ${pkgobjdir} > /dev/null
  fi
  pushd ${pkgobjdir} > /dev/null

  # Run configure
  if [ -x ${pkgbuildsrcdir}/configure ]; then
    local build_conf_pkg="${build_conf} ${build_conf_global}"
    # Current pwd is $pkgobjdir
    if [ "${pkgobjdir}" == "${pkgbuildsrcdir}" ]; then
      local configcmd="env ${build_env} ./configure ${build_conf_pkg}"
    else
      local configcmd="env ${build_env} ${pkgbuildsrcdir}/configure ${build_conf_pkg}"
    fi
    eval echo "${oprefix} Running \'${configcmd}\':" 2>&1 \| ${TEE} ${log}
    eval \( ${configcmd} 2>&1 \) 2>&1 \| ${TEE} ${log} \; retval=\${PIPESTATUS[0]}
    if [ "$retval" -ne "0" ]; then
      eval echo "${oprefix} Error: \'${configcmd}\' failed." 2>&1 \| ${TEE} ${log}
      popd > /dev/null
      exit 1
    fi
  fi
  
  # Make sure a Makefile exists in the build directory
  if [ ! -f ${pkgobjdir}/[Mm]akefile ]; then
    echo "${oprefix} Error: Cannot find Makefile in ${pkgobjdir}" 2>&1 | ${TEE} ${log}
    popd > /dev/null
    exit 1
  fi

  # Run make
  local makecmd="env ${build_env} ${MAKE}"
  eval echo "${oprefix} Running \'$makecmd\':" 2>&1 \| ${TEE} ${log}
  eval \( ${makecmd} 2>&1 \) 2>&1 \| ${TEE} ${log} \; retval=\${PIPESTATUS[0]}
  if [ "$retval" -ne "0" ]; then
    eval echo "${oprefix} Error: \'${makecmd}\' failed." 2>&1 \| ${TEE} ${log}
    popd > /dev/null
    exit 1
  fi

  # Run make install
  ${MKDIR} ${pkginstdir} > /dev/null
  local makecmd="env ${build_env} ${MAKE} install"
  eval echo "${oprefix} Running \'$makecmd\':" 2>&1 \| ${TEE} ${log}
  eval \( ${makecmd} 2>&1 \) 2>&1 \| ${TEE} ${log} \; retval=\${PIPESTATUS[0]}
  if [ "$retval" -ne "0" ]; then
    eval echo "${oprefix} Error: \'${makecmd}\' failed." 2>&1 \| ${TEE} ${log}
    popd > /dev/null
    exit 1
  fi

  popd > /dev/null
  pushd ${pkginstdir} > /dev/null

  # Create build info file
  build_info ${pkg} ${pkginstdir}/build-info

  # Finish up
  popd > /dev/null
}

# run_benchmark
#
# Run the specified benchmarks
#
# Arguments: $1 - The benchmark name
#            $2 - Which input to use
#            $3 - The run directory root
function run_benchmark {
  if [ -z "$1" ]; then
    echo "${oprefix} Error: run_benchmark called with no arguments." | ${TEE} ${log}
    exit 1
  fi
  local benchmark=$1
  if [ -z "$2" ]; then
      echo "${oprefix} Error: run_benchmark called with insufficient number of arguments." | ${TEE} ${log}
    exit 1
  fi
  local inputsize=$2
  if [ -z "$3" ]; then
    if [ ${benchmark} == "parsec.uptcpip" ]; then
        exit 1
    fi
    echo "${oprefix} Error: run_benchmark called with insufficient number of arguments." | ${TEE} ${log}
    exit 1
  fi
  local cite_list=$3
  if [ -z "$4" ]; then
    echo "${oprefix} Error: run_benchmark called with insufficient number of arguments." | ${TEE} ${log}
    exit 1
  fi
  local rundir=$4


  echo "${oprefix} [========== Running benchmark ${benchmark} [${cite_list}] ==========]" | ${TEE} ${log}

  # Load package configuration
  source ${PARSECDIR}/config/packages/${benchmark}.pkgconf

  # Define benchmark-specific directories
  if [ -z "${pkg_group}" ]; then
    echo "${oprefix} Error: Group of benchmark '${benchmark}' is unknown." | ${TEE} ${log}
    exit 1
  fi


  # determine top directory
  local bench
  bench=`expr match ${benchmark} '\(.*\.\)'`
  eval pkgname="${benchmark#${bench}}"
  bench=${bench%\.}

  # deal with some specific cases
  if [ ${bench} == "parsec" ]; then
      eval benchdir="pkgs"
  else
      eval benchdir="ext/${bench}"
  fi

  # splash2 does not support multiple inputs 
  if [ ${bench} == "splash2" ]; then
      inputsize="test"
      echo "${oprefix} NOTE: SPLASH-2 only supports \"test\" input sets." | ${TEE} ${log}
      echo "${oprefix}       Please use SPLASH-2x for multiple input sets." | ${TEE} ${log}
  fi

  # splash2 does not support multiple inputs 
  if [ ${bench} == "splash2" ]; then
      inputsize="test"
      echo "${oprefix} NOTE: SPLASH-2 only supports \"test\" input sets." | ${TEE} ${log}
      echo "${oprefix}       Please use SPLASH-2x for multiple input sets." | ${TEE} ${log}
  fi

  local platform
  platform=${PARSECPLAT/serial/REPLACED} # check if gcc-serial
  if [ ${platform} != ${PARSECPLAT}  ]; then
      if [ "${NTHREADS}" -gt "1" ]; then
          NTHREADS=1
          echo "${oprefix} WARNING: Serial does not support multiple threads." | ${TEE} ${log}
          echo "${oprefix}          Change thread number to default 1." | ${TEE} ${log}
      fi
  fi

  # specific cases end
  #
  
  local bmrundir="${rundir}/${benchdir}/${pkg_group}/${pkgname}/run"
  local bmdir="${PARSECDIR}/${benchdir}/${pkg_group}/${pkgname}"
  local bminputdir="${bmdir}/inputs"
  local bmoutputdir="${bmdir}/outputs"
  local bminstdir="${bmdir}/inst/${PARSECPLAT}"
  local bmparsecdir="${bmdir}/parsec"

  # netapps leverages existing benchmark's inputs
  if [ ${pkg_group} == "netapps" ]; then
	if [ ${pkgname} == "netdedup" ] || [ ${pkgname} == "netstreamcluster" ]; then
		bminputdir=${bminputdir/netapps\/net/kernels\/}
	elif [ ${pkgname} == "netferret" ]; then
		bminputdir=${bminputdir/netapps\/net/apps\/}
	fi
  fi
 
  # Check whether selected input size is available
  if [ ! -f "${PARSECDIR}/config/${inputsize}.runconf" ]; then
    echo "${oprefix} Error: Selected input size not available."  2>&1 | ${TEE} ${log}
    exit 1
  fi

  # Source package run configuration
  if [ ! -f "${bmparsecdir}/${inputsize}.runconf" ]; then
    echo "${oprefix} Error: Cannot find run configuration '${inputsize}.runconf' for package ${benchmark}." 2>&1 | ${TEE} ${log}
    exit 1
      get_topdir "${package}"
  else
    source ${bmparsecdir}/${inputsize}.runconf
  fi

  # Determine binary
  local bmexec_suffix=${run_exec}
  if [ -z "${bmexec_suffix}" ]; then
    echo "${oprefix} Variable 'bench_exec_${benchmark}' for package '${benchmark}' has not been set." | ${TEE} ${log}
    exit 1
  fi
  local bmexec="${bminstdir}/${bmexec_suffix}"
  if [ ! -x "${bmexec}" ]; then
    echo "${oprefix} Error: Binary '${bmexec}' of package '${benchmark}' cannot be found." | ${TEE} ${log}
    exit 1
  fi

  # Determine output archive
  local bmoutput="${bmoutputdir}/output_${inputsize}.tar"
  #if [ ! -f "${bmoutput}" ]; then
  #  echo "${oprefix} Error: Output archive '${bmoutput}' of package '${benchmark}' cannot be found." | ${TEE} ${log}
  #  exit 1
  #fi

  if [ "${keep_rundir}" == "yes" ]; then
    # Keep run directory, just check that it exists
    if [ ! -d "${bmrundir}" ]; then
      echo "${oprefix} Error: Cannot keep run directory because it does not exist." | ${TEE} ${log} 
      exit 1
    fi
    echo "${oprefix} Keeping old run directory." | ${TEE} ${log}
    pushd "${bmrundir}" > /dev/null
  else 
    # Set up run directory
    if [ -d "${bmrundir}" ]; then
      echo "${oprefix} Deleting old run directory." | ${TEE} ${log}
      ${RM} ${bmrundir} | ${TEE} ${log}
    fi

    echo "${oprefix} Setting up run directory." | ${TEE} ${log}
    ${MKDIR} ${bmrundir} | ${TEE} ${log}
    pushd "${bmrundir}" > /dev/null
    
    # Determine input archive
    local bminput="${bminputdir}/input_${inputsize}.tar"
    if [ ! -f "${bminput}" ]; then
      echo "${oprefix} No archive for input '${inputsize}' available, skipping input setup." | ${TEE} ${log}
    else
      echo "${oprefix} Unpacking benchmark input '${inputsize}'." | ${TEE} ${log}
      ${UNTAR} ${bminput} | ${TEE} ${log}
    fi
  fi

  # Execute
  local bmexec_args=${run_args}
  if [ ! -z ${netmode} ]; then
      bmexec_args="${bmexec_args} ${netmode}"
  fi 
  if [ ! -z ${userthreads} ]; then
      bmexec_args="${bmexec_args} ${userthreads}"
  fi 
  if [ ! -z ${rxthreads} ]; then
      UPTCPIP_RX_THREADS="${rxthreads}"
      export UPTCPIP_RX_THREADS
  else
      UPTCPIP_RX_THREADS=1
      export UPTCPIP_RX_THREADS
  fi 
  eval cmd="\"${submit} ${bmexec} ${bmexec_args}\""
  echo "${oprefix} Running '${cmd}':" | ${TEE} ${log}
  echo "${oprefix} [---------- Beginning of output ----------]" | ${TEE} ${log}
  (eval ${cmd} 2>&1) 2>&1 | ${TEE} ${bmrundir}/benchmark.out | ${TEE} ${log}
  echo "${oprefix} [----------    End of output    ----------]" | ${TEE} ${log}


  # Unpack reference output and compare
  #echo "${oprefix} Unpacking benchmark reference output for '${inputsize}'." | ${TEE} ${log}
  #${MKDIR} ${bmrundir}/output.ref | ${TEE} ${log}
  #cd ${bmrundir}/output.ref
  #${UNTAR} ${bmoutput} | ${TEE} ${log}

  #echo "${oprefix} Checking benchmark output:" | ${TEE} ${log}
  #bmcorrect="TRUE"
  #for outfile in *; do
  #  echo -n "${oprefix}   ${outfile} - " | ${TEE} ${log}
  #  if [ ! -f "${bmrundir}/${outfile}" ]; then
  #    echo "MISSING" | ${TEE} ${log}
  #    bmcorrect="FALSE"
  #  else
  #    ${CMP} ${bmrundir}/output.ref/${outfile} ${bmrundir}/${outfile} > /dev/null
  #    if [ "$?" == "0" ]; then
  #      echo "PASSED" | ${TEE} ${log}
  #    else
  #      echo "FAILED" | ${TEE} ${log}
  #      bmcorrect="FALSE"
  #    fi
  #  fi
  #done
  #if [ "${bmcorrect}" != "TRUE" ]; then
  #  echo "${oprefix} Error: Benchmark not correctly executed." | ${TEE} ${log}
  #  exit 1
  #else
  #  echo "${oprefix} Benchmark correctly executed." | ${TEE} ${log}
  #fi
  popd > /dev/null
}

function get_topdir {
  if [ -z "$1" ]; then
    echo "${oprefix} Error: get_topdir with no arguments." | ${TEE} ${log}
    exit 1
  fi
  local benchmark=$1

  # determine top directory
  benchdir=""
  pkgname=""
  local bench
  
  bench=`expr match ${benchmark} '\(.*\.\)'`
  eval pkgname="${benchmark#${bench}}"
  bench=${bench%\.}

  if [ ${bench} == "parsec" ]; then
      benchdir="pkgs"
  else
      eval benchdir="ext\/${bench}"
  fi
}

#################################################################
#                                                               #
#                             MAIN                              #
#                                                               #
#################################################################

# Check version
if [ ${BASH_VERSINFO[0]} -lt 3 ]; then
  # We need certain Bash 3 features. e.g. PIPESTATUS (which was available but broken in earlier versions)
  echo "${oprefix} Warning: At least bash version 3 is recommended. Earlier versions might not function properly. Current version is $BASH_VERSION."
fi

# Execute functions to setup environment
parsec_init
process_args "$@"

# Now we take decisive action
case ${action} in
  "build"         )
    eval echo "${oprefix} \[========== PARSEC $(${CAT} ${PARSECDIR}/version) BUILD LOGFILE ==========\]" > ${log}
    echo >> ${log}
    eval echo "${oprefix} Build '${PARSECPLAT}' started on \$(${DATE})." >> ${log}
    echo "${oprefix} Packages to build: ${pkgs}" 2>&1 | ${TEE} ${log}

    # Prepare LD_LIBRARY_PATH (some build systems call their own binaries)
    LD_LIBRARY_PATH_orig="${LD_LIBRARY_PATH}"
    if [ -z "${LD_LIBRARY_PATH}" ]; then
      export LD_LIBRARY_PATH="${CC_HOME}/lib:${CC_HOME}/lib64"
    else
      LD_LIBRARY_PATH="${CC_HOME}/lib:${CC_HOME}/lib64:${LD_LIBRARY_PATH}"
    fi

    # Initialize local variables
    list_of_bibentries=""

    # Build all packages
    for pkg in ${pkgs}; do

      # Load package configuration
      source ${PARSECDIR}/config/packages/${pkg}.pkgconf

      cite_list=""
      for bibkey in ${pkg_cite}; do
        i=1
        is_duplicate=""
        for bib in ${list_of_bibentries}; do
          if [[ "${bibkey}" == "${bib}" ]]; then
            is_duplicate="TRUE"
            break
          fi
          ((i++))
        done
        if [[ -z "${is_duplicate}" ]]; then
          # A unique entry, append to bibliography list
          # (Note: Order is important because of the numbering)
          list_of_bibentries="${list_of_bibentries} ${bibkey}"
        fi
        # Always append citation number to list of citations for component
        if [[ -z "${cite_list}" ]]; then
          cite_list="$i"
        else
          cite_list="${cite_list},${i}"
        fi
      done


      echo | ${TEE} ${log}
      echo "${oprefix} [========== Building package ${pkg} [${cite_list}] ==========]" | ${TEE} ${log}
      build_package "${pkg}"
    done

    # Bibliography list
    echo "${oprefix}"
    echo "${oprefix} BIBLIOGRAPHY"
    echo "${oprefix}"
    # Initialize variables & iterate through list of used bib entries
    i=1
    for bibkey in ${list_of_bibentries}; do
      bibfile="${PARSECDIR}/config/bibliography/${bibkey}.bibconf"
      if [[ -f ${bibfile} ]]; then
        source ${bibfile}
        echo "${oprefix} [${i}] ${bib_string}"
      else
        echo "${oprefix} [${i}] ERROR: File '${bibkey}.bibconf' does not exist."
      fi
      ((i++))
    done
    echo "${oprefix}"
 

    # Restore LD_LIBRARY_PATH
    LD_LIBRARY_PATH="${LD_LIBRARY_PATH_orig}"

    echo "${oprefix} Done." | ${TEE} ${log};;
  "run"           )
    eval echo "${oprefix} \[========== PARSEC $(${CAT} ${PARSECDIR}/version) RUN LOGFILE ==========\]" > ${log}
    echo >> ${log}
    eval echo "${oprefix} Run with '${PARSECPLAT}' binaries and input ${inputsize} started on \$(${DATE})." >> ${log}
  #  echo "${oprefix} Using ${rundir} as run directory root." >> ${log}
    echo "${oprefix} Benchmarks to run: ${pkgs}" 2>&1 | ${TEE} ${log}

    # Prepare LD_LIBRARY_PATH
    LD_LIBRARY_PATH_orig="${LD_LIBRARY_PATH}"
    if [ -z "${LD_LIBRARY_PATH}" ]; then
      export LD_LIBRARY_PATH="${CC_HOME}/lib:${CC_HOME}/lib64"
    else
      LD_LIBRARY_PATH="${CC_HOME}/lib:${CC_HOME}/lib64:${LD_LIBRARY_PATH}"
    fi

    # Initialize local variables
    list_of_bibentries=""

    # Execute all benchmarks
    for benchmark in ${pkgs}; do

      # Load package configuration
      source ${PARSECDIR}/config/packages/${benchmark}.pkgconf

      cite_list=""
      for bibkey in ${pkg_cite}; do
        i=1
        is_duplicate=""
        for bib in ${list_of_bibentries}; do
          if [[ "${bibkey}" == "${bib}" ]]; then
            is_duplicate="TRUE"
            break
          fi
          ((i++))
        done
        if [[ -z "${is_duplicate}" ]]; then
          # A unique entry, append to bibliography list
          # (Note: Order is important because of the numbering)
          list_of_bibentries="${list_of_bibentries} ${bibkey}"
        fi
        # Always append citation number to list of citations for component
        if [[ -z "${cite_list}" ]]; then
          cite_list="$i"
        else
          cite_list="${cite_list},${i}"
        fi
      done

      echo | ${TEE} ${log}
      run_benchmark "${benchmark}" "${inputsize}" "${cite_list}" "${rundir}"
    done

    # Bibliography list
    echo "${oprefix}"
    echo "${oprefix} BIBLIOGRAPHY"
    echo "${oprefix}"
    # Initialize variables & iterate through list of used bib entries
    i=1
    for bibkey in ${list_of_bibentries}; do
      bibfile="${PARSECDIR}/config/bibliography/${bibkey}.bibconf"
      if [[ -f ${bibfile} ]]; then
        source ${bibfile}
        echo "${oprefix} [${i}] ${bib_string}"
      else
        echo "${oprefix} [${i}] ERROR: File '${bibkey}.bibconf' does not exist."
      fi
      ((i++))
    done
    echo "${oprefix}"
 
    # Restore LD_LIBRARY_PATH
    LD_LIBRARY_PATH="${LD_LIBRARY_PATH_orig}"

    echo "${oprefix} Done." | ${TEE} ${log};;
  "clean"         )
    echo "${oprefix} Removing build and run files for build '${PARSECPLAT}':"
    for package in ${pkgs}; do
      # Load package configuration
      source ${PARSECDIR}/config/packages/${package}.pkgconf

      get_topdir "${package}"
      # Setup
      packagedir="${PARSECDIR}/${benchdir}/${pkg_group}/${pkgname}"
      packageobjdir="${packagedir}/obj/${PARSECPLAT}"
      packageparsecdir="${packagedir}/parsec"
      packagerundir="${rundir}/${benchdir}/${pkg_group}/${pkgname}/run"
      cleanenv="sysconfig=\"${sysconfig}\" packagedir=\"${packagedir}\""
      nothingtodo=""

      echo -n "${oprefix} ${package} - "

      # Remove build directory
      if [ -d "${packageobjdir}" ]; then
        echo -n "[Removing build '${PARSECPLAT}'] "
        ${RM} ${packageobjdir}
        nothingtodo="FALSE"
      fi

      # Remove run directory
      if [ -d "${packagerundir}" ]; then
        echo -n "[Removing run directory]"
        ${RM} ${packagerundir}
        nothingtodo="FALSE"
      fi

      # Finish
      if [ -z "${nothingtodo}" ]; then
        echo -n "[Nothing to do]"
      fi
      echo ""
    done
    exit 0;;
  "uninstall"     )
    echo "${oprefix} Removing installations for build '${PARSECPLAT}':"
    for package in ${pkgs}; do
      # Load package configuration
      source ${PARSECDIR}/config/packages/${package}.pkgconf

      get_topdir "${package}"

      # Setup
      packagedir="${PARSECDIR}/${benchdir}/${pkg_group}/${pkgname}"
      packageinstdir="${packagedir}/inst/${PARSECPLAT}"
      packageparsecdir="${packagedir}/parsec"
      cleanenv="sysconfig=\"${sysconfig}\" packagedir=\"${packagedir}\""
      nothingtodo=""

      echo -n "${oprefix} ${package} - "

      # Remove inst directory
      if [ -d "${packageinstdir}" ]; then
        echo -n "[Removing installation '${PARSECPLAT}'] "
        ${RM} ${packageinstdir}
        nothingtodo="FALSE"
      fi

      # Finish
      if [ -z "${nothingtodo}" ]; then
        echo -n "[Nothing to do]"
      fi
      echo ""
    done
    exit 0;;
  "fullclean"     )
    echo "${oprefix} Removing all build and run files:"
    for package in ${pkgs}; do
      # Load package configuration
      source ${PARSECDIR}/config/packages/${package}.pkgconf

      get_topdir "${package}"
      # Setup
      packagedir="${PARSECDIR}/${benchdir}/${pkg_group}/${pkgname}"
      packageobjdir="${packagedir}/obj"
      packageparsecdir="${packagedir}/parsec"
      packagerundir="${rundir}/${benchdir}/${pkg_group}/${pkgname}/run"
      cleanenv="sysconfig=\"${sysconfig}\" packagedir=\"${packagedir}\""
      nothingtodo=""

      echo -n "${oprefix} ${package} - "

      # Remove obj directory
      if [ -d "${packageobjdir}" ]; then
        echo -n "[Removing build directory] "
        ${RM} ${packageobjdir}
        nothingtodo="FALSE"
      fi

      # Remove run directory
      if [ -d "${packagerundir}" ]; then
        echo -n "[Removing run directory] "
        ${RM} ${packagerundir}
        nothingtodo="FALSE"
      fi

      # Finish
      if [ -z "${nothingtodo}" ]; then
        echo -n "[Nothing to do]"
      fi
      echo ""
    done
    exit 0;;
  "fulluninstall" )
    echo "${oprefix} Removing all installed files:"
    for package in ${pkgs}; do
      # Load package configuration
      source ${PARSECDIR}/config/packages/${package}.pkgconf

      get_topdir "${package}"
      # Setup
      packagedir="${PARSECDIR}/${benchdir}/${pkg_group}/${pkgname}"
      packageinstdir="${packagedir}/inst"
      packageparsecdir="${packagedir}/parsec"
      cleanenv="sysconfig=\"${sysconfig}\" packagedir=\"${packagedir}\""
      nothingtodo=""

      echo -n "${oprefix} ${package} - "

      # Remove inst directory
      if [ -d "${packageinstdir}" ]; then
        echo -n "[Removing installation directory]"
        ${RM} ${packageinstdir}
        nothingtodo="FALSE"
      fi

      # Finish
      if [ -z "${nothingtodo}" ]; then
        echo -n "[Nothing to do]"
      fi
      echo ""
    done
    exit 0;;
  "status"        )
    echo "${oprefix} Installation status of selected packages: "

    # Initialize local variables
    list_of_bibentries=""

    for package in ${pkgs}; do
      # Load package configuration
      source ${PARSECDIR}/config/packages/${package}.pkgconf

      echo "${oprefix}"
      cite_list=""
      for bibkey in ${pkg_cite}; do
        i=1
        is_duplicate=""
        for bib in ${list_of_bibentries}; do
          if [[ "${bibkey}" == "${bib}" ]]; then
            is_duplicate="TRUE"
            break
          fi
          ((i++))
        done
        if [[ -z "${is_duplicate}" ]]; then
          # A unique entry, append to bibliography list
          # (Note: Order is important because of the numbering)
          list_of_bibentries="${list_of_bibentries} ${bibkey}"
        fi
        # Always append citation number to list of citations for component
        if [[ -z "${cite_list}" ]]; then
          cite_list="$i"
        else
          cite_list="${cite_list},${i}"
        fi
      done

      get_topdir "${package}"

      echo "${oprefix} ${package} [${cite_list}]:"
      packageinstdir="${PARSECDIR}/${benchdir}/${pkg_group}/${pkgname}/inst"
      if [ -d "${packageinstdir}" ]; then
        build_arch_dirs="$(${LS} ${packageinstdir})"
        if [ -z "${build_arch_dirs}" ]; then
          echo -e "${oprefix}   -no installations-"
        else
          found_insts="FALSE"
          for archdir in $build_arch_dirs; do
            if [ -f "${packageinstdir}/${archdir}/build-info" ]; then
              echo -e "${oprefix}   ${archdir}"
              found_insts="TRUE"
            fi
          done
          if [ "${found_insts}" == "FALSE" ]; then
            echo -e "${oprefix}   -no installations-"
          fi
        fi
      else
        echo -e "${oprefix}   -no installations-"
      fi
    done

    # Bibliography list
    echo "${oprefix}"
    echo "${oprefix} BIBLIOGRAPHY"
    echo "${oprefix}"
    # Initialize variables & iterate through list of used bib entries
    i=1
    for bibkey in ${list_of_bibentries}; do
      bibfile="${PARSECDIR}/config/bibliography/${bibkey}.bibconf"
      if [[ -f ${bibfile} ]]; then
        source ${bibfile}
        echo "${oprefix} [${i}] ${bib_string}"
      else
        echo "${oprefix} [${i}] ERROR: File '${bibkey}.bibconf' does not exist."
      fi
      ((i++))
    done
 
    exit 0;;
  "info"        )
    # Initialize local variables
    list_of_bibentries=""
    parsecversion="$(${CAT} ${PARSECDIR}/version)"
    # Output header
    echo "${oprefix} PARSEC Distribution v${parsecversion}"
    echo "${oprefix}"
    # List all available packages
    echo "${oprefix} PACKAGES"
    echo "${oprefix}"
    for file in ${PARSECDIR}/config/packages/*.pkgconf; do
      # Get package name
      eval package=$(${BASENAME} $file)
      package=${package%\.pkgconf}
      # Load package configuration
      source ${PARSECDIR}/config/packages/${package}.pkgconf
      # Update bibliography list & get citation reference numbers
      cite_list=""
      for bibkey in ${pkg_cite}; do
        i=1
        is_duplicate=""
        for bib in ${list_of_bibentries}; do
          if [[ "${bibkey}" == "${bib}" ]]; then
            is_duplicate="TRUE"
            break
          fi
          ((i++))
        done
        if [[ -z "${is_duplicate}" ]]; then
          # A unique entry, append to bibliography list
          # (Note: Order is important because of the numbering)
          list_of_bibentries="${list_of_bibentries} ${bibkey}"
        fi
        # Always append citation number to list of citations for component
        if [[ -z "${cite_list}" ]]; then
          cite_list="$i"
        else
          cite_list="${cite_list},${i}"
        fi
      done
      # Create output
      echo "${oprefix} ${package} [${cite_list}] (${pkg_domain})"
      echo "${oprefix} ${pkg_desc}"
      echo "${oprefix}   Package Group: ${pkg_group}"
      echo "${oprefix}   Contributor:   ${pkg_contrib}"
      echo "${oprefix}   Aliases:       ${pkg_aliases}"
      echo "${oprefix}"
    done
    # List all available input sets
    echo "${oprefix} INPUT SETS"
    echo "${oprefix}"
    for inputfile in ${PARSECDIR}/config/*.runconf; do
      # Get input name
      inputname=$(${BASENAME} ${inputfile})
      inputname=${inputname/%.runconf/}
      # Load configuration file
      source ${inputfile}
      # Update bibliography list & get citation reference numbers
      cite_list=""
      for bibkey in ${pkg_cite}; do
        i=1
        is_duplicate=""
        for bib in ${list_of_bibentries}; do
          if [[ "${bibkey}" == "${bib}" ]]; then
            is_duplicate="TRUE"
            break
          fi
          ((i++))
        done
        if [[ -z "${is_duplicate}" ]]; then
          # A unique entry, append to bibliography list
          # (Note: Order is important because of the numbering)
          list_of_bibentries="${list_of_bibentries} ${bibkey}"
        fi
        # Always append citation number to list of citations for component
        if [[ -z "${cite_list}" ]]; then
          cite_list="$i"
        else
          cite_list="${cite_list},${i}"
        fi
      done
      # Output information
      echo "${oprefix} ${inputname} [${cite_list}]"
      echo "${oprefix} ${run_desc}"
      echo "${oprefix}"
    done
    # List all supported build configurations
    echo "${oprefix} BUILD CONFIGURATIONS"
    echo "${oprefix}"
    build_config_files=$(ls ${PARSECDIR}/config/*.bldconf)
    for file in ${build_config_files}; do
      config_file_base=$(${BASENAME} ${file})
      echo "${oprefix} ${config_file_base%.bldconf}"
    done
    # Bibliography list
    echo "${oprefix}"
    echo "${oprefix} BIBLIOGRAPHY"
    echo "${oprefix}"
    # Initialize variables & iterate through list of used bib entries
    i=1
    for bibkey in ${list_of_bibentries}; do
      bibfile="${PARSECDIR}/config/bibliography/${bibkey}.bibconf"
      if [[ -f ${bibfile} ]]; then
        source ${bibfile}
        echo "${oprefix} [${i}] ${bib_string}"
      else
        echo "${oprefix} [${i}] ERROR: File '${bibkey}.bibconf' does not exist."
      fi
      ((i++))
    done
    exit 0;;
  *           )
    echo "${oprefix} Error: Unknown action '${action}'."
    exit 1;;
esac

exit 0
