| <chapter id="packaging"> |
| <title>Packaging Wine</title> |
| |
| <sect1 id="distributing"> |
| <title>A Small WINE Distribution Guide</title> |
| |
| <para> |
| written by Marcus Meissner <Marcus.Meissner@caldera.de> |
| </para> |
| <para> |
| (Extracted from <filename>wine/documentation/distributors</filename>) |
| </para> |
| |
| <para> |
| While packaging WINE for one of the Linux distributions I came |
| across several points which have not been clarified yet. |
| Particularly a how-to for WINE packaging distributors is |
| missing. This document tries to give a brief overview over the |
| rationales I thought up and how I tried to implement it. |
| (While the examples use <command>rpm</command> most of this |
| stuff can be applied to other packagers too.) |
| </para> |
| |
| <note> |
| <para> |
| YOU SHOULD RECHECK THIS FILE EVERY TWO MONTHS OR SO |
| (<command>diff -uN</command> comes to my mind here...). |
| We'll be adding stuff constantly here in order to improve |
| the Wine environment ! |
| </para> |
| </note> |
| |
| <orderedlist> |
| <listitem> |
| |
| <para>Rationales</para> |
| <para> |
| A WINE install should: |
| </para> |
| <itemizedlist> |
| <listitem> |
| <para>Not have a world writeable directory (-tree).</para> |
| </listitem> |
| <listitem> |
| <para> |
| Require only as much user input as needed. It would be |
| very good if it would not require any at all. Just let |
| the system administrator do <command>rpm -i |
| wine.rpm</command> and let any user be able to run |
| <command>wine sol.exe</command> instantly. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| Give the user as much flexibility as possible to |
| install his own applications, do his own configuring |
| etc. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| Come as preconfigured as possible, so the user does |
| not need to change any configuration files. |
| </para> |
| </listitem> |
| <listitem> |
| <para>Use only as much diskspace as needed per user.</para> |
| </listitem> |
| </itemizedlist> |
| |
| <para> |
| A WINE install needs: |
| </para> |
| |
| <itemizedlist> |
| <listitem> |
| <para> |
| A writeable <filename>C:\</filename> directory |
| structure on a per user basis. Applications do dump |
| <filename>.ini</filename> files into |
| <filename>c:\windows</filename>, installers dump |
| <filename>.exe</filename>, <filename>.dll</filename> |
| and more into <filename>c:\windows\</filename> and |
| subdirectories or into <filename>C:\Program |
| Files\</filename>. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| The <filename>.exe</filename> and |
| <filename>.dll</filename> from a global read-only |
| Windows installation to be found by applications. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| Some special <filename>.dll</filename> and |
| <filename>.exe</filename> files in the |
| <filename>windows\system</filename> directory, since |
| applications directly check for their presence. |
| </para> |
| </listitem> |
| <listitem> |
| <para>Some special program environment.</para> |
| </listitem> |
| </itemizedlist> |
| </listitem> |
| |
| <listitem> |
| <para>Implementation</para> |
| |
| <orderedlist inheritnum="inherit"> |
| <listitem> |
| <para>Building the package</para> |
| <para> |
| WINE is configured the usual way (depending on your |
| build environment). The "prefix" is chosen using your |
| application placement policy |
| (<filename>/usr/</filename>, |
| <filename>/usr/X11R6/</filename>, |
| <filename>/opt/wine/</filename> or similar). The |
| configuration files (<filename>wine.conf</filename>, |
| <filename>wine.userreg</filename>, |
| <filename>wine.systemreg</filename>) are targeted for |
| <filename>/etc/wine/</filename> (rationale: FHS 2.0, |
| multiple readonly configuration files of a package). |
| </para> |
| <para> |
| Example (split this into <literal>%build</literal> and |
| <literal>%install</literal> section for |
| <command>rpm</command>): |
| </para> |
| <screen> |
| CFLAGS=$RPM_OPT_FLAGS \ |
| ./configure --prefix=/usr/X11R6 --sysconfdir=/etc/wine/ --enable-dll |
| make |
| BR=$RPM_BUILD_ROOT |
| make install prefix=$BR/usr/X11R6/ sysconfdir=$BR/etc/wine/ |
| install -d $BR/etc/wine/ |
| install -m 644 wine.ini $BR/etc/wine/wine.conf |
| |
| # Put all our dlls in a seperate directory. (this works only if |
| # you have a buildroot) |
| install -d $BR/usr/X11R6/lib/wine |
| mv $BR/usr/X11R6/lib/lib* $BR/usr/X11R6/lib/wine/ |
| |
| # the clipboard server is started on demand. |
| install -m 755 windows/x11drv/wineclipsrv $BR/usr/X11R6/bin/ |
| |
| # The WINE server is needed. |
| install -m 755 server/wineserver $BR/usr/X11R6/bin/ |
| </screen> |
| <para> |
| Here we unfortunately do need to create |
| <filename>wineuser.reg</filename> and |
| <filename>winesystem.reg</filename> from the WINE |
| distributed <filename>winedefault.reg</filename>. This |
| can be done using <command>./regapi</command> once for |
| one example user and then reusing his |
| <filename>.wine/user.reg</filename> and |
| <filename>.wine/system.reg</filename> files. |
| <note> |
| <title>FIXME</title> |
| <para>this needs to be done better</para> |
| </note> |
| </para> |
| <screen> |
| install -m 644 wine.sytemreg $BR/etc/wine/ |
| install -m 644 wine.userreg $BR/etc/wine/ |
| </screen> |
| <para> |
| There are now a lot of libraries generated by the |
| build process, so a seperate library directory should |
| be used. |
| </para> |
| <screen> |
| install -d 755 $BR/usr/X11R6/lib/ |
| mv $BR/ |
| </screen> |
| <para> |
| You will need to package the files: |
| </para> |
| <screen> |
| $prefix/bin/wine, $prefix/bin/dosmod, $prefix/lib/wine/* |
| $prefix/man/man1/wine.1, $prefix/include/wine/*, |
| $prefix/bin/wineserver, $prefix/bin/wineclipsrv |
| |
| %config /etc/wine/* |
| %doc ... choose from the toplevel directory and documentation/ |
| </screen> |
| <para> |
| The post-install script: |
| </para> |
| <screen> |
| if ! grep -q /usr/X11R6/lib/wine /etc/ld.so.conf; then |
| echo "/usr/X11R6/lib/wine" >> /etc/ld.so.conf |
| fi |
| /sbin/ldconfig |
| </screen> |
| <para> |
| The post-uninstall script: |
| </para> |
| <screen> |
| if [ "$1" = 0 ]; then |
| perl -ni -e 'print unless m:/usr/X11R6/lib/wine:;' /etc/ld.so.conf |
| fi |
| /sbin/ldconfig |
| </screen> |
| </listitem> |
| <listitem> |
| <para>Creating a good default configuration file</para> |
| <para> |
| For the rationales of needing as less input from the |
| user as possible arises the need for a very good |
| configuration file. The one supplied with WINE is |
| currently lacking. We need: |
| </para> |
| <itemizedlist> |
| <listitem> |
| <para> |
| [Drive X]: |
| </para> |
| <itemizedlist> |
| <listitem> |
| <para> |
| A for the floppy. Specify your distributions |
| default floppy mountpoint here. |
| </para> |
| <programlisting> |
| Path=/auto/floppy |
| </programlisting> |
| </listitem> |
| <listitem> |
| <para> |
| C for the <filename>C:\</filename> directory. |
| Here we use the users homedirectory, for most |
| applications do see <filename>C:\</filename> |
| as root-writeable directory of every windows |
| installation and this basically is it in the |
| UNIX-user context. |
| </para> |
| <programlisting> |
| Path=${HOME} |
| </programlisting> |
| </listitem> |
| <listitem> |
| <para> |
| R for the CD-Rom drive. Specify your |
| distributions default CD-ROM drives mountpoint |
| here. |
| </para> |
| <programlisting> |
| Path=/auto/cdrom |
| </programlisting> |
| </listitem> |
| <listitem> |
| <para> |
| T for temporary storage. We do use |
| <filename>/tmp/</filename> (rationale: between |
| process temporary data belongs to |
| <filename>/tmp/</filename>, FHS 2.0) |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| W for the original Windows installation. This |
| drive points to the |
| <filename>windows\</filename> subdirectory of |
| the original windows installation. This avoids |
| problems with renamed |
| <filename>windows</filename> directories (as |
| for instance <filename>lose95</filename>, |
| <filename>win</filename> or |
| <filename>sys\win95</filename>). During |
| compile/package/install we leave this to be |
| <filename>/</filename>, it has to be |
| configured after the package install. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| Z for the UNIX Root directory. This avoids any |
| problems with "could not find drive for |
| current directory" users occasionaly complain |
| about in the newsgroup and the ircchannel. It |
| also makes the whole directory structure |
| browseable. The type of Z should be network, |
| so applications expect it to be readonly. |
| </para> |
| <programlisting> |
| Path=/ |
| </programlisting> |
| </listitem> |
| </itemizedlist> |
| </listitem> |
| <listitem> |
| <para> |
| [wine]: |
| </para> |
| <screen> |
| Windows=c:\windows\ (the windows/ subdirectory in the users |
| homedirectory) |
| System=c:\windows\system\ (the windows/system subdirectory in the users |
| homedirectory) |
| Path=c:\windows;c:\windows\system;c:\windows\system32;w:\;w:\system;w:\system32; |
| ; Using this trick we have in fact two windows installations in one, we |
| ; get the stuff from the readonly installation and can write to our own. |
| Temp=t:\ (the TEMP directory) |
| </screen> |
| </listitem> |
| <listitem> |
| <para>[Tweak.Layout]</para> |
| <screen> |
| WineLook=win95 (just the coolest look ;) |
| </screen> |
| </listitem> |
| <listitem> |
| <para> |
| Possibly modify the [spooler], [serialports] and |
| [parallelports] sections. |
| </para> |
| <note> |
| <title>FIXME</title> |
| <para>possibly more, including printer stuff.</para> |
| </note> |
| </listitem> |
| </itemizedlist> |
| |
| <para>Add this prepared configuration file to the package.</para> |
| </listitem> |
| <listitem> |
| <para>Installing WINE for the system administrator</para> |
| <para> |
| Install the package using the usual packager |
| <command>rpm -i wine.rpm</command>. You may edit |
| <filename>/etc/wine/wine.conf</filename>, [Drive W], |
| to point to a possible windows installation right |
| after the install. That's it. |
| </para> |
| <para> |
| Note that on Linux you should somehow try to add the |
| <option>unhide</option> mount option (see <command>man |
| mount</command>) to the CD-ROM entry in |
| <filename>/etc/fstab</filename> during package |
| install, as several stupid Windows programs mark some |
| setup (!) files as hidden (ISO9660) on CD-ROMs, which |
| will greatly confuse users as they won't find their |
| setup files on the CD-ROMs as they were used on |
| Windows systems when <option>unhide</option> is not |
| set ;-\ And of course the setup program will complain |
| that <filename>setup.ins</filename> or some other mess |
| is missing... If you choose to do so, then please make |
| this change verbose to the admin. |
| </para> |
| </listitem> |
| <listitem> |
| <para>Installing WINE for the user</para> |
| <para> |
| The user will need to run a setup script before the |
| first invocation of WINE. This script should: |
| </para> |
| <itemizedlist> |
| <listitem> |
| <para> |
| Copy <filename>/etc/wine/wine.conf</filename> for |
| user modification. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| Allow specification of the original windows |
| installation to use (which modifies the copied |
| <filename>wine.conf</filename> file). |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| Create the windows directory structure |
| (<filename>c:\windows</filename>, |
| <filename>c:\windows\system</filename>, |
| <filename>c:\windows\Start Menu\Programs</filename>, |
| <filename>c:\Program Files</filename>, |
| <filename>c:\Desktop</filename>, etc.) |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| Symlink all <filename>.dll</filename> and |
| <filename>.exe</filename> files from the original |
| windows installation to the |
| <filename>windows</filename> directory. Why? Some |
| programs reference "%windowsdir%/file.dll" or |
| "%systemdir%/file.dll" directly and fail if they |
| are not present. |
| </para> |
| <para> |
| This will give a huge number of symlinks, yes. |
| However, if an installer later overwrites on of |
| those files, it will overwrite the symlink (so |
| that the file now lies in the |
| <filename>windows/</filename> subdirectory). |
| </para> |
| <note> |
| <title>FIXME</title> |
| <para>Not sure this is needed for all files.</para> |
| </note> |
| </listitem> |
| <listitem> |
| <para> |
| On later invocation the script might want to |
| compare regular files in the users windows |
| directories and in the global windows directories |
| and replace same files by symlinks (to avoid |
| diskspace problems). |
| </para> |
| </listitem> |
| </itemizedlist> |
| </listitem> |
| </orderedlist> |
| </listitem> |
| </orderedlist> |
| |
| <para>Done.</para> |
| |
| <para> |
| This procedure requires: |
| </para> |
| |
| <itemizedlist> |
| <listitem> |
| <para>Much thought and work from the packager (1x)</para> |
| </listitem> |
| <listitem> |
| <para> |
| No work for the sysadmin. Well except one <command>rpm |
| -i</command> and possible one edit of the configuration |
| file. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| Some or no work from the user, except running the per-user |
| setup script once. |
| </para> |
| </listitem> |
| <listitem> |
| <para>It scales well and suffices most of the rationales.</para> |
| </listitem> |
| </itemizedlist> |
| |
| |
| <bridgehead>Sample <filename>wine.ini</filename> for OpenLinux 2.x:</bridgehead> |
| |
| <programlisting> |
| ;; |
| ;; MS-DOS drives configuration |
| ;; |
| ;; Each section has the following format: |
| ;; [Drive X] |
| ;; Path=xxx (Unix path for drive root) |
| ;; Type=xxx (supported types are 'floppy', 'hd', 'cdrom' and 'network') |
| ;; Label=xxx (drive label, at most 11 characters) |
| ;; Serial=xxx (serial number, 8 characters hexadecimal number) |
| ;; Filesystem=xxx (supported types are 'msdos'/'dos'/'fat', 'win95'/'vfat', 'unix') |
| ;; This is the FS Wine is supposed to emulate on a certain |
| ;; directory structure. |
| ;; Recommended: |
| ;; - "win95" for ext2fs, VFAT and FAT32 |
| ;; - "msdos" for FAT16 (ugly, upgrading to VFAT driver strongly recommended) |
| ;; DON'T use "unix" unless you intend to port programs using Winelib ! |
| ;; Device=/dev/xx (only if you want to allow raw device access) |
| ;; |
| |
| ; |
| ; |
| ; Floppy 'A' and 'B' |
| ; |
| ; OpenLinux uses an automounter under /auto/, so we use that too. |
| ; |
| [Drive A] |
| Path=/auto/floppy/ |
| Type=floppy |
| Label=Floppy |
| Serial=87654321 |
| Device=/dev/fd0 |
| Filesystem=win95 |
| |
| ; |
| ; Comment in ONLY if you have a second floppy or the automounter hangs |
| ; for 5 minutes. |
| ; |
| ;[Drive B] |
| ;Path=/auto/floppy2/ |
| ;Type=floppy |
| ;Label=Floppy |
| ;Serial=87654321 |
| ;Device=/dev/fd1 |
| ;Filesystem=win95 |
| |
| |
| ; |
| ; Drive 'C' links to the users homedirectory. |
| ; |
| ; This must point to a writeable directory structure (not your readonly |
| ; mounted DOS partitions!) since programs want to dump stuff into |
| ; "Program Files/" "Programme/", "windows/", "windows/system/" etc. |
| ; |
| ; The basic structure is set up using the config script. |
| ; |
| [Drive C] |
| Path=${HOME} |
| Type=hd |
| Label=MS-DOS |
| Filesystem=win95 |
| |
| ; |
| ; /tmp/ directory |
| ; |
| ; The temp drive (and directory) points to /tmp/. Windows programs fill it |
| ; with junk, so it is approbiate. |
| ; |
| [Drive T] |
| Path=/tmp |
| Type=hd |
| Label=Tmp Drive |
| Filesystem=win95 |
| |
| ; |
| ; 'U'ser homedirectory |
| ; |
| ; Just in case you want C:\ elsewhere. |
| ; |
| [Drive U] |
| Path=${HOME} |
| Type=hd |
| Label=Home |
| Filesystem=win95 |
| |
| ; |
| ; CD-'R'OM drive (automounted) |
| ; |
| ; The default cdrom drive. |
| ; |
| ; If an application (or game) wants a specific CD-ROM you might have to |
| ; temporary change the Label to the one of the CD itself. |
| ; |
| ; How to read them is described in /usr/doc/wine-cvs-xxxxx/cdrom-labels. |
| ; |
| [Drive R] |
| Path=/auto/cdrom |
| Type=cdrom |
| Label=CD-Rom |
| Filesystem=win95 |
| |
| ; |
| ; The drive where the old windows installation resides (it points to the |
| ; windows/ subdirectory). |
| ; |
| ; The Path is modified by the winesetup script. |
| ; |
| [Drive W] |
| Path=/ |
| Type=network |
| Label=Windows |
| Filesystem=win95 |
| ; |
| ; The UNIX Root directory, so all other programs and directories are reachable. |
| ; |
| ; type network is used to tell programs to not write here. |
| ; |
| [Drive Z] |
| Path=/ |
| Type=network |
| Label=ROOT |
| Filesystem=win95 |
| |
| ; |
| ; Standard Windows path entries. WINE will not work if they are incorrect. |
| ; |
| [wine] |
| ; |
| ; The windows/ directory. It must be writeable, for programs write into it. |
| ; |
| Windows=c:\windows |
| ; |
| ; The windows/system/ directory. It must be writeable, for especially setup |
| ; programs install dlls in there. |
| ; |
| System=c:\windows\system |
| ; |
| ; The temp directory. Should be cleaned regulary, since install programs leave |
| ; junk without end in there. |
| ; |
| Temp=t:\ |
| ; |
| ; The dll search path. It should contain at least: |
| ; - the windows and the windows/system directory of the user. |
| ; - the global windows and windows/system directory (from a possible readonly |
| ; windows installation either on msdos filesystems or somewhere in the UNIX |
| ; directory tree) |
| ; - any other windows style directories you want to add. |
| ; |
| Path=c:\windows;c:\windows\system;c:\windows\system32;t:\;w:\;w:\system;w:\system32 |
| ; |
| ; Outdated and no longer used. (but needs to be present). |
| ; |
| SymbolTableFile=./wine.sym |
| |
| # <wineconf> |
| |
| ; |
| ; Dll loadorder defaults. No need to modify. |
| ; |
| [DllDefaults] |
| EXTRA_LD_LIBRARY_PATH=${HOME}/wine/cvs/lib |
| DefaultLoadOrder = native, elfdll, so, builtin |
| |
| ; |
| ; What 32/16 dlls belong to each other (context wise). No need to modify. |
| ; |
| [DllPairs] |
| kernel = kernel32 |
| gdi = gdi32 |
| user = user32 |
| commdlg = comdlg32 |
| commctrl= comctl32 |
| ver = version |
| shell = shell32 |
| lzexpand= lz32 |
| mmsystem= winmm |
| msvideo = msvfw32 |
| winsock = wsock32 |
| |
| ; |
| ; What type of dll to use in their respective loadorder. |
| ; |
| [DllOverrides] |
| kernel32, gdi32, user32 = builtin |
| kernel, gdi, user = builtin |
| toolhelp = builtin |
| comdlg32, commdlg = elfdll, builtin, native |
| version, ver = elfdll, builtin, native |
| shell32, shell = builtin, native |
| lz32, lzexpand = builtin, native |
| commctrl, comctl32 = builtin, native |
| wsock32, winsock = builtin |
| advapi32, crtdll, ntdll = builtin, native |
| mpr, winspool = builtin, native |
| ddraw, dinput, dsound = builtin, native |
| winmm, mmsystem = builtin |
| msvideo, msvfw32 = builtin, native |
| mcicda.drv, mciseq.drv = builtin, native |
| mciwave.drv = builtin, native |
| mciavi.drv, mcianim.drv = native, builtin |
| w32skrnl = builtin |
| wnaspi32, wow32 = builtin |
| system, display, wprocs = builtin |
| wineps = builtin |
| |
| ; |
| ; Options section. Does not need to be edited. |
| ; |
| [options] |
| ; allocate how much system colors on startup. No need to modify. |
| AllocSystemColors=100 |
| |
| ;; |
| ; Font specification. You usually do not need to edit this section. |
| ; |
| ; Read documentation/fonts before adding aliases |
| ; |
| [fonts] |
| ; The resolution defines what fonts to use (usually either 75 or 100 dpi fonts, |
| ; or nearest match). |
| Resolution = 96 |
| ; Default font |
| Default = -adobe-times- |
| |
| ; |
| ; serial ports used by "COM1" "COM2" "COM3" "COM4". Useful for applications |
| ; that try to access serial ports. |
| ; |
| [serialports] |
| Com1=/dev/ttyS0 |
| Com2=/dev/ttyS1 |
| Com3=/dev/modem,38400 |
| Com4=/dev/modem |
| |
| ; |
| ; parallel port(s) used by "LPT1" etc. Useful for applications that try to |
| ; access these ports. |
| ; |
| [parallelports] |
| Lpt1=/dev/lp0 |
| |
| ; |
| ; What spooling program to use on printing. |
| ; Use "|program" or "filename", where the output will be dumped into. |
| ; |
| [spooler] |
| LPT1:=|lpr |
| LPT2:=|gs -sDEVICE=bj200 -sOutputFile=/tmp/fred -q - |
| LPT3:=/dev/lp3 |
| |
| ; |
| ; Allow port access to WINE started by the root user. Useful for some |
| ; supported devices, but it can make the system unstable. |
| ; Read /usr/doc/wine-cvs-xxxxx/ioport-trace-hints. |
| ; |
| [ports] |
| ;read=0x779,0x379,0x280-0x2a0 |
| ;write=0x779,0x379,0x280-0x2a0 |
| |
| ; debugging, not need to be modified. |
| [spy] |
| Exclude=WM_SIZE;WM_TIMER; |
| |
| ; |
| ; What names for the registry datafiles, no need to modify. |
| ; |
| [Registry] |
| ; Paths must be given in /dir/dir/file.reg format. |
| ; Wine will not understand dos file names here... |
| ;UserFileName=xxx ; alternate registry file name (user.reg) |
| ;LocalMachineFileName=xxx ; (system.reg) |
| |
| ; |
| ; Layout/Look modifications. Here you can switch with a single line between |
| ; windows 3.1 and windows 95 style. |
| ; This does not change WINE behaviour or reported versions, just the look! |
| ; |
| [Tweak.Layout] |
| ;; WineLook=xxx (supported styles are 'Win31'(default), 'Win95', 'Win98') |
| WineLook=Win95 |
| |
| ; |
| ; What programs to start on WINE startup. (you should probably leave it empty) |
| ; |
| [programs] |
| Default= |
| Startup= |
| |
| ; defunct section. |
| [Console] |
| ;XtermProg=nxterm |
| ;InitialRows=25 |
| ;InitialColumns=80 |
| ;TerminalType=nxterm |
| |
| # </wineconf> |
| </programlisting> |
| </sect1> |
| </chapter> |
| |
| <!-- Keep this comment at the end of the file |
| Local variables: |
| mode: sgml |
| sgml-parent-document:("wine-doc.sgml" "book" "part" "chapter" "") |
| End: |
| --> |