INTRODUCTION
~~~~~~~~~~~~

This document attempts to establish guidelines for people making binary 
packages of Wine.

It expresses the basic principles that the Wine developers have agreed 
should be used when building Wine. It also attempts to highlight the areas
where there are different approaches to packaging Wine, so that the packager
can understand the different alternatives that have been considered and their 
rationales.

TERMS
~~~~~

There are several terms and paths used in this document as place holders 
for configurable values. Those terms are described here.
    * WINEPREFIX: is the user's Wine configuration directory.
	This is almost always ~/.wine, but can be overridden by
        the user by setting the WINEPREFIX environment variable.

    * PREFIX: is the prefix used when selecting an installation target.
	The current default is /usr/local. This results in binary 
	installation into /usr/local/bin,  library installation into 
	/usr/local/wine/lib, and so forth.
        This value can be overridden by the packager. In fact, FHS 2.2
	(http://www.pathname.com/fhs/) specifications suggest that a better
        prefix is /opt/wine.  Ideally, a packager would also allow the 
	installer to override this value.

    * ETCDIR: is the prefix that Wine uses to find the global 
	configuration directory. This can be changed by the configure 
	option sysconfdir.  The current default is $PREFIX/etc.

    * WINDOWSDIR: is an important concept to Wine.  This directory specifies
	what directory corresponds to the root Windows directory
        (e.g. C:\WINDOWS). This directory is specified by the user, in
        the user's configuration file.  Generally speaking, this directory 
	is either set to point at an empty directory, or it is set to point 
	at a Windows partition that has been mounted through the vfat driver.
        NOTE:   It is extremely important that the packager understand the 
		importance of WINDOWSDIR and convey this information and 
		choice to the end user.

DEPENDENCIES
~~~~~~~~~~~~

There are two types of dependencies: hard and soft dependencies.

A hard dependency must be available at runtime for Wine to function,
if  compiled into the code. Soft dependencies on the other hand
will degrade gracefully at runtime if unavailable on the runtime system.
Ideally, we should eliminate all hard dependencies in favour of
soft dependencies.

To enable a soft dependency, it must be available at compile time.
As a packager, please do your best to make sure that as many soft 
dependencies  are available during compilation. Failing to have a 
soft dependency available means that users cannot benefit
from a Wine capability.

Here is a list of the soft dependencies. We suggest packagers
install each and every last of those before building the package. 
These libraries are not dependencies in the RPM sense. In DEB packages, 
they should appear as "Suggests" or "Recommends", as the case may be.
    * FreeType: http://www.freetype.org
      This library is used for direct rendering of fonts. It provides 
      better support of fonts than using the X11 fonts engine. It is 
      only needed for the X11 back end engine. Used from GDI.

    * Alsa: "http://sourceforge.net/projects/alsa (Linux only)
      This library gives sound support to the Windows environment.

    * JACK: http://jackit.sourceforge.net
      Similar to Alsa, it allow Wine to use the JACK audio server.

    * CUPS: http://www.cups.org
      This library allows Windows to see CUPS defined printers.

    * OpenGL
      This is used for both OpenGL and Direct3D (and some other 
      DirectX functions as well) support in Wine. There are many many 
      libraries for providing this functionality. It is enough for one
      of them to be available when compiling Wine. Wine can work with 
      any other library during runtime.
      If no library is available, packagers are encouraged to compile 
      Wine with Mesa3D (http://www.mesa3d.org), which requires no 
      hardware support to install.

GOALS
~~~~~

An installation from a Wine package should:
    * Install quickly and simply:
	The initial installation should require no user input.  An 
		'rpm -i wine.rpm' or 'apt-get install wine'
        should suffice for initial installation.
                
    * Work quickly and simply:
        The user should be able to launch Solitaire
        within minutes of downloading the Wine package.
              
    * Comply with Filesystem Hierarchy Standard
        A Wine installation should, as much as possible, comply
        with the FHS standard (http://www.pathname.com/fhs/).
                
    * Preserve flexibility
        None of the flexibility built into Wine should
        be hidden from the end user.

    * Easy configuration
        Come as preconfigured as possible, so the user does
        not need to change any configuration files.

    * Small footprint
        Use only as much diskspace as needed per user.

    * Reduce support requirements.
        A packaged version of Wine should be sufficiently easy to use and
	have quick and easy access to FAQs and documentation such that 
	requests to the newsgroup and development group go down.
        Further, it should be easy for users to capture good bug reports.

REQUIREMENTS
~~~~~~~~~~~~

Successfully installing Wine requires:
    * Much thought and work from the packager (1x)

    * A configuration file
        Wine will not run without a configuration file.  Wine provides a
        a sample config file and it can be found in documentation/samples.
        Some packagers may attempt to provide (or dynamically generate) a 
	default configuration file. Some packagers may wish to rely on 
	winesetup to generate the configuration file.

    * A writeable C drive
        A writeable C:\ directory structure on a per-user basis. 
	Applications do dump .ini file into C:\WINDOWS, installer
	dump .exe/.dll/etc. files into C:\WINDOWS or C:\Program Files.

    * An initial set of registry entries.
	For custom changes to the default registry, tools/wine.inf
	can be modified as needed. The current preferred method of 
	configuring/installing Wine is to run /tools/wineinstall.  
	There are several other choices that could be made; registries 
	can be imported from a Windows partition.  At this time, Wine 
	does not completely support a complex multi-user installation 
	ala Windows NT, but it could fairly readily.

     * Special files
        Some special .dll and .exe files in the C:\WINDOWS\SYSTEM
	directory, since applications directly check for their presence.

WINE COMPONENTS
~~~~~~~~~~~~~~~

   * Executable Files
	- notepad : The windows Notepad replacement.
	- progman : A Program Manager replacement.
	- regedit : A graphical tool to edit your registry or for 
		important a windows registry to Wine.
	- regsvr32 : A program to register/unregister .DLL's and .OCX files. 
		Only works on those dlls that can self-register.
	- taskmgr : A clone of the windows taskmgr, used for debugging and
		managing running Windows and Winlib processes.
	- uninstaller: A program to uninstall installed Windows programs. 
		Like the Add/Remove Program in the windows control panel.
	- wcmd :  Wine's command line interpreter, a cmd.exe replacement.
	- widl : Wine IDL compiler compiles (MS-RPC and DCOM) Interface 
		Definition Language files.
	- wine :  The main Wine executable. This program will load a Windows 
		binary and run it, relying upon the Wine shared object libraries.
	- wineboot : This program is executed on startup of the first wine 
		process of a particular user.wineboot won't automatically run 
		when needed.  Currently you have to manually run it after you 
		install something.
	- winebuild : Winebuild is a tool used for building Winelib applications 
		(and by Wine itself) to allow a developer to compile a .spec file 
		into a .spec.c file.
	- wineconsole : Render the output of CUI programs.
	- winedbg : A application making use of the debugging API to allow 
		debugging of Wine or Winelib applications as well as Wine itself 
		(kernel and all DLLs).
	- winedump : Dumps the imports and exports of NE and PE files.
	- winefile : A clone of the win3x filemanager.
	- winegcc/wineg++: Wrappers for gcc/g++ respectively, to make them behave 
		as MinGW's gcc. Used for porting apps over to Winelib.
	- winemaker : Winemaker is a perl script which is designed to help you 
		bootstrap the conversion of your Windows projects to Winelib. 
	- winemine :  A clone of "Windows Minesweeper" a demo WineLib app.
	- winepath :  A tool for converting between Windows paths and Unix paths 
	- wineserver : The Wine server is the process that manages resources, 
		coordinates threads, and provides synchronization and interprocess 
		communication primitives to Wine processes.
	- wineshelllink : This shell script can be called by Wine in order to 
		propagate Desktop icon and menu creation requests out to a 
		GNOME or KDE (or other Window Managers).
	- winewrap : Takes care of linking winelib applications. Linking with 
		Winelib is a complex process, winewrap makes it simple.
	- winhelp : A Windows Help replacement.
	- wmc : Wine Message Compiler it allows Windows message files to be 
		compiled into a format usable by Wine.
	- wrc : the Wine Resource Compiler. A clone of Microsoft's rc.

    * Shared Object Library Files
	To obtain a current list of DLLs, run:
		ls dlls/*.so
	it the root of the Wine _build_ tree, after a successful build.

    * Man Pages
	To obtain a current list of man files that need to be installed, run:
		find . -name "*.man"
	it the root of the Wine _build_ tree, after you have run ./configure.

    * Include Files
	An up to date list of includes can be found in the include/Makefile.in file.

    * Documentation files
	After building the documentation with:
		cd documentation; make html
	install all the files from: wine-user/, wine-devel/ and winelib-user/.

     * Dynamic Wine Files
        Wine also generates and depends on a number of dynamic
        files, including user configuration files and registry files.

        At the time of this writing, there was not a clear
        consensus of where these files should be located, and how
        they should be handled.  This section attempts
        to explain the alternatives clearly.

        - WINEPREFIX/config
            This file is the user local Wine configuration file.
            At the time of this writing, if this file exists,
            then no other configuration file is loaded.

        - ETCDIR/wine.conf
            This is the global Wine configuration file. It is only used
	    if the user running Wine has no local configuration file.
	    Global wine configuration is currently not possible;
	    this might get reenabled at some time.
            Some packagers feel that this file should not be supplied, 
	    and that only a wine.conf.default should be given here.
            Other packagers feel that this file should be the predominant
	    file used, and that users should only shift to a local 
	    configuration file if they need to.  An argument has been
            made that the local configuration file should inherit the 
	    global configuration file.  At this time, Wine does not do this;
            please refer to the WineHQ discussion archives for the debate 
	    concerning this.
            This debate is addressed more completely below, in the
	    'Packaging Strategy' section.

    * Registry Files
            In order to replicate the Windows registry system,
            Wine stores registry entries in a series of files.

            For an excellent overview of this issue, read this
            http://www.winehq.org/News/2000-25.html#FTR
            Wine Weekly News feature.

            The bottom line is that, at Wine server startup,
            Wine loads all registry entries into memory
            to create an in memory image of the registry.
            The order of files which Wine uses to load
            registry entries is extremely important,
            as it affects what registry entries are
            actually present.  The order is roughly that
            .dat files from a Windows partion are loaded,
            then global registry settings from ETCDIR,
            and then finally local registry settings are
            loaded from WINEPREFIX.  As each set are loaded,
            they can override the prior entries.  Thus,
            the local registry files take precedence.

            Then, at exit (or at periodic intervals),
            Wine will write either all registry entries
            (or, with the default setting) changed
            registry entries to files in the WINEPREFIX.

	    - WINEPREFIX/system.reg
                This file contains the user's local copy of the 
		HKEY_LOCAL_MACHINE registry hive.  In general use, it will
		contain only changes made to the default registry values.

	    - WINEPREFIX/user.reg
                This file contains the user's local copy of the 
		HKEY_CURRENT_MACHINE registry hive.  In general use, it will
		contain only changes made to the default registry values.

	    - WINEPREFIX/userdef.reg
                This file contains the user's local copy of the 
		HKEY_USERS\.Default registry hive.  In general use, it will
		contain only changes made to the default registry values.

	    - WINEPREFIX/cachedmetrics.[display]
                This file contains font metrics for the given X display.
                Generally, this cache is generated once at Wine start time.
                cachedmetrics can be generated if absent. 
		You should note this can take a long time.

	    - ETCDIR/wine.systemreg 
                This file contains the global values for HKEY_LOCAL_MACHINE. 
		The values in this file can be overridden by the user's 
		local settings. The location of this directory is hardcoded 
		within wine, generally to /etc. 

	    - ETCDIR/wine.userreg
                This file contains the global values for HKEY_USERS.  
		The values in this file can be overridden by the user's 
		local settings.  This file is likely to be deprecated in
                favor of a global wine.userdef.reg that will only contain 
		HKEY_USERS/.Default.

    * Important Files from a Windows Partition
        Wine has the ability to use files from an installation of the
        actual Microsoft Windows operating system.  Generally these
        files are loaded on a VFAT partition that is mounted under Linux.

        This is probably the most important configuration detail.
        The use of Windows registry and DLL files dramatically alters the 
	behaviour of Wine. If nothing else, pacakager have to make this 
	distinction clear to the end user, so that they can intelligently
        choose their configuration.

        - WINDOWSDIR/system32/system.dat
        - WINDOWSDIR/system32/user.dat
	- WINDOWSDIR/win.ini

    * Windows Dynamic Link Libraries (WINDOWSDIR/system32/*.dll)
        Wine has the ability to use the actual Windows DLL files
        when running an application.  An end user can configure
        Wine so that Wine uses some or all of these DLL files
        when running a given application.

PACKAGING STRATEGIES
~~~~~~~~~~~~~~~~~~~~

There has recently been a lot of discussion on the Wine
development mailing list about the best way to build Wine packages.

There was a lot of discussion, and several diverging points of view.
This section of the document attempts to present the areas of common 
agreement, and also to present the different approaches advocated on 
the mailing list.

    * Distribution of Wine into packages
        The most basic question to ask is given the Wine CVS tree,
        what physical files are you, the packager, going to produce?
        Are you going to produce only a wine.rpm (as Marcus has done),
        or are you going to produce 6 Debian files (libwine, libwine-dev,
	wine, wine-doc, wine-utils and winesetuptk) as Ove has done?
        At this point, common practice is to adopt to the conventions
	of the targeted distribution. 

    * Where to install files
        This question is not really contested.  It will vary
        by distribution, and is really up to the packager.
        As a guideline, the current 'make install' process
        seems to behave such that if we pick a single PREFIX then:
            - binary files go into PREFIX/bin
	    - library files go into PREFIX/lib/wine
	    - include files go into PREFIX/include/wine
	    - man pages go into PREFIX/share/man
	    - documentation files go into PREFIX/share/doc/wine-VERSION

	You might also want to use the wine wrapper script winelauncher
	that can be found in tools/ directory, as it has several important
	advantages over directly invoking the wine binary.
	See the Executable Files section for details.

    * The question of /opt/wine
        The FHS 2.2 specification suggests that Wine as a package
        should be installed to /opt/wine.  None of the existing packages 
	follow this guideline (today; check again tomorrow).

    * What files to create
        After installing the static and shareable files, the next
        question the packager needs to ask is how much dynamic
        configuration will be done, and what configuration
        files should be created.
        There are several approaches to this:
            - Rely completely on user file space - install nothing
                This approach relies upon the new winesetup utility
                and the new ability of Wine to launch winesetup if no
                configuration file is found.  The basic concept is
                that no global configuration files are created at
                install time.  Instead, Wine configuration files are
                created on the fly by the winesetup program when Wine
                is invoked.  Further, winesetup creates default
                Windows directories and paths that are stored
                completely in the user's WINEPREFIX.  This approach
                has the benefit of simplicity in that all Wine files
                are either stored under /opt/wine or under ~/.wine.
                Further, there is only ever one Wine configuration
                file.  This approach, however, adds another level of
                complexity.  It does not allow Wine to run Solitaire
                'out of the box'; the user must run the configuration
                program first.  Further, winesetup requires Tcl/Tk, a
                requirement not beloved by some.  Additionally, this
                approach closes the door on multi user configurations
                and presumes a single user approach.

	    - Build a reasonable set of defaults for the global wine.conf,
	      facilitate creation of a user's local Wine configuration.
                This approach, best shown by Marcus, causes the
                installation process to auto scan the system,
                and generate a global wine.conf file with best
                guess defaults.  The OpenLinux packages follow
                this behaviour.
                The keys to this approach are always putting
                an existing Windows partition into the
                path, and being able to run Solitaire
                right out of the box.
                Another good thing that Marcus does is he
                detects a first time installation and
                does some clever things to improve the
                user's Wine experience.
                A flaw with this approach, however, is it doesn't
                give the user an obvious way to choose not to
                use a Windows partition.

	    - Build a reasonable set of defaults for the global wine.conf,
              and ask the user if possible
                This approach, demonstrated by Ove, causes the
                installation process to auto scan the system,
                and generate a global wine.conf file with best
                guess defaults.  Because Ove built a Debian
                package, he was able to further query debconf and
                get permission to ask the user some questions,
                allowing the user to decide whether or not to
                use a Windows partition.

IMPLEMENTATION
~~~~~~~~~~~~~~

This section discusses the implementation of a Red Hat 8.0 .spec file.
For a current .spec file, please refer to any one of the existing SRPMs.

1. Building the package

Wine is configured the usual way (depending on your build environment). 
The PREFIX is chosen using your application placement policy
(/usr/, /usr/X11R6/, /opt/wine/, or similar).  The configuration files
(wine.conf, wine.userreg, wine.systemreg) are targeted for /etc/wine/
(rationale: FHS 2.2, 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
	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 separate 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 Wine server is needed.
	install -m 755 server/wineserver $BR/usr/X11R6/bin/


There are now a lot of libraries generated by the build process, so a 
separate library directory should be used.

	install -d 755 $BR/usr/X11R6/lib/
	mv $BR/
        
You will need to package the files:

	$prefix/bin/wine, $prefix/lib/wine/*
	$prefix/man/man1/wine.1, $prefix/include/wine/*,
	$prefix/bin/wineserver

	%config /etc/wine/*
	%doc ... choose from the toplevel directory and documentation/

The post-install script:

	if ! grep /usr/X11R6/lib/wine /etc/ld.so.conf &gt;/dev/null; then
	    echo "/usr/X11R6/lib/wine" &gt;&gt; /etc/ld.so.conf
	fi
	/sbin/ldconfig

The post-uninstall script:

	if [ "$1" = 0 ]; then
	    perl -ni -e 'print unless m:/usr/X11R6/lib/wine:;' /etc/ld.so.conf
	fi
	/sbin/ldconfig

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 distribution's default floppy mountpoint.
		Path=/auto/floppy
	- C for the C:\ directory. Here we use the user's home directory, for most
	  applications do see C:\ as root-writeable directory of every windows
	  installation and this basically is it in the UNIX-user context.
	  Don't forget to identify environment variables as DOS ones (ie, surrounded by '%').
		Path=%HOME%
	- R for the CD-Rom drive. Specify your distribution's default CD-ROM mountpoint.
		Path=/auto/cdrom
	- T for temporary storage. We do use /tmp/ (rationale: between process 
	  temporary data belongs to /tmp/ , FHS 2.0)
		Path=/tmp/
	- W for the original Windows installation. This drive points to the
	  WINDOWSDIR subdirectory of the original windows installation.
	  This avoids problems with renamed WINDOWSDIR 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. This avoids any roblems with 
	  "could not find drive for current directory" users occasionally complain
	  about in the newsgroup and the irc channel. It also makes the whole 
	  directory structure browseable. The type of Z should be network,
	  so applications expect it to be readonly.
		Path=/
	  
    * [wine]:
	Windows=c:\windows\ 		(the windows/ subdirectory in the user's
				 home directory)
	System=c:\windows\system\	(the windows/system subdirectory in the user's
  					 home directory)
	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)

    * Possibly modify the [spooler], [serialports] and [parallelports] sections.
      FIXME: possibly more, including printer stuff.

Add this prepared configuration file to the package.

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. That's it.

Note that on Linux you should somehow try to add the unhide mount optioni
(see 'man mount') to the CD-ROM entry in /etc/fstab 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
unhide is not set ;-\ And of course the setup program will complain
that setup.ins or some other mess is missing... If you choose to do so, 
then please make this change verbose to the admin.

Also make sure that the kernel you use includes the Joliet CD-ROM support, 
for the very same reasons as given above (no long filenames due to missing 
Joliet, files not found).
              
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:\windows\Start Menu\Programs, c:\Program Files, c:\Desktop, etc.)
    * Symlink all .dll and .exe files from the original windows installation
      to the windows directory. Why? Some programs reference 
      "%windowsdir%/file.dll" or "%systemdir%/file.dll" directly and fail
      if they are not present.  This will give a huge number of symlinks, yes.
      However, if an installer later overwrites one of those files, it will 
      overwrite the symlink (so that the file now lies in the windows/
      subdirectory). FIXME: Not sure this is needed for all files.
    * On later invocation the script might want to compare regular files in 
      the user's windows directories and in the global windows directories
      and replace same files by symlinks (to avoid diskspace problems).
    
AUTHORS
~~~~~~~

Written in 1999 by Marcus Meissner <marcus@jet.franken.de>
Updated in 2000 by Jeremy White <jwhite@codeweavers.com>
Updated in 2002 by Andreas Mohr <andi@rhlx01.fht-esslingen.de>
Updated in 2003 by Tom Wickline <twickline2@triad.rr.com>
Updated in 2003 by Dimitrie O. Paun <dpaun@rogers.com>
