|  | A small WINE distribution guide. | 
|  |  | 
|  | While packaging WINE for one of the Linux distributions I came across | 
|  | several points which have been clarified yet. Particular 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 "rpm" most of this stuff can be applied to other | 
|  | packagers too.) | 
|  |  | 
|  | 1. Rationales | 
|  |  | 
|  | A WINE install should: | 
|  | a. Not have a world writeable directory (-tree). | 
|  | b. Require only as much user input as possible. It would be very good if it | 
|  | would not require any at all. Just let the system administrator do "rpm | 
|  | -i wine.rpm" and let any user be able to run "wine sol.exe" instantly. | 
|  | c. Give the user as much flexibility to install his own applications, do | 
|  | his own configuring etc. | 
|  | d. Come as preconfigured as possible, so the user does not need to change | 
|  | any configuration files. | 
|  | e. Use only as much diskspace as needed per user. | 
|  |  | 
|  | A WINE install needs: | 
|  | f. A writeable C:\ directory structure on a per user basis. Applications do | 
|  | dump .ini files into c:\windows, installers dump .exe, .dll and more into | 
|  | c:\windows\ and subdirectories or into C:\Program Files\. | 
|  | g. The .exe and .dll from a global read-only Windows installation to be | 
|  | found by applications. | 
|  | h. Some special .dll and .exe files in the windows\system directory, since | 
|  | applications directly check for their presence. | 
|  |  | 
|  |  | 
|  | 2. Implementation | 
|  |  | 
|  | 2.1 Building the package | 
|  |  | 
|  | WINE is configured the usual way (depending on your buildenvironment). | 
|  | The "prefix" is chosen using your application placement policy | 
|  | (/usr/,/usr/X11R6/, /opt/wine/ or similar).  The configuration files | 
|  | (wine.conf, wineuser.reg, winesystem.reg) are targeted for /etc/wine/ | 
|  | (rationale: FHS 2.0, multiple readonly configuration files of a package). | 
|  |  | 
|  | Example (split this into %build and %install section for rpm): | 
|  | CFLAGS=$RPM_OPT_FLAGS \ | 
|  | ./configure --prefix=/usr/X11R6 --sysconfdir=/etc/wine/ --enable-dll | 
|  | make | 
|  | make install prefix=$BUILDROOT/usr/X11R6/ | 
|  | install -d /etc/wine/ | 
|  | install -m 644 wine.ini /etc/wine/wine.conf | 
|  |  | 
|  | Here we unfortunately do need to create wineuser.reg and winesystem.reg | 
|  | from the WINE distributed winedefault.reg. This can be done using | 
|  | ./regapi once for one example user and the reusing his .wine/user.reg | 
|  | and .wine/system.reg files. [FIXME: this needs to be done better] | 
|  |  | 
|  | install -m 644 winesytem.reg /etc/wine/ | 
|  | install -m 644 wineuser.reg /etc/wine/ | 
|  |  | 
|  | You will need to package the files: | 
|  | $prefix/bin/wine, $prefix/bin/dosmod, $prefix/lib/libwine.so.1.0, | 
|  | $prefix/man/man1/wine.1, $prefix/include/wine/*, | 
|  |  | 
|  | %config /etc/wine/* | 
|  | %doc ... choose from the toplevel directory and documentation/ | 
|  |  | 
|  | Do not forget ldconfig for the postinstall, the postuninstall and 'rm | 
|  | libwine.so' for the postuninstall. | 
|  |  | 
|  | 2.2 Creating a good default configuration file | 
|  |  | 
|  | 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: | 
|  |  | 
|  | - [Drive X]: | 
|  | + A for the floppy. Specify your distributions default floppy mountpoint | 
|  | here. (Path=/auto/floppy) | 
|  | + C for the C:\ directory. Here we use the users homedirectory, for most | 
|  | applications do see C:\ as root-writeable directory of every windows | 
|  | installation and this basically is it in the UNIX-user context. | 
|  | (Path=${HOME}) | 
|  | + R for the CD-Rom drive. Specify your distributions default CD-ROM drives | 
|  | mountpoint here. (Path=/auto/cdrom) | 
|  | + T for temporary storage. We do use /tmp/ (rationale: between process | 
|  | temporary data belongs to /tmp/, FHS 2.0) | 
|  | + W for the original Windows installation. This drive points to the | 
|  | windows\ subdirectory of the original windows installation. This avoids | 
|  | problems with renamed 'windows' directories (as for instance 'lose95', | 
|  | 'win' or 'sys\win95'). During compile/package/install we leave this | 
|  | to be '/', it has to be configured after the package install. | 
|  | + Z for the UNIX Root directory (Path=/). 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. | 
|  |  | 
|  | - [wine]: | 
|  | 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) | 
|  | - [Tweak.Layout] | 
|  | WineLook=win95		(just the coolest look ;) | 
|  | - Possibly modify the [spooler], [serialports] and [parallelports] sections. | 
|  | (FIXME: possibly more, including printer stuff) | 
|  |  | 
|  | Add this prepared configuration file to the package. | 
|  |  | 
|  | 2.3 Installing WINE for the system administrator | 
|  |  | 
|  | Install the package using the usual packager "rpm -i wine.rpm". | 
|  | You may edit /etc/wine/wine.conf, [Drive W], to point to a possible windows | 
|  | installation right after the install. Thats it. | 
|  |  | 
|  | 2.4 Installing WINE for the user | 
|  |  | 
|  | The user will need to run a setup script before the first invocation of | 
|  | WINE. This script should: | 
|  | - Copy /etc/wine/wine.conf for user modification. | 
|  | - Allow specification of the original windows installation to use (which | 
|  | modifies the copied wine.conf file). | 
|  | - Create the windows directory structure (c:\windows,c:\windows\system, | 
|  | c:\Program Files,c:\Desktop,etc...) | 
|  |  | 
|  | (FIXME: Not sure this is needed for all files:) | 
|  | - Symlink all .dll and .exe files from the original windows installation to | 
|  | the windows directory. Why? Some program reference "%windowsdir%/file.dll" | 
|  | or "%systemdir%/file.dll" directly and fail if there are not present. | 
|  | 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 windows/ subdirectory). | 
|  |  | 
|  | - 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). | 
|  |  | 
|  | Done. | 
|  |  | 
|  | This procedure requires: | 
|  | - Much thought and work from the packager (1x) | 
|  | - No work for the sysadmin. Well except one "rpm -i" and possible one edit | 
|  | of the configuration file. | 
|  | - Some or no work from the user, except running the per-user setup script | 
|  | once. | 
|  | => It scales well and suffices most of the rationales. | 
|  |  | 
|  | Marcus Meissner <marcus@jet.franken.de> | 
|  |  | 
|  | ---------------------------------------------------------------- | 
|  | Sample wine.ini for OpenLinux 2.x: | 
|  |  | 
|  | ;; | 
|  | ;; 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> | 
|  |  | 
|  |  |