- fix wrong hexadecimal GetLastError() output
[wine] / tools / wineinstall
1 #!/bin/bash
2 # WINE Installation script
3 # Can do almost everything from compiling to configuring...
4
5 # Mar 31 1999 - Ove Kåven
6 #  First version
7 # Dec 9 1999 - Ove Kåven
8 #  require Xpm
9 # Feb 25 2000 - Ove Kåven
10 #  auto-add /usr/local/lib to /etc/ld.so.conf
11 # Mar 2 2000 - Ove Kåven
12 #  source rather than grep config.cache
13 #  use sourced config.cache to start ldconfig
14 #  reconfigure if config.cache doesn't exist
15 # Mar 30 2000 - Ove Kåven
16 #  autoconfigure no-windows installs
17 #  do not install registry on real-windows installs
18 #  some support for binary package installs
19 #  set and tell user about LD_LIBRARY_PATH if necessary
20 #  set EXTRA_LD_LIBRARY_PATH in wine.conf
21 # Apr 9 2000 - Ove Kåven
22 #  make root's registry global (system-default)
23 # May 9 2000 - Ove Kåven
24 #  use ttydrv when running regapi, so we don't have to run from X
25 #  change debugger path in registry
26 # Oct 29 2000 - Ove Kåven
27 #  added --enable-opengl to default confargs
28 #  added conf_question, conf_yesno_answer, and conf_string_answer functions
29 #  added DEFCAT variable
30 # (later that day...)
31 #  added conf_reset_question function
32 #  added file existence checks to the registry copying
33 #  fixed problem with no-windows directory creation
34 #  some text reformatting from Eric Maryniak
35 # Jan 5 2000 - Chris Morgan
36 #  use default config file in /documentation/samples/config
37 #  replace .winerc with ~/.wine/config in printed text
38 #  added user question to convert .winerc file(if exists) or use the default
39 #    config file
40 #  add conf_question to allow root to install a local config file and
41 #    registry
42 # Jan 12 2000 - Chris Morgan
43 #  distinguish between creating local and global config files
44 #  display a message about the status of global config files
45 #  misc cleanups and reordering of questions
46 #  added check to see if wine is installed when we are running as a normal
47 #    user and print a message if wine cannot be found
48
49 #--- defaults (change these if you are a packager)
50 CONFARGS="--enable-opengl"    # configure args, e.g. --prefix=/usr --sysconfdir=/etc
51 prefix=/usr/local             # installation prefix
52 sysconfdir=$prefix/etc        # where wine.conf and global registry is supposed to be
53 bindir=$prefix/bin            # where winelib apps will be (or is) installed
54 libdir=$prefix/lib            # where libwine.so will be (or is) installed
55 exdir=documentation/samples   # where the example system.ini resides
56 GCONF=$sysconfdir/wine.conf   # default path of the wine.conf global config file
57 LCONF=~/.wine/config          # default path of the local config file
58 BINDIST=no                    # whether called from a binary package config script
59 DOGLOBALCONF=auto             # whether to autogenerate wine.conf
60 DOLOCALCONF=auto              # whether to autogenerate localconf
61 DOWCHK=auto                   # whether to autoconfigure existing-windows installation
62 DOWINE=auto                   # whether to autoconfigure no-windows installation
63 DOREG=auto                    # whether to install default registry
64 SYSREG=yes                    # whether to make root's registry global (system-default)
65 CONVCONF=no                   # whether we are converting an existing .winerc or not
66
67 # "make install" still installs the dlls into $libdir, but this may change in the future
68 # (DLLPATH should point to them if/when they are not in standard ld.so paths)
69 DLLPATH=$libdir/wine          # default path of the dll .so files (except libwine.so)
70
71 # having the Wine debugger launched automatically will be a plus for us
72 DEBUGGER=$bindir/winedbg      # the (installed) path of winedbg
73 HDEBUGGER=debugger/winedbg    # the (non-installed) path of winedbg
74
75 # this is only for existing-windows installs
76 WINECONF=tools/wineconf       # the path of wineconf perl script
77
78 # this is only for no-windows installs
79 WINEINI=$exdir/config         # the path of default wine config file (also used by wineconf)
80 WININI=/dev/null              # the path of default win.ini
81 SYSTEMINI=$exdir/system.ini   # the path of default system.ini
82 REGAPI=programs/regapi/regapi # the path of regapi winelib application
83 DEFREG=winedefault.reg        # the path of the registry file to be fed to regapi
84 # CROOT=/var/wine             # the path of the fake Drive C (asks user if not set)
85 DEFCAT=cat                    # program to cat $DEFREG with (some packages need zcat)
86 #--- end of defaults
87
88 # temporary files used by the installer
89 TMPCONF=/tmp/wineinstall.conf
90 TMPREG=/tmp/wineinstall.reg
91
92 # functions
93
94 function std_sleep {
95   sleep 1
96 }
97
98 function conf_question {
99   # parameters: $1 = importance, $2 = question-id, $3+ = message lines
100   # the first two parameters can be used by e.g. debconf in debian packages
101   # but here we just print the message
102   shift 2
103   echo
104   local LINE="$1"
105   while shift
106   do {
107     echo "$LINE"
108     LINE="$1"
109   }
110   done
111 }
112
113 function conf_reset_question {
114   # parameters: $1 = question-id
115   # this is used to flush any cached answers and "already-displayed" flags
116   shift # dummy command
117 }
118
119 function conf_yesno_answer {
120   unset ANSWER
121   while [ "$ANSWER" != 'yes' ] && [ "$ANSWER" != 'no' ]
122   do {
123     echo -n "$1"
124     read ANSWER
125   }
126   done
127 }
128
129 function conf_string_answer {
130   echo -n "$1"
131   read ANSWER
132 }
133
134 function create_windows_directories {
135   for tdir in "$CROOT/windows" "$CROOT/windows/system" \
136               "$CROOT/windows/Start Menu" "$CROOT/windows/Start Menu/Programs" \
137               "$CROOT/Common Files" "$CROOT/Program Files" \
138               "$CROOT/windows/Profiles" "$CROOT/windows/Profiles/Administrator"
139   do [ -d "$tdir" ] || mkdir "$tdir"
140   done
141   [ -f "$CROOT/windows/win.ini" ]    || cp "$WININI"    "$CROOT/windows/win.ini"
142   [ -f "$CROOT/windows/system.ini" ] || cp "$SYSTEMINI" "$CROOT/windows/system.ini"
143 }
144
145 # startup...
146
147 echo "WINE Installer v0.7"
148 echo
149
150 if [ "$BINDIST" = 'no' ]
151 then {
152
153 if ! [ -f configure ]
154 then {
155   echo "You're running this from the wrong directory."
156   echo "Change to the Wine source's main directory and try again."
157   exit 1
158 }
159 fi
160
161 # check whether RPM installed, and if it is, remove any old wine rpm.
162 hash rpm &>/dev/null
163 RET=$?
164 if [ $RET -eq 0 ]; then
165   if [ -n "`rpm -qi wine 2>/dev/null|grep "^Name"`" ]; then
166     echo "Warning: Old Wine RPM install detected. Do you want to remove it first?"
167     conf_yesno_answer "(yes/no) "
168     if [ "$ANSWER" = 'yes' ]; then
169       echo Starting wine rpm removal...
170       rpm -e wine; RET=$?
171       if [ $RET -eq 0 ]; then
172         echo Done.
173       else
174         echo "FAILED. Probably you aren't installing as root."
175         echo "Expect problems (library conflicts with existing install etc.)."
176       fi
177     else
178       echo "Sorry, I won't install Wine when an rpm version is still installed."
179       echo "(Wine support suffered from way too many conflicts)"
180       echo "Have a nice day !"
181       exit 1
182     fi 
183   fi
184 fi
185
186 # check whether wine binary still available
187 if [ -n "`which wine`" ]; then
188   echo "Warning !! wine binary (still) found, which may indicate"
189   echo "a (conflicting) previous installation."
190   echo "You might want to abort and uninstall Wine first."
191   std_sleep
192 fi
193
194 # run the configure script, if necessary
195
196 if [ -f config.cache ] && [ -f Makefile ] && [ Makefile -nt configure ]
197 then {
198   echo "I see that WINE has already been configured, so I'll skip that."
199   std_sleep
200   # load configure results
201   . ./config.cache
202 }
203 else {
204   echo "Running configure..."
205   echo
206   if ! ./configure $CONFARGS
207   then {
208     echo
209     echo "Configure failed, aborting install."
210     rm -f config.cache
211     exit 1
212   }
213   fi
214   # load configure results
215   . ./config.cache
216   # make sure X was found
217   eval "$ac_cv_have_x"
218   if [ "$have_x" != "yes" ]
219   then {
220     echo "Install the X development headers and try again."
221     rm -f config.cache
222     exit 1
223   }
224   elif [ "$ac_cv_header_X11_xpm_h" != "yes" ]
225   then {
226     echo "Install the Xpm development headers and try again."
227     rm -f config.cache
228     exit 1
229   }
230   fi
231 }
232 fi
233
234 # now do the compilation
235
236 if [ -f wine ] && [ wine -nt Makefile ]
237 then {
238   echo "Hmm, looks like WINE is already compiled. I'll skip that too, I guess."
239   std_sleep
240 }
241 else {
242   echo "Compiling WINE. Grab a lunch or two, rent a video, or whatever,"
243   echo "in the meantime..."
244   echo
245   std_sleep
246   if ! { make depend && make; }
247   then {
248     echo
249     echo "Compilation failed, aborting install."
250     exit 1
251   }
252   fi
253   echo
254 }
255 fi
256
257 # and installation, if root
258
259 if [ `whoami` != 'root' ]
260 then {
261   echo "You aren't root, so I'll skip the make install."
262
263   # setup to run from current directory
264   DLLPATH="$PWD/dlls"
265   if [ -z "$LD_LIBRARY_PATH" ]
266   then LD_LIBRARY_PATH="$PWD:$DLLPATH"
267   else LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$PWD:$DLLPATH"
268   fi
269   export LD_LIBRARY_PATH
270   DEBUGGER="$PWD/$HDEBUGGER"
271   echo
272   echo "NOTE! To run Wine without installing, you must set the environment variable"
273   echo "LD_LIBRARY_PATH to $PWD:$DLLPATH"
274   echo "in your logon scripts."
275   echo
276
277   # see if wine is installed on the users system, if not prompt them
278   # and then exit
279   if [ ! `which wine` ]
280   then
281     echo "Could not find wine on your system.  Run wineinstall as root to install wine"
282     echo "before re-running wineinstall as a user."
283     echo
284     echo "Exiting wineinstall"
285     exit 1;
286   fi
287 }
288 else {
289   echo "Now installing binaries onto the system..."
290   echo
291   std_sleep
292   if ! make install
293   then {
294     echo
295     echo "Installation failed, aborting."
296     exit 1
297   }
298   fi
299   if [ -f /etc/ld.so.conf ] && ! grep -qs "$libdir" /etc/ld.so.conf
300   then {
301     echo
302     echo "$libdir didn't exist in your /etc/ld.so.conf, adding it now..."
303     echo "$libdir" >>/etc/ld.so.conf
304     echo "Re-running ldconfig..."
305     eval "$ac_cv_path_LDCONFIG"
306   }
307   fi
308 }
309 fi
310
311 }
312 fi # BINDIST
313
314 # now check whether we should generate wine.conf
315 if [ -z "$DOGLOBALCONF" ]
316 then DOGLOBALCONF=auto
317 fi
318
319 if [ "$DOGLOBALCONF" = 'auto' ]
320 then {
321   # see if we already have a system wine.conf
322   if [ ! -f $GCONF ] && [ `whoami` = 'root' ]
323   then
324     DOGLOBALCONF=no
325     echo "Creation of a global config file is not supported in wineinstall at this"
326     echo "time.  When the configuration architecture is cleaned up this functionality"
327     echo "will be restored to wineinstall."
328     echo
329   fi
330 }
331 fi
332
333 if [ "$DOLOCALCONF" = 'auto' ]
334 then {
335   # see if the user is root, if so, explicitly ask them if they want a
336   # local config file
337   if [ `whoami` = 'root' ]
338   then
339     echo "You are running as root.  Do you want a local config file,"
340     echo "file, ~/.wine/config, created?"
341     conf_yesno_answer "(yes/no) "
342     DOLOCALCONF="$ANSWER"
343   else
344     echo "Create local config file ~/.wine/config?"
345     conf_yesno_answer "(yes/no) "
346     echo
347     DOLOCALCONF="$ANSWER"
348     if [ "$ANSWER" = 'no' ]
349     then
350       conf_question high need_root \
351         "Aborting install. Try again as root to generate a system wine.conf."
352       exit 1
353     fi
354   fi
355
356   if [ -f "$LCONF" ]
357   then
358     echo "Found existing $LCONF, if you continue this file will be"
359     echo "overwritten.  Continue running wineinstall?"
360     conf_yesno_answer "(yes/no) "
361     echo
362     if [ "$ANSWER" = 'no' ]
363     then
364       echo "Exiting wineinstall"
365       exit 1
366     fi
367   fi
368 }
369 fi
370
371 # generate $TMPCONF from existing windows install, if any
372 if [ "$DOLOCALCONF" = 'yes' ]
373 then {
374   if [ "$DOWCHK" = 'yes' ] || [ "$DOWCHK" = 'auto' ]
375   then {
376     echo -n "Searching for an existing Windows installation..."
377     if ! $WINECONF -inifile "$WINEINI" > $TMPCONF 2>/dev/null
378     then {
379       rm -f $TMPCONF $TMPREG > /dev/null
380
381       echo " not found. (no matching /etc/fstab mount entry found)"
382       conf_question low do_without_windows \
383        "Windows was not found on your system, so I assume you want" \
384        "a Wine-only installation. Am I correct?"
385       conf_yesno_answer "(yes/no) "
386       if [ "$ANSWER" = 'no' ]
387       then {
388         conf_question high windows_not_found \
389          "Aborting install. Make sure your Windows partition is mounted and try again," \
390          "or create $LCONF manually by copying from $WINEINI and adapting the drive paths."
391         exit 1
392       }
393       fi
394       DOWINE=yes
395     }
396     else {
397       echo " found."
398
399       conf_reset_question windows_found
400       conf_question low windows_found \
401        "Created $LCONF using your existing Windows installation." \
402        "You probably want to review the file, though."
403       DOWINE=no
404     }
405     fi
406   }
407   elif [ "$DOWINE" = 'auto' ]
408   then DOWINE=yes
409   fi
410 }
411 elif [ "$DOWINE" = 'auto' ]
412 then 
413   DOWINE=no
414 fi
415
416 # setup a no-windows installation, if necessary
417 if [ "$DOWINE" = 'yes' ]
418 then {
419   # set an appropriate DCROOT
420   if [ `whoami` != 'root' ]
421   then DCROOT=~/c
422   else DCROOT=/c
423   fi
424
425   if [ -f ~/.winerc ]
426   then {
427     conf_question medium convert_config \
428      "I found the old version Wine config file, .winerc, in your " \
429      "home directory.  I can convert this to the new format or use the" \
430      "new default Wine config file. Convert?"
431     conf_yesno_answer "(yes/no) "
432     if [ "$ANSWER" = 'yes' ]
433     then {
434       WINEINI=~/.winerc
435       CONVCONF=yes
436     }
437     fi
438   }
439   else {
440
441     conf_question low drivec_path \
442      "Configuring Wine without Windows." \
443      "Some fake Windows directories must be created, to hold any .ini files, DLLs," \
444      "start menu entries, and other things your applications may need to install." \
445      "Where would you like your fake C drive to be placed?"
446     while [ -z "$CROOT" ]
447     do {
448       conf_string_answer "(default is $DCROOT) "
449       [ -z "$ANSWER" ] && ANSWER="$DCROOT"
450       if ! [ -d "$ANSWER" ]
451       then {
452         if mkdir -p "$ANSWER"
453         then CROOT="$ANSWER"
454         else
455           echo "Directory $ANSWER can't be created !"
456           conf_reset_question drivec_path
457         fi
458       }
459       else CROOT="$ANSWER"
460       fi
461     }
462     done
463     echo "Configuring Wine for a no-windows install in $CROOT..."
464   
465     create_windows_directories
466   }
467   fi
468
469   # create $LCONF using the default config file $WINEINI  
470   if [ "$DOLOCALCONF" = 'yes' ] && [ "$CONVCONF" = 'no' ]
471   then {
472     sed "s|\"Path\" = \"/c\"\$|\"Path\" = \"${CROOT}\"|" $WINEINI > $TMPCONF
473     conf_reset_question default_config
474     conf_question low default_config \
475      "Created $LCONF using default Wine configuration." \
476      "You probably want to review the file, though."
477   }
478   fi
479
480   # now we really should install the registry
481   if [ "$DOREG" = 'auto' ]
482   then DOREG=yes
483   fi
484 }
485 fi
486 echo
487
488 #install the local config file $LCONF
489 if [ "$DOLOCALCONF" = 'yes' ]
490 then
491   if [ ! -w ~/.wine ]
492   then
493     mkdir ~/.wine
494   fi
495
496   if [ "$CONVCONF" = 'no' ]
497   then
498     cp $TMPCONF $LCONF > /dev/null
499   fi
500 else
501   DOREG=no
502 fi      
503
504 #install the global config file $GCONF
505 if [ "$DOGLOBALCONF" = 'yes' ]
506 then
507   if [ ! -f $sysconfdir ]
508   then
509     mkdir -p $sysconfdir
510   fi
511
512   cp $TMPCONF $GCONF > /dev/null
513 fi
514
515 # check whether we need to install default registry
516 # (not to be done if windows registry exists)
517 if [ "$DOREG" = 'auto' ]
518 then {
519   echo "Checking for real Windows registry..."
520   if [ -f "$CROOT/windows/system.dat" ]
521   then DOREG=no
522   elif [ -f "$CROOT/windows/system32/config/system" ]
523   then DOREG=no
524   else DOREG=yes
525   fi
526   if [ "$DOREG" = 'yes' ]
527   then echo "Not found, default Wine registry will be installed."
528   else echo "Windows registry found, will not install default Wine registry."
529   fi
530   echo
531 }
532 fi
533
534 # install default registry entries
535 if [ "$DOREG" = 'yes' ]
536 then {
537   if [ "$BINDIST" = 'no' ]
538   then {
539     echo "Compiling regapi..."
540     (cd programs/regapi; make)
541     echo
542   }
543   fi
544   echo "Preparing to install default Wine registry entries..."
545
546   # edit config files so we don't have to run regapi under X
547   if [ "$CONVCONF" = 'yes' ]
548   then
549     mv $WINEINI $WINEINI.new
550     sed "s/GraphicsDriver=.*/GraphicsDriver=ttydrv/" $WINEINI.new > $WINEINI
551   else
552     mv $LCONF $LCONF.new
553     sed "s/\"GraphicsDriver\" = .*/\"GraphicsDriver\" = \"ttydrv\"/" $LCONF.new > $LCONF
554   fi
555
556   # create a temporary wineinstall.reg with fixed debugger path
557   $DEFCAT $DEFREG | sed "s|debugger/winedbg|${DEBUGGER}|" > $TMPREG
558
559   echo "Installing default Wine registry entries..."
560   echo
561   if ! $REGAPI setValue < $TMPREG > /dev/null
562   then {
563     rm -f $TMPREG
564     echo "Registry install failed."
565     conf_reset_question regapi_error
566     conf_question high regapi_error
567     exit 1
568   }
569   else {
570     # if we are converting from a .winerc file, running regapi once
571     # will ONLY convert .winerc -> ~/.wine/config, it will not import the
572     # registry data.  so if we are converting we need to run regapi twice
573     if [ "$CONVCONF" = 'yes' ]
574     then
575       if ! $REGAPI setValue < $TMPREG > /dev/null
576       then
577         rm -f $TMPREG
578         echo "Registry install failed."
579         conf_reset_question regapi_error
580         conf_question high regapi_error
581         exit 1
582       else
583         echo
584         echo "Registry entries successfully installed."
585       fi
586     else
587       echo
588       echo "Registry entries successfully installed."
589     fi
590   }
591   fi
592   rm -f $TMPREG
593   if [ "$SYSREG" = 'auto' ]
594   then SYSREG=yes
595   fi
596
597   # if we converted we need to change the graphics driver back and
598   # restore the original .winerc file
599   if [ "$CONVCONF" = 'yes' ]
600   then
601      mv $WINEINI.new $WINEINI
602   fi
603
604   sed "s/\"GraphicsDriver\" = .*/\"GraphicsDriver\" = \"x11drv\"/" $LCONF > $LCONF.new
605   mv $LCONF.new $LCONF
606 }
607 fi
608
609 # make root's registry global, if desired
610 if [ `whoami` = 'root' ] && [ "$DOREG" = 'yes' ] && [ "$SYSREG" = 'yes' ]
611 then {
612   [ -d ~/.wine ] || mkdir ~/.wine
613   if ! [ -f $sysconfdir/wine.userreg ]
614   then {
615     echo "Linking root's user registry hive to the global registry..."
616     [ -f ~/.wine/wine.userreg ] && cp ~/.wine/wine.userreg $sysconfdir/wine.userreg
617     ln -sf $sysconfdir/wine.userreg ~/.wine/wine.userreg
618   }
619   fi
620   if ! [ -f $sysconfdir/wine.systemreg ]
621   then {
622     echo "Linking root's system registry hive to the global registry..."
623     [ -f ~/.wine/system.reg ] && cp ~/.wine/system.reg $sysconfdir/wine.systemreg
624     ln -sf $sysconfdir/wine.systemreg ~/.wine/system.reg
625   }
626   fi
627 }
628 fi
629
630 # cleanup any temporary files that may remain
631 if [ -f $TMPCONF ]
632 then rm -f $TMPCONF
633 fi
634 if [ -f $TMPREG ]
635 then rm -f $TMPREG
636 fi
637
638
639 # it's a wrap
640 echo
641 echo "Installation complete for now. Good luck (this is still alpha software)."
642 echo "If you have problems with WINE, please read the documentation first,"
643 echo "as many kinds of potential problems are explained there."
644
645 exit 0