513 lines
20 KiB
Plaintext
513 lines
20 KiB
Plaintext
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
|
|
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 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, packager 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
|
|
|
|
The user will need to run a wineprefixcreate before the first invocation
|
|
of Wine.
|
|
|
|
A packager might provide a wrapper for wine to do that automatically,
|
|
like if the WINEPREFIX directory (~/.wine) is not present.
|
|
|
|
Thats it.
|
|
|
|
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 by Marcus Meissner <marcus@jet.franken.de>
|