#!/bin/bash
# WINE Installation script
# Can do almost everything from compiling to configuring...

# Mar 31 1999 - Ove Kven
#  First version
# Dec 9 1999 - Ove Kven
#  require Xpm
# Feb 25 2000 - Ove Kven
#  auto-add /usr/local/lib to /etc/ld.so.conf
# Mar 2 2000 - Ove Kven
#  source rather than grep config.cache
#  use sourced config.cache to start ldconfig
#  reconfigure if config.cache doesn't exist
# Mar 30 2000 - Ove Kven
#  autoconfigure no-windows installs
#  do not install registry on real-windows installs
#  some support for binary package installs
#  set and tell user about LD_LIBRARY_PATH if necessary
#  set EXTRA_LD_LIBRARY_PATH in wine.conf
# Apr 9 2000 - Ove Kven
#  make root's registry global (system-default)
# May 9 2000 - Ove Kven
#  use ttydrv when running regapi, so we don't have to run from X
#  change debugger path in registry
# Oct 29 2000 - Ove Kven
#  added --enable-opengl to default confargs
#  added conf_question, conf_yesno_answer, and conf_string_answer functions
#  added DEFCAT variable
# (later that day...)
#  added conf_reset_question function
#  added file existence checks to the registry copying
#  fixed problem with no-windows directory creation
#  some text reformatting from Eric Maryniak
# Jan 5 2000 - Chris Morgan
#  use default config file in /documentation/samples/config
#  replace .winerc with ~/.wine/config in printed text
#  added user question to convert .winerc file(if exists) or use the default
#    config file
#  add conf_question to allow root to install a local config file and
#    registry
# Jan 12 2000 - Chris Morgan
#  distinguish between creating local and global config files
#  display a message about the status of global config files
#  misc cleanups and reordering of questions
#  added check to see if wine is installed when we are running as a normal
#    user and print a message if wine cannot be found
# Feb 16 2002 - Adam D. Moss
#  Use config.status instead of config.cache to check whether we're
#    configured/compiled and to recreate the configuration
# Feb 20 2002 - Adam D. Moss
#  Partially revert previous changes, force configure to write an
#    old-style config.cache

#--- defaults (change these if you are a packager)
CONFARGS="--prefix=`echo ~/XPlane/winex-bin` --enable-opengl"    # configure args, e.g. --prefix=/usr --sysconfdir=/etc
prefix=~/XPlane/winex-bin/          # installation prefix
sysconfdir=$prefix/etc        # where wine.conf and global registry is supposed to be
bindir=$prefix/bin            # where winelib apps will be (or is) installed
libdir=$prefix/lib            # where libwine.so will be (or is) installed
exdir=documentation/samples   # where the example system.ini resides
GCONF=$sysconfdir/wine.conf   # default path of the wine.conf global config file
LCONF=~/XPlane/winex-bin/config          # default path of the local config file
BINDIST=no                    # whether called from a binary package config script
DOGLOBALCONF=auto             # whether to autogenerate wine.conf
DOLOCALCONF=auto              # whether to autogenerate localconf
DOWCHK=no                     # whether to autoconfigure existing-windows installation
DOWINE=yes                    # whether to autoconfigure no-windows installation
DOREG=auto                    # whether to install default registry
SYSREG=yes                    # whether to make root's registry global (system-default)
CONVCONF=no		      # whether we are converting an existing .winerc or not

# "make install" still installs the dlls into $libdir, but this may change in the future
# (DLLPATH should point to them if/when they are not in standard ld.so paths)
DLLPATH=$libdir               # default path of the dll .so files (except libwine.so)

# having the Wine debugger launched automatically will be a plus for us
DEBUGGER=$bindir/winedbg      # the (installed) path of winedbg
HDEBUGGER=debugger/winedbg    # the (non-installed) path of winedbg

# this is only for existing-windows installs
WINECONF=tools/wineconf       # the path of wineconf perl script

# this is only for no-windows installs
WINEINI=$exdir/config         # the path of default wine config file (also used by wineconf)
WININI=/dev/null              # the path of default win.ini
SYSTEMINI=$exdir/system.ini   # the path of default system.ini
REGAPI=programs/regapi/regapi # the path of regapi winelib application
DEFREG=winedefault.reg        # the path of the registry file to be fed to regapi
# CROOT=/var/wine             # the path of the fake Drive C (asks user if not set)
DEFCAT=cat                    # program to cat $DEFREG with (some packages need zcat)
#--- end of defaults

# temporary files used by the installer
TMPCONF=/tmp/wineinstall.conf
TMPREG=/tmp/wineinstall.reg

export WINEPREFIX=$prefix

# functions

if [ `whoami` = 'root' ]; then
	echo "Uh-oh. Looks like you're running as root. This is not good."
	echo "This wineinstall has been hacked in such a way that it's perfect for"
	echo "installing X-Plane as a user, but it will break if you run it as root."
	echo
	echo "Try again as a normal user."
	exit 1
fi

function std_sleep {
  sleep 1
}

function conf_question {
  # parameters: $1 = importance, $2 = question-id, $3+ = message lines
  # the first two parameters can be used by e.g. debconf in debian packages
  # but here we just print the message
  shift 2
  echo
  local LINE="$1"
  while shift
  do {
    echo "$LINE"
    LINE="$1"
  }
  done
}

function conf_reset_question {
  # parameters: $1 = question-id
  # this is used to flush any cached answers and "already-displayed" flags
  shift # dummy command
}

function conf_yesno_answer {
  unset ANSWER
  while [ "$ANSWER" != 'yes' ] && [ "$ANSWER" != 'no' ]
  do {
    echo -n "$1"
    read ANSWER
  }
  done
}

function conf_string_answer {
  echo -n "$1"
  read ANSWER
}

function create_windows_directories {
  for tdir in "$CROOT/windows" "$CROOT/windows/system" \
              "$CROOT/windows/Start Menu" "$CROOT/windows/Start Menu/Programs" \
              "$CROOT/Common Files" "$CROOT/Program Files" \
              "$CROOT/windows/Profiles" "$CROOT/windows/Profiles/Administrator"
  do [ -d "$tdir" ] || mkdir "$tdir"
  done
  [ -f "$CROOT/windows/win.ini" ]    || cp "$WININI"    "$CROOT/windows/win.ini"
  [ -f "$CROOT/windows/system.ini" ] || cp "$SYSTEMINI" "$CROOT/windows/system.ini"
}

# startup...

if [ "$BINDIST" = 'no' ]
then {

if ! [ -f configure ]
then {
  echo "You're running this from the wrong directory."
  echo "Change to the Wine source's main directory and try again."
  exit 1
}
fi

# run the configure script, if necessary

if [ -f config.cache ] && [ -f Makefile ] && [ Makefile -nt configure ]
then {
  echo "I see that WINE has already been configured, so I'll skip that."
  std_sleep
  # load configure results
  . ./config.cache
}
else {
  echo "Running configure..."
  echo
  if ! ./configure -C $CONFARGS
  then {
    echo
    echo "Configure failed, aborting install."
    rm -f config.cache
    exit 1
  }
  fi
  # load configure results
  . ./config.cache
  # make sure X was found
  eval "$ac_cv_have_x"
  if [ "$have_x" != "yes" ]
  then {
    echo "Install the X development headers and try again."
    rm -f config.cache
    exit 1
  }
  fi
}
fi

# now do the compilation

if [ -f wine ] && [ wine -nt config.cache ]
then {
  echo "Hmm, looks like WINE is already compiled. I'll skip that too, I guess."
  std_sleep
}
else {
  echo "Compiling WINE. Grab a lunch or two, rent a video, or whatever,"
  echo "in the meantime..."
  echo
  std_sleep
  if ! { make depend && make; }
  then {
    echo
    echo "Compilation failed, aborting install."
    exit 1
  }
  fi
  echo
}
fi

# and installation, if root

#if [ `whoami` != 'root' ]
if false
then {
  echo "You aren't root, so I'll skip the make install."

  # setup to run from current directory
  DLLPATH="$PWD/dlls"
  if [ -z "$LD_LIBRARY_PATH" ]
  then LD_LIBRARY_PATH="$PWD:$DLLPATH"
  else LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$PWD:$DLLPATH"
  fi
  export LD_LIBRARY_PATH
  DEBUGGER="$PWD/$HDEBUGGER"
  echo
  echo "NOTE! To run Wine without installing, you must set the environment variable"
  echo "LD_LIBRARY_PATH to $PWD:$DLLPATH"
  echo "in your logon scripts."
  echo

  # see if wine is installed on the users system, if not prompt them
  # and then exit
  if [ ! `which wine` ]
  then
    echo "Could not find wine on your system.  Run wineinstall as root to install wine"
    echo "before re-running wineinstall as a user."
    echo
    echo "Exiting wineinstall"
    exit 1;
  fi
}
else {
  echo "Now installing binaries onto the system..."
  echo
  std_sleep
  if ! make install
  then {
    echo
    echo "Installation failed, aborting."
    exit 1
  }
  fi
#  if [ -f /etc/ld.so.conf ] && ! grep -qs "$libdir" /etc/ld.so.conf
#  then {
#    echo
#    echo "$libdir didn't exist in your /etc/ld.so.conf, adding it now..."
#    echo "$libdir" >>/etc/ld.so.conf
#    echo "Re-running ldconfig..."
#    eval "$ac_cv_path_LDCONFIG"
#  }
#  fi
#   echo "NOTE: Since you're a normal user, you need to set the environment variable:"
#   echo "	export LD_LIBRARY_PATH=$PWD:$DLLPATH"
#   echo "in your logon scripts."
#   echo "Press enter to acknowledge that you've read this."
#   export LD_LIBRARY_PATH=$PWD:$DLLPATH:$LD_LIBRARY_PATH
#   read
   echo export WINEPREFIX=$prefix > wine.vars
   echo export LD_LIBRARY_PATH=$PWD:$DLLPATH:\$LD_LIBRARY_PATH >> wine.vars
   cp wine.vars $prefix
   echo \#!/bin/sh > xplwine
   echo . $prefix/wine.vars >> xplwine
   echo $prefix/bin/wine \"\$\@\" >> xplwine
   chmod +x xplwine
   cp xplwine $prefix/bin
   cp wine.vars $prefix/
}
fi

}
fi # BINDIST

. $prefix/wine.vars

# now check whether we should generate wine.conf
if [ -z "$DOGLOBALCONF" ]
then
  DOGLOBALCONF=auto
fi

if [ "$DOGLOBALCONF" = 'auto' ]
then {
  # see if we already have a system wine.conf
  if [ ! -f $GCONF ] && [ `whoami` = 'root' ]
  then
    DOGLOBALCONF=no
    echo "Creation of a global config file is not supported in wineinstall at this"
    echo "time.  When the configuration architecture is cleaned up this functionality"
    echo "will be restored to wineinstall."
    echo
  fi
}
fi

if [ "$DOLOCALCONF" = 'auto' ]
then {
  # see if the user is root, if so, explicitly ask them if they want a
  # local config file
  if [ `whoami` = 'root' ]
  then
    echo "You are running as root.  Do you want a local config file,"
    echo "file, ~/.wine/config, created?"
    conf_yesno_answer "(yes/no) "
    DOLOCALCONF="$ANSWER"
  else
    ANSWER=yes
    DOLOCALCONF="$ANSWER"
    if [ "$ANSWER" = 'no' ]
    then
      conf_question high need_root \
        "Aborting install. Try again as root to generate a system wine.conf."
      exit 1
    fi
  fi

  if [ -f "$LCONF" ]
  then
    ANSWER=yes
    if [ "$ANSWER" = 'no' ]
    then
      echo "Exiting wineinstall"
      exit 1
    fi
  fi
}
fi

# generate $TMPCONF from existing windows install, if any
if [ "$DOLOCALCONF" = 'yes' ]
then {
  if [ "$DOWCHK" = 'yes' ] || [ "$DOWCHK" = 'auto' ]
  then {
    echo -n "Searching for an existing Windows installation..."
    if ! $WINECONF -inifile "$WINEINI" > $TMPCONF 2>/dev/null
    then {
      rm -f $TMPCONF $TMPREG > /dev/null

      echo " not found. (no matching /etc/fstab mount entry found)"
      conf_question low do_without_windows \
       "Windows was not found on your system, so I assume you want" \
       "a Wine-only installation. Am I correct?"
      conf_yesno_answer "(yes/no) "
      if [ "$ANSWER" = 'no' ]
      then {
        conf_question high windows_not_found \
         "Aborting install. Make sure your Windows partition is mounted and try again," \
         "or create $LCONF manually by copying from $WINEINI and adapting the drive paths."
        exit 1
      }
      fi
      DOWINE=yes
    }
    else {
      echo " found."

      conf_reset_question windows_found
      conf_question low windows_found \
       "Created $LCONF using your existing Windows installation." \
       "You probably want to review the file, though."
      DOWINE=no
    }
    fi
  }
  elif [ "$DOWINE" = 'auto' ]
  then DOWINE=yes
  fi
}
elif [ "$DOWINE" = 'auto' ]
then 
  DOWINE=no
fi

# setup a no-windows installation, if necessary
if [ "$DOWINE" = 'yes' ]
then {
  # set an appropriate DCROOT
  if [ `whoami` != 'root' ]
  then DCROOT=~/XPlane/c-drive
  else DCROOT=/c
  fi

#  if [ -f ~/.winerc ]
#  then {
#    conf_question medium convert_config \
#     "I found the old version Wine config file, .winerc, in your " \
#     "home directory.  I can convert this to the new format or use the" \
#     "new default Wine config file. Convert?"
#    conf_yesno_answer "(yes/no) "
#    if [ "$ANSWER" = 'yes' ]
#    then {
#      WINEINI=~/.winerc
#      CONVCONF=yes
#    }
#    fi
#  }
#  else {

    conf_question low drivec_path \
     "Configuring Wine without Windows." \
     "Some fake Windows directories must be created, to hold any .ini files, DLLs," \
     "start menu entries, and other things your applications may need to install." \
     "Where would you like your fake C drive to be placed?"
    while [ -z "$CROOT" ]
    do {
      conf_string_answer "(default is $DCROOT) "
      [ -z "$ANSWER" ] && ANSWER="$DCROOT"
      if ! [ -d "$ANSWER" ]
      then {
        if mkdir -p "$ANSWER"
        then CROOT="$ANSWER"
        else
          echo "Directory $ANSWER can't be created !"
          conf_reset_question drivec_path
        fi
      }
      else CROOT="$ANSWER"
      fi
    }
    done
    echo "Configuring Wine for a no-windows install in $CROOT..."
  
    create_windows_directories
#  }
#  fi

  # create $LCONF using the default config file $WINEINI  
  if [ "$DOLOCALCONF" = 'yes' ] && [ "$CONVCONF" = 'no' ]
  then {
    sed "s|\"Path\" = \"/c\"\$|\"Path\" = \"${CROOT}\"|" $WINEINI > $TMPCONF
    conf_reset_question default_config
    conf_question low default_config \
     "Created $LCONF using default Wine configuration." \
     "You probably want to review the file, though."
  }
  fi

  # now we really should install the registry
  if [ "$DOREG" = 'auto' ]
  then DOREG=yes
  fi
}
fi
echo

#install the local config file $LCONF
if [ "$DOLOCALCONF" = 'yes' ]
then
  if [ ! -w ~/XPlane/winex-bin ]
  then
    mkdir ~/XPlane/winex-bin
  fi

  if [ "$CONVCONF" = 'no' ]
  then
    cp $TMPCONF $LCONF > /dev/null
  fi
else
  DOREG=no
fi      

#install the global config file $GCONF
if [ "$DOGLOBALCONF" = 'yes' ]
then
  if [ ! -f $sysconfdir ]
  then
    mkdir -p $sysconfdir
  fi

  cp $TMPCONF $GCONF > /dev/null
fi

# check whether we need to install default registry
# (not to be done if windows registry exists)
if [ "$DOREG" = 'auto' ]
then {
  echo "Checking for real Windows registry..."
  if [ -f "$CROOT/windows/system.dat" ]
  then DOREG=no
  elif [ -f "$CROOT/windows/system32/config/system" ]
  then DOREG=no
  else DOREG=yes
  fi
  if [ "$DOREG" = 'yes' ]
  then echo "Not found, default Wine registry will be installed."
  else echo "Windows registry found, will not install default Wine registry."
  fi
  echo
}
fi

# install default registry entries
if [ "$DOREG" = 'yes' ]
then {
  if [ "$BINDIST" = 'no' ]
  then {
    echo "Compiling regapi..."
    (cd programs/regapi; make)
    echo
  }
  fi

  echo "Preparing to install default Wine registry entries..."

  # edit config files so we don't have to run regapi under X
  if [ "$CONVCONF" = 'yes' ]
  then
    mv $WINEINI $WINEINI.new
    sed "s/GraphicsDriver=.*/GraphicsDriver=ttydrv/" $WINEINI.new > $WINEINI
  else
    mv $LCONF $LCONF.new
    sed "s/\"GraphicsDriver\" = .*/\"GraphicsDriver\" = \"ttydrv\"/" $LCONF.new > $LCONF
  fi

  # create a temporary wineinstall.reg with fixed debugger path
  $DEFCAT $DEFREG | sed "s|debugger/winedbg|${DEBUGGER}|" > $TMPREG

  echo "Installing default Wine registry entries..."
  echo
  if ! $REGAPI setValue < $TMPREG > /dev/null
  then {
    rm -f $TMPREG
    echo "Registry install failed."
    conf_reset_question regapi_error
    conf_question high regapi_error
    exit 1
  }
  else {
    # if we are converting from a .winerc file, running regapi once
    # will ONLY convert .winerc -> ~/.wine/config, it will not import the
    # registry data.  so if we are converting we need to run regapi twice
    if [ "$CONVCONF" = 'yes' ]
    then
      if ! $REGAPI setValue < $TMPREG > /dev/null
      then
        rm -f $TMPREG
        echo "Registry install failed."
        conf_reset_question regapi_error
        conf_question high regapi_error
        exit 1
      else
        echo
        echo "Registry entries successfully installed."
      fi
    else
      echo
      echo "Registry entries successfully installed."
    fi
  }
  fi
  rm -f $TMPREG
  if [ "$SYSREG" = 'auto' ]
  then SYSREG=yes
  fi

  # if we converted we need to change the graphics driver back and
  # restore the original .winerc file
  if [ "$CONVCONF" = 'yes' ]
  then
     mv $WINEINI.new $WINEINI
  fi

  sed "s/\"GraphicsDriver\" = .*/\"GraphicsDriver\" = \"x11drv\"/" $LCONF > $LCONF.new
  mv $LCONF.new $LCONF
}
fi

# make root's registry global, if desired
if [ `whoami` = 'root' ] && [ "$DOREG" = 'yes' ] && [ "$SYSREG" = 'yes' ]
then {
  [ -d ~/.wine ] || mkdir ~/.wine
  if ! [ -f $sysconfdir/wine.userreg ]
  then {
    echo "Linking root's user registry hive to the global registry..."
    [ -f ~/.wine/wine.userreg ] && cp ~/.wine/wine.userreg $sysconfdir/wine.userreg
    ln -sf $sysconfdir/wine.userreg ~/.wine/wine.userreg
  }
  fi
  if ! [ -f $sysconfdir/wine.systemreg ]
  then {
    echo "Linking root's system registry hive to the global registry..."
    [ -f ~/.wine/system.reg ] && cp ~/.wine/system.reg $sysconfdir/wine.systemreg
    ln -sf $sysconfdir/wine.systemreg ~/.wine/system.reg
  }
  fi
}
fi

# cleanup any temporary files that may remain
if [ -f $TMPCONF ]
then rm -f $TMPCONF
fi
if [ -f $TMPREG ]
then rm -f $TMPREG
fi

exit 0
