| 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. | 
 |  | 
 |     * 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 | 
 |         their registry settings.  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 favor 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. | 
 |  | 
 |     * libresolv | 
 |       This is the standard Unix domain name resolver library that is | 
 |       used to implement DNS support found in dnsapi.dll. resolv.h as | 
 |       well as libresolv.so should be present at build time. | 
 |  | 
 |     * 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. | 
 |  | 
 |     * fontforge: http://sourceforge.net/projects/fontforge/ | 
 |       Used by WINE to create our own set of TrueType fonts during build. | 
 |  | 
 |     * fontconfig | 
 |       Used to find TrueType fonts for rendering with freetype. Used by | 
 |       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. Used | 
 |       by WINEPS and WINSPOOL. | 
 |  | 
 |     * 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. | 
 |  | 
 |     * OpenLDAP: http://www.openldap.org | 
 |       Used by WLDAP32 to implement LDAP support. | 
 |  | 
 |     * LittleCMS: http://www.littlecms.com | 
 |       This library is used to implement MSCMS (Color Management System) | 
 |       which is needed by an increasing number of graphics applications. | 
 |  | 
 |     * libjpeg | 
 |       This library is used to load JPEG files within OLE automation. | 
 |  | 
 |     * libungif or gif_lib | 
 |       One of these two libraries is used to load GIF files within OLE | 
 |       automation. | 
 |  | 
 |     * ICU | 
 |       Used for bidirectional character output. Linked statically, used | 
 |       by GDI. | 
 |  | 
 |     * sane | 
 |       Used for basic scanner support in our TWAIN32 library. | 
 |  | 
 |     * openssl | 
 |       Used for some cryptographic support in ADVAPI32. | 
 |  | 
 |     * Xrandr, Xrender, Xi, Xext | 
 |       X11 extension libraries used by the x11drv. | 
 |       Xrandr - resolution switching | 
 |       Xrender - client side font rendering | 
 |       Xi - X Input handling (for asian input methods mostly) | 
 |       Xext - X extensions | 
 |  | 
 |     * libxml2, libxslt | 
 |       These two libraries are used for our msxml3.dll implementation. | 
 |  | 
 |     * prelink | 
 |       Used during build to locate WINE at a specific virtual address. | 
 |  | 
 |     * capi4linux | 
 |       Used to implement our capi2032.dll. | 
 |  | 
 |     * libgphoto2 | 
 |       Used to implement our gphoto2.ds (TWAIN datasource) | 
 |  | 
 |     * hal, dbus-1 | 
 |       Used to implement CD mount handling (via explorer.exe). | 
 |  | 
 | 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 seconds | 
 | 	of downloading the Wine package. | 
 |  | 
 |     * Comply with File system 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 disk space 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: | 
 |  | 
 |     * Install of the .rpm or .deb package. | 
 |  | 
 |     * No longer: Preparing a fake windows setup. | 
 |  | 
 | 	If WINEPREFIX is not present, wine will generate a setup | 
 | 	by itself by calling wineprefixcreate. | 
 |  | 
 |         This will load all default registry entries, and register dlls | 
 | 	where necessary. A special "wine.inf" file is provided with | 
 | 	the WINE sources and installed to /usr/share/wine/. | 
 |  | 
 | WINE COMPONENTS | 
 | ~~~~~~~~~~~~~~~ | 
 |  | 
 |    * Executable Files | 
 | 	- notepad : The windows Notepad replacement. | 
 | 	- progman : A Program Manager replacement. | 
 | 	- regedit : A graphical tool to edit your registry or for | 
 | 		importing a windows registry to Wine. | 
 | 	- regsvr32 : A program to register/unregister .DLL 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 file manager. | 
 | 	- 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. | 
 |  | 
 |  | 
 |         - PREFIX/share/wine.inf | 
 | 	 | 
 |             This is the global Wine setup information file | 
 | 	    in the format of a MS Installer .INF file. | 
 |  | 
 |     * 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 partition are loaded, | 
 |             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. | 
 |  | 
 |     * 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 | 
 | 	behavior of Wine. If nothing else, packagers 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, 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. | 
 |  | 
 | 	Also, experience shows that you should not create a huge set | 
 | 	of packages, since later upgrades and obsoleting will be | 
 | 	painful. | 
 |  | 
 |     * 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). | 
 |  | 
 | 	(Since most are upgrades of the distro packages, this is still | 
 | 	 on the safe side I think - Marcus Meissner) | 
 |  | 
 |     * 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. | 
 |  | 
 |         The best current approach to this is: | 
 | 	- Leave it alone and make a "wineprefixcreate" call available | 
 | 	  to the user via a menu item or similar. | 
 |  | 
 |         - Setup a fake windows setup automatically. | 
 | 		 | 
 | 		This is done by simply calling wineprefixcreate, | 
 | 		which will setup a fake windows root for the user. | 
 |  | 
 | 		If no arguments are passed, defaults will be | 
 | 		assumed for WINEPREFIX (~/.wine) and similar | 
 | 		variables. | 
 |  | 
 | 		After this, WINE is immediately usable by the | 
 | 		end user. | 
 |  | 
 | 	- Others might be possible. | 
 |  | 
 | 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.userreg, wine.systemreg) are targeted for /etc/wine/ | 
 | (rationale: FHS 2.2, multiple read only 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/ | 
 |  | 
 | You will need to package the files: | 
 |  | 
 | 	$prefix/bin/wine* | 
 | 	$prefix/lib/libwine* | 
 | 	$prefix/lib/wine/*, | 
 | 	$prefix/share/wine/wine.inf | 
 |  | 
 | 	$prefix/man/man1/wine.1 | 
 | 	$prefix/include/wine/* | 
 | 	$prefix/bin/notepad | 
 | 	$prefix/bin/progman | 
 | 	$prefix/bin/regedit | 
 | 	$prefix/bin/rundll32 | 
 | 	$prefix/bin/regsvr32 | 
 | 	$prefix/bin/wcmd | 
 | 	$prefix/bin/widl | 
 | 	$prefix/bin/winhelp | 
 |  | 
 | 	%config /etc/wine/* | 
 | 	%doc ... choose from the top level directory and documentation/ | 
 |  | 
 |  | 
 | 2. Installing Wine for the system administrator | 
 |  | 
 | Install the package using the usual packager 'rpm -i wine.rpm'. | 
 |  | 
 | Adapting the $prefix/share/wine/wine.inf file used by wineprefixcreate is not | 
 | necessary. | 
 |  | 
 | Note that on Linux you should somehow try to add the unhide mount option | 
 | (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). | 
 |  | 
 | 3. Installing Wine for the user | 
 |  | 
 | If no standard wine prefix was setup, the first call to wine will | 
 | create one for the user. | 
 |  | 
 | So the user can just click on any setup.exe file and it will work | 
 | out of the box. | 
 |  | 
 | 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> | 
 | Updated in 2004,2005 by Marcus Meissner <marcus@jet.franken.de> |