| 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 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. | |
| * 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. | |
| * 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. | |
| * 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 | |
| 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 the RPM. | |
| * No longer: A configuration file | |
| Wine will run without a configuration file at this time. Wine | |
| provides 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 copy this on | |
| startup, but it is no longer necessary. | |
| * 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'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 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. | |
| - 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. | |
| - 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. | |
| - 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 hard coded | |
| 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 | |
| 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.conf, 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. Creating a good default configuration file. | |
| This is no longer necessary, most of this work is now done | |
| by wineprefixcreate itself. | |
| 3. 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). | |
| 4. 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> |