New loading scheme for Winelib apps, makes them behave like builtin
[wine] / tools / wineinstall
index 3bf502a..52c1bb5 100755 (executable)
 #!/bin/bash
 # WINE Installation script
-
+# Can do almost everything from compiling to configuring...
+#
+# Copyright 1999 Ove Kåven
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+# History:
 # Mar 31 1999 - Ove Kåven
 #  First version
 # Dec 9 1999 - Ove Kåven
 #  require Xpm
 # Feb 25 2000 - Ove Kåven
 #  auto-add /usr/local/lib to /etc/ld.so.conf
+# Mar 2 2000 - Ove Kåven
+#  source rather than grep config.cache
+#  use sourced config.cache to start ldconfig
+#  reconfigure if config.cache doesn't exist
+# Mar 30 2000 - Ove Kåven
+#  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 Kåven
+#  make root's registry global (system-default)
+# May 9 2000 - Ove Kåven
+#  use ttydrv when running regapi, so we don't have to run from X
+#  change debugger path in registry
+# Oct 29 2000 - Ove Kåven
+#  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
+# Mar 27 2002 - Chris Morgan
+#  prevent the user from running wineinstall as root
+#  add script commands so we su root for 'make install' and other commands
+#    that require root access
+#  add text to tell the user we need to run stuff as root so they don't 
+#    think we are trying to pull something funny
+# Apr 14 2002 - Dustin Navea
+#  Fix sed command when finding real-windows registry so it actually 
+#   accesses a file (~/.wine/config) instead of null ($CONF?!)
+#  Added search for clean-install (not upgrade) Win2k registry
+#  (next day, after some sleep)
+#  Fix sed string when finding real-windows registry to actually find 
+#   windows partition name in [Drive C] section
+#  it should now almost always find the windows partition and real-windows 
+#  registry (if not, let me know)
+
+#--- defaults (change these if you are a packager)
+CONFARGS="--enable-opengl"    # configure args, e.g. --prefix=/usr --sysconfdir=/etc
+prefix=/usr/local             # 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=~/.wine/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=auto                   # whether to autoconfigure existing-windows installation
+DOWINE=auto                   # whether to autoconfigure no-windows installation
+DOREG=auto                    # whether to install default registry
+DOAPP=auto                    # whether to install applications, distributed with Wine
+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/wine          # 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
+REGEDIT=programs/regedit/regedit # the path of regedit winelib application
+DEFREG=winedefault.reg        # the path of the registry file to be fed to regedit
+# 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
+
+# functions
+
+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
+}
 
-# defaults
+function create_windows_directories {
+  for tdir in "$CROOT/windows" "$CROOT/windows/system" "$CROOT/windows/system32" \
+              "$CROOT/windows/Start Menu" "$CROOT/windows/Start Menu/Programs" \
+              "$CROOT/Program Files" "$CROOT/Program Files/Common 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"
+}
 
-sysconfdir=/usr/local/etc
-DOCONF=auto
-DOREG=yes
+#creates symbolic link in windows directory to installed winelib application
+#parameters:
+# - name of the installed winelib application
+# - full path to application in the winelib directory
+function link_app {
+  ln -sf $bindir/$1 $2
+  ln -sf $bindir/$1.so $2.so
+}
+
+#puts windows applications replacements to windows directories,
+#configures them
+function configure_wine_applications {
+  link_app regedit      "$CROOT/windows/regedit.exe"
+  link_app uninstaller  "$CROOT/windows/uninstall.exe"
+  link_app wcmd         "$CROOT/windows/system32/cmd.exe"
+  link_app control      "$CROOT/windows/system32/control.exe"
+  link_app winhelp      "$CROOT/windows/system32/help.exe"
+  link_app notepad      "$CROOT/windows/system32/notepad.exe"
+  link_app progman      "$CROOT/windows/system32/progman.exe"
+  link_app regsvr32     "$CROOT/windows/system32/regsvr32.exe"
+  link_app winemine     "$CROOT/windows/system32/winmine.exe"
+  link_app winver       "$CROOT/windows/system32/winver.exe"
+}
 
 # startup...
 
-echo "WINE Installer v0.2"
+echo "WINE Installer v0.73"
 echo
+
+if [ "$BINDIST" = 'no' ]
+then {
+
 if ! [ -f configure ]
 then {
   echo "You're running this from the wrong directory."
-  echo "Change to the Wine directory and try again."
+  echo "Change to the Wine source's main directory and try again."
+  exit 1
+}
+fi
+
+if [ `whoami` == 'root' ]
+then {
+  echo "You are running wineinstall as root, this is not advisable. Please rerun as a user."
+  echo "Aborting."
   exit 1
 }
 fi
 
+# check whether RPM installed, and if it is, remove any old wine rpm.
+hash rpm &>/dev/null
+RET=$?
+if [ $RET -eq 0 ]; then
+  if [ -n "`rpm -qi wine 2>/dev/null|grep "^Name"`" ]; then
+    echo "Warning: Old Wine RPM install detected. Do you want to remove it first?"
+    conf_yesno_answer "(yes/no) "
+    if [ "$ANSWER" = 'yes' ]; then
+      echo "We need to remove the rpm as root, please enter your root password"
+      echo
+      echo Starting wine rpm removal...
+      su -c "rpm -e wine; RET=$?"
+      if [ $RET -eq 0 ]; then
+        echo Done.
+      else
+        echo "FAILED. Probably you aren't installing as root."
+       echo "Expect problems (library conflicts with existing install etc.)."
+      fi
+    else
+      echo "Sorry, I won't install Wine when an rpm version is still installed."
+      echo "(Wine support suffered from way too many conflicts between RPM"
+      echo "and source installs)"
+      echo "Have a nice day !"
+      exit 1
+    fi 
+  fi
+fi
+
+# check whether wine binary still available
+if [ -n "`which wine 2>/dev/null|grep '/wine'`" ]; then
+  echo "Warning !! wine binary (still) found, which may indicate"
+  echo "a (conflicting) previous installation."
+  echo "You might want to abort and uninstall Wine first."
+  std_sleep
+fi
+
 # run the configure script, if necessary
 
-if [ -f Makefile ] && [ Makefile -nt configure ]
+if [ -f config.cache ] && [ -f Makefile ] && [ Makefile -nt configure ]
 then {
+  echo
   echo "I see that WINE has already been configured, so I'll skip that."
+  std_sleep
+  # load configure results
+  . ./config.cache
 }
 else {
-  # we'll run with defaults (we need libwine.a later)
   echo "Running configure..."
   echo
-  if ! ./configure
+  if ! ./configure -C $CONFARGS
   then {
     echo
     echo "Configure failed, aborting install."
@@ -44,147 +286,466 @@ else {
     exit 1
   }
   fi
+  # load configure results
+  . ./config.cache
   # make sure X was found
-  if ! grep -qs "have_x=yes" config.cache
+  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
   }
-  elif ! grep -qs "xpm_h=yes" config.cache
-  then {
-    echo "Install the Xpm development headers and try again."
-    rm -f config.cache
-    exit 1
-  }
   fi
 }
 fi
 
-# now do the compilation
-
-if [ -f wine ] && [ wine -nt Makefile ]
+# now do the compilation and install, we need to always do this because we 
+# don't want the 'make install' command we might run to run 'make' as root
+if [ `whoami` != 'root' ]
 then {
-  echo "Hmm, looks like WINE is already compiled. I'll skip that too, I guess."
-}
-else {
-  echo "Compiling WINE. Grab a lunch or two, rent a video, or whatever, in the meantime..."
+  # ask the user if they want to build and install wine
   echo
-  if ! { make depend && make; }
+  echo "We need to install wine as root user, do you want us to build wine,"
+  echo "'su root' and install Wine?  Enter 'no' to continue without installing"
+  conf_yesno_answer "(yes/no) "
+
+  if [ "$ANSWER" = "yes" ]
   then {
+    # start out with the basic command
+    sucommand="make install"
+
+    # if the user doesn't have $libdir in their ld.so.conf add this
+    # to our sucommand string
+    if [ -f /etc/ld.so.conf ]
+    then
+      if ! grep -qs "$libdir" /etc/ld.so.conf
+      then {
+       echo
+       echo "$libdir doesn't exist in your /etc/ld.so.conf, it will be added"
+       echo "when we perform the install..."
+        sucommand="$sucommand;echo $libdir>>/etc/ld.so.conf"
+      }
+      fi
+      # run ldconfig always just in case some updated files dont get linked
+      sucommand="$sucommand;$ac_cv_path_LDCONFIG"
+    fi
+
     echo
-    echo "Compilation failed, aborting install."
-    exit 1
-  }
-  fi
-  echo
-}
-fi
 
-# and installation, if root
+    echo "Compiling WINE. Grab a lunch or two, rent a video, or whatever,"
+    echo "in the meantime..."
+    echo
+    std_sleep
 
-if [ `whoami` != 'root' ]
-then {
-  echo "You aren't root, so I'll skip the make install."
-}
-else {
-  echo "Now installing binaries onto the system..."
-  echo
-  if ! make install
-  then {
+    # try to just make wine, if this fails 'make depend' and try to remake
+    if ! { make; }
+    then {
+      if ! { make depend && make; }
+      then {
+        echo
+        echo "Compilation failed, aborting install."
+        exit 1
+      }
+      fi
+    }
+    fi
     echo
-    echo "Installation failed, aborting."
-    exit 1
+
+    echo "Performing 'make install' as root to install binaries, enter root password"
+
+    std_sleep
+
+    if ! su root -c "$sucommand"
+    then {
+      echo
+      echo "Either you entered an incorrect password or we failed to run"
+      echo "'$sucommand' correctly."
+      echo "If you didn't enter an incorrect password then please report this"
+      echo "error and any steps to possibly reproduce it to"
+      echo "http://bugs.winehq.com/"
+      echo
+      echo "Installation failed, aborting."
+      exit 1
+    }
+    fi
+
+    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
   }
-  fi
-  if [ -f /etc/ld.so.conf ] && ! grep -qs "/usr/local/lib" /etc/ld.so.conf
-  then {
+  else {
+    # user didn't want to install wine so tell them about running from the
+    # current directory and set some stuff up for them
+
+    # 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
-    echo "/usr/local/lib didn't exist in your /etc/ld.so.conf, adding it now..."
-    echo /usr/local/lib >>/etc/ld.so.conf
-    echo "Re-running ldconfig..."
-    ldconfig
   }
   fi
 }
-fi
-echo
+else {
+  echo "You are running wineinstall as root, this is not advisable. Please rerun as a user."
+  echo "Aborting."
+  exit 1
+}
+fi # [ `whoami` != 'root' ]
+
+}
+fi # BINDIST
 
 # now check whether we should generate wine.conf
-if [ -z "$DOCONF" ]
-then DOCONF=auto
+if [ -z "$DOGLOBALCONF" ]
+then
+  DOGLOBALCONF=auto
 fi
 
-if [ "$DOCONF" = 'auto' ]
+if [ "$DOGLOBALCONF" = 'auto' ]
 then {
   # see if we already have a system wine.conf
-  if [ -f $sysconfdir/wine.conf ] || [ -f /etc/wine.conf ]
-  then DOCONF=no
+  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 [ "$DOCONF" != 'no' ]
+if [ "$DOLOCALCONF" = 'auto' ]
 then {
-  if [ `whoami` != 'root' ]
+  # 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
+    # if the user has an existing config file ask them if they want us to
+    # overwrite it, otherwise just ask them if they want to create one
+    if [ -f "$LCONF" ]
+    then
+      echo "Found existing $LCONF, do you want to overwrite this"
+      echo "existing Wine configuration file?"
+      conf_yesno_answer "(yes/no) "
+      DOLOCALCONF="$ANSWER"
+      echo
+    else {
+      echo "Create local config file ~/.wine/config?"
+      conf_yesno_answer "(yes/no) "
+      DOLOCALCONF="$ANSWER"
+      echo
+      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
+  fi
+}
+fi
+
+# generate $TMPCONF from existing windows install, if any
+if [ "$DOLOCALCONF" = 'yes' ]
+then {
+  if [ "$DOWCHK" = 'yes' ] || [ "$DOWCHK" = 'auto' ]
   then {
-    CONF=~/.winerc
-    if ! [ -f $CONF ]
+    echo -n "Searching for an existing Windows installation..."
+    if ! $WINECONF -inifile "$WINEINI" > $TMPCONF 2>/dev/null
     then {
-      if [ "$DOCONF" != 'yes' ]
+      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 {
-        echo "Since you aren't root, and there's no system wine.conf, I assume"
-        echo "you want a user-specific .winerc. Am I correct? (yes/no)"
-        while [ "$DOCONF" != 'yes' ] && [ "$DOCONF" != 'no' ]
-        do read DOCONF
-        done
+        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
-      if [ "$DOCONF" = 'no' ]
-      then echo "Skipping generation of .winerc."
-      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=~/c
+  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=$sysconfdir/wine.conf
-    mkdir -p $sysconfdir
-    DOCONF=yes
+
+    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
+    configure_wine_applications
+  }
+  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 ~/.wine ]
+  then
+    mkdir ~/.wine
+  fi
 
-if [ "$DOCONF" = 'yes' ]
+  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 "Now automatically generating $CONF for you..."
-  echo
-  tools/wineconf > $CONF
+  CROOT=`sed -n '/^\[Drive C\]$/,/^\[.*\]$/ s/^\"Path\" = \"\(.*\)\"/\1/p' $LCONF`
+  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
+  elif [ -f "$CROOT/WINNT/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
-  echo "Done. You probably want to review the file, though."
 }
 fi
-echo
 
 # install default registry entries
 if [ "$DOREG" = 'yes' ]
 then {
-  echo "Compiling regapi..."
-  echo
-  (cd programs/regapi; make)
-  echo
-  echo "Installing default registry entries, please wait..."
-  echo
-  if ! programs/regapi/regapi setValue < winedefault.reg
+  if [ "$BINDIST" = 'no' ]
   then {
+    echo "Compiling regedit..."
+    (cd programs/regedit; make)
     echo
-    echo "Registry install failed. Perhaps you weren't running X."
+  }
+  fi
+  echo "Preparing to install default Wine registry entries..."
+
+  # edit config files so we don't have to run regedit 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 ! $REGEDIT $TMPREG > /dev/null
+  then {
+    rm -f $TMPREG
+    echo "Registry install failed."
+    conf_reset_question regedit_error
+    conf_question high regedit_error
     exit 1
   }
+  else {
+    # if we are converting from a .winerc file, running regedit once
+    # will ONLY convert .winerc -> ~/.wine/config, it will not import the
+    # registry data.  so if we are converting we need to run regedit twice
+    if [ "$CONVCONF" = 'yes' ]
+    then
+      if ! $REGEDIT $TMPREG > /dev/null
+      then
+        rm -f $TMPREG
+        echo "Registry install failed."
+        conf_reset_question regedit_error
+        conf_question high regedit_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
-  # FIXME: perhaps install registry to $sysconfdir/winesystem.reg and $sysconfdir/wineuser.reg?
+
+  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
+
+
+# it's a wrap
 echo
 echo "Installation complete for now. Good luck (this is still alpha software)."
-echo "If you have problems with WINE, please read the documentation first."
+echo "If you have problems with WINE, please read the documentation first,"
+echo "as many kinds of potential problems are explained there."
+
+exit 0