|  | 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> |