| <chapter id="compiling"> |
| <title>Getting and Compiling the Wine Source</title> |
| <para>How to obtain and compile wine, and problems that may arise...</para> |
| |
| <sect1 id="getting-source"> |
| <title>Getting Wine Source</title> |
| <para> |
| If you are going to compile Wine, either to use the most recent |
| code possible or to improve it, then the first thing to do is to |
| obtain a copy of the source code. We'll cover how to retrieve and |
| compile the official source releases from the <link |
| linkend="getting-source-ftp">FTP archives</link>, and also how |
| to get the cutting edge up-to-the-minute fresh Wine source |
| code from <link linkend="getting-source-cvs">CVS (Concurrent |
| Versions System)</link>. Both processes of source code |
| installation are similar, and once you master one, you should |
| have no trouble dealing with the other one. |
| </para> |
| <para> |
| You may also need to know how to apply a source code patch to |
| your version of Wine. Perhaps you've uncovered |
| a bug in Wine, reported it to the <ulink |
| url="mailto:wine-devel@winehq.com">Wine mailing list</ulink>, |
| and received a patch from a developer to hopefully fix the |
| bug. We will show you how to |
| <link linkend="getting-upgrading">safely apply the |
| patch</link> and revert it if the patch doesn't work. |
| </para> |
| |
| <sect2 id="getting-source-ftp"> |
| <title>Getting Wine Source Code from the FTP Archive</title> |
| |
| <para> |
| The safest way to grab the source is from one of the official |
| FTP archives. An up to date listing is in the <ulink |
| url="http://www.winehq.com/source/ANNOUNCE">ANNOUNCE</ulink> |
| file in the Wine distribution (which you would have if you |
| already downloaded it). Here is a list |
| of FTP servers carrying Wine: |
| </para> |
| <itemizedlist> |
| <listitem> |
| <para> |
| <ulink url="ftp://ftp.ibiblio.org/pub/Linux/ALPHA/wine/development/"> |
| ftp://ftp.ibiblio.org/pub/Linux/ALPHA/wine/development/ |
| </ulink> |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| <ulink url="ftp://ftp.infomagic.com/pub/mirrors/linux/sunsite/ALPHA/wine/development/"> |
| ftp://ftp.infomagic.com/pub/mirrors/linux/sunsite/ALPHA/wine/development/ |
| </ulink> |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| <ulink url="ftp://ftp.fu-berlin.de/unix/linux/mirrors/sunsite.unc.edu/ALPHA/wine/development/"> |
| ftp://ftp.fu-berlin.de/unix/linux/mirrors/sunsite.unc.edu/ALPHA/wine/development/ |
| </ulink> |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| <ulink url="ftp://orcus.progsoc.uts.edu.au/pub/Wine/development/"> |
| ftp://orcus.progsoc.uts.edu.au/pub/Wine/development/ |
| </ulink> |
| </para> |
| </listitem> |
| </itemizedlist> |
| <para> |
| The official releases are tagged by date with the format |
| "Wine-<replaceable>YYYYMMDD</>.tar.gz". Your best bet is to grab |
| the latest one. |
| </para> |
| <para> |
| Once you have downloaded this, you must first compile wine, and then |
| install it. This is not very hard to do. First switch to the |
| directory containing the file you just downloaded. Then extract the |
| source with (e.g.): |
| <screen> |
| <prompt># </><userinput>tar xzvf wine-<replaceable>20021031</>.tar.gz</> |
| </screen> |
| </para> |
| <para> |
| Then, switch to the directory that was created and compile it by typing (e.g.): |
| <screen> |
| <prompt># </><userinput>./tools/wineinstall</> |
| </screen> |
| </para> |
| <para> |
| NOTE: You must make sure that you are not the superuser (root) when doing this, |
| and that you have write permission to the directory that was created by the tar |
| command as well as all of its subdirectories and files.. |
| </para> |
| </sect2> |
| |
| <sect2 id="getting-source-cvs"> |
| <title>Getting Wine Source Code from CVS</title> |
| |
| <para> |
| The official web page for Wine CVS is |
| <ulink url="http://www.winehq.com/development/"> |
| http://www.winehq.com/development/</>. |
| </para> |
| <para> |
| First, you need to get a copy of the latest Wine sources |
| using CVS. You can tell it where to find the source tree by |
| setting the <envar>CVSROOT</envar> environment variable. You |
| also have to log in anonymously to the wine CVS server. In |
| <command>bash</>, it might look something like this: |
| <screen> |
| <prompt>$ </><userinput>export CVSROOT=:pserver:cvs@cvs.winehq.com:/home/wine</> |
| <prompt>$ </><userinput>cvs login</> |
| Password: |
| <prompt>$ </><userinput>cvs checkout wine</> |
| </screen> |
| </para> |
| <para> |
| That'll pull down the entire Wine source tree from |
| winehq.com and place it in the current directory (actually |
| in the 'wine' subdirectory). CVS has a million command line |
| parameters, so there are many ways to pull down files, from |
| anywhere in the revision history. Later, you can grab just |
| the updates: |
| <screen> |
| <prompt>$ </><userinput>cvs -PAd update</> |
| </screen> |
| </para> |
| <para> |
| <command>cvs update</> works from inside the source tree. |
| You don't need the <envar>CVSROOT</> environment variable |
| to run it either. You just have to be inside the source tree. |
| The <parameter>-P</>, <parameter>-A</> and <parameter>-d</> |
| options make sure your local Wine tree directory structure stays |
| in sync with the remote repository. |
| </para> |
| <para> |
| After you've made changes, you can create a patch with |
| <command>cvs diff -u</>, which sends output to stdout |
| (the <parameter>-u</> controls the format of the |
| patch). So, to create an <filename>my_patch.diff</> |
| file, you would do this: |
| <screen> |
| <prompt>$ </><userinput>cvs diff -u ><replaceable>my_patch.diff</></> |
| </screen> |
| </para> |
| <para> |
| You can call <command>cvs diff</command> from anywhere in the |
| tree (just like <command>cvs update</command>), and it will |
| always grab recursively from that point. You can also specify |
| single files or subdirectories: |
| <screen> |
| <prompt>$ </><userinput>cvs diff -u dlls/winaspi ><replaceable>my_aspi_patch.diff</></> |
| </screen> |
| </para> |
| <para> |
| Experiment around a little. It's fairly intuitive. |
| </para> |
| </sect2> |
| |
| <sect2 id="getting-upgrading"> |
| <title>Upgrading Wine with a Patch</title> |
| <para> |
| If you have the Wine source code, as opposed to a binary |
| distribution, you have the option of applying patches to the |
| source tree to fix bugs and add experimental features. |
| Perhaps you've found a bug, reported it to the <ulink |
| url="mailto:wine-devel@winehq.com">Wine mailing list</>, |
| and received a patch file to fix the bug. You can apply the |
| patch with the <command>patch</> command, which takes a |
| streamed patch from <filename>stdin</>: |
| <screen> |
| <prompt>$ </><userinput>cd wine</> |
| <prompt>$ </><userinput>patch -p0 <<replaceable>../patch_to_apply.diff</></> |
| </screen> |
| </para> |
| <para> |
| To remove the patch, use the <parameter>-R</> option: |
| <screen> |
| <prompt>$ </><userinput>patch -p0 -R <<replaceable>../patch_to_apply.diff</></> |
| </screen> |
| </para> |
| <para> |
| If you want to do a test run to see if the patch will apply |
| successfully (e.g., if the patch was created from an older or |
| newer version of the tree), you can use the |
| <parameter>--dry-run</> parameter to run the patch |
| without writing to any files: |
| <screen> |
| <prompt>$ </><userinput>patch -p0 --dry-run <<replaceable>../patch_to_apply.diff</></> |
| </screen> |
| </para> |
| <para> |
| <command>patch</> is pretty smart about extracting |
| patches from the middle of a file, so if you save an email with |
| an inlined patch to a file on your hard drive, you can invoke |
| patch on it without stripping out the email headers and other |
| text. <command>patch</> ignores everything that doesn't |
| look like a patch. |
| </para> |
| <para> |
| The <parameter>-p0</> option to <command>patch</> |
| tells it to keep the full file name from the patch file. For example, |
| if the file name in the patch file was |
| <filename>wine/programs/clock/main.c</>. |
| Setting the <parameter>-p0</> option would apply the patch |
| to the file of the same name i.e. |
| <filename>wine/programs/clock/main.c </>. |
| Setting the <parameter>-p1</> option would strip off the |
| first part of the file name and apply |
| the patch instead to <filename>programs/clock/main.c </>. |
| The <parameter>-p1</> option would be useful if you named |
| your top level wine directory differently to the person who sent you |
| the patch. For the <parameter>-p1</> option |
| <command>patch</> should be run from the top level wine directory. |
| </para> |
| </sect2> |
| </sect1> |
| |
| <sect1 id="compiling-wine"> |
| <title>Compiling Wine</title> |
| |
| <sect2> |
| <title>Tools required</title> |
| <para> |
| <itemizedlist> |
| <listitem> |
| <para> |
| gcc -- 2.7.x required (Wine uses attribute stdcall). |
| Versions earlier than 2.7.2.3 barf on shellord.c |
| -- compile without optimizing for that file. |
| In addition EGCS 1.1.x and GCC 2.95.x are reported |
| to work fine. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| flex >= 2.5.1 (required for the debugger and wrc, |
| and lex won't do) |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| bison (also required for debugger. Don't know whether BSD yacc |
| would work.) |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| X11 libs and include files |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| texinfo >= 3.11 (optional, to compile the documentation.) |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| autoconf (if you want to remake configure, which is |
| not normally required) |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| XF86DGA extension (optional, detected by configure, |
| needed for DirectX support) |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| Open Sound System (optional, detected by configure, |
| for sound support) |
| </para> |
| </listitem> |
| </itemizedlist> |
| </para> |
| <para> |
| The Red Hat RPMs are gcc-XXX, flex-XXX, and |
| XFree86-devel-XXX, where XXX is the version number. |
| </para> |
| </sect2> |
| |
| <sect2> |
| <title>Space required</title> |
| <para> |
| You also need about 230 MB of available disk space for compilation. |
| The compiled libwine.so binary takes around 5 MB of disk space, |
| which can be reduced to about 1 MB by stripping ('strip wine'). |
| Stripping is not recommended, however, as you can't submit |
| proper crash reports with a stripped binary any more. |
| </para> |
| </sect2> |
| |
| <sect2> |
| <title>Common problems</title> |
| <para> |
| If you get a repeatable sig11 compiling shellord.c, thunk.c |
| or other files, try compiling just that file without optimization. |
| Then you should be able to finish the build. |
| </para> |
| </sect2> |
| |
| <sect2> |
| <title>OS specific issues</title> |
| <para> |
| <itemizedlist> |
| <listitem> |
| <para> |
| FreeBSD -- In order to run Wine, the FreeBSD kernel |
| needs to be compiled with |
| |
| <informaltable frame="all"> |
| <tgroup cols="2"> |
| <tbody> |
| <row> |
| <entry>options</entry> |
| <entry>USER_LDT</entry> |
| </row> |
| <row> |
| <entry>options</entry> |
| <entry>SYSVSHM</entry> |
| </row> |
| <row> |
| <entry>options</entry> |
| <entry>SYSVSEM</entry> |
| </row> |
| <row> |
| <entry>options</entry> |
| <entry>SYSVMSG</entry> |
| </row> |
| </tbody> |
| </tgroup> |
| </informaltable> |
| |
| |
| If you need help, read the chapter "<ulink url="http://www.freebsd.org/handbook/kernelconfig-building.html">Building and Installing a Custom Kernel</ulink>" in the "<ulink url="http://www.freebsd.org/handbook/">FreeBSD handbook</ulink>. You'll need to be running FreeBSD 3.x or later. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| SCO Unixware, Openserver -- UW port is supported by SCO. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| OS/2 -- not a complete port. See <ulink url="http://odin.netlabs.org/ProjectAbout.phtml">Odin</ulink> for a project which uses some Wine code. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| Solaris x86 2.x -- Needs GNU toolchain (gcc, gas, flex as above, yacc may work) to compile, seems functional (980215). |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| DGUX, HP, Irix, or other Unixes; non-intel Linux. |
| No ports have been seriously attempted. |
| For non-intel Unixes, only a winelib port is relevant. |
| Alignment may be a problem. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| Macintosh/Rhapsody/BeOS -- no ports have been attempted. |
| </para> |
| </listitem> |
| </itemizedlist> |
| </para> |
| </sect2> |
| </sect1> |
| </chapter> |
| |
| <!-- Keep this comment at the end of the file |
| Local variables: |
| mode: sgml |
| sgml-parent-document:("wine-doc.sgml" "set" "book" "part" "chapter" "") |
| End: |
| --> |