396 lines
13 KiB
Plaintext
396 lines
13 KiB
Plaintext
|
<chapter id="porting">
|
||
|
<title>Porting Wine to new Platforms</title>
|
||
|
<para>Porting Wine to different (UNIX-based) operating systems...</para>
|
||
|
|
||
|
<sect1 id="wine-porting">
|
||
|
<title>Porting</title>
|
||
|
|
||
|
<para>
|
||
|
written by ???
|
||
|
</para>
|
||
|
<para>
|
||
|
(Extracted from <filename>wine/documentation/how-to-port</filename>)
|
||
|
</para>
|
||
|
|
||
|
<sect2>
|
||
|
<title>What is this?</title>
|
||
|
|
||
|
<para>
|
||
|
This note is a short description of:
|
||
|
</para>
|
||
|
|
||
|
<itemizedlist>
|
||
|
<listitem>
|
||
|
<para>How to port Wine to your favourite operating system</para>
|
||
|
</listitem>
|
||
|
<listitem>
|
||
|
<para>Why you probably shouldn't use <symbol>#ifdef MyOS</symbol></para>
|
||
|
</listitem>
|
||
|
<listitem>
|
||
|
<para>What to do instead.</para>
|
||
|
</listitem>
|
||
|
</itemizedlist>
|
||
|
|
||
|
<para>
|
||
|
This document does not say a thing about how to port Wine to
|
||
|
non-386 operating systems, though. You would need a CPU
|
||
|
emulator. Let's get Wine into a better shape on 386 first,
|
||
|
OK?
|
||
|
</para>
|
||
|
</sect2>
|
||
|
|
||
|
<sect2>
|
||
|
<title>Why <symbol>#ifdef MyOS</symbol> is probably a mistake.</title>
|
||
|
|
||
|
<para>
|
||
|
Operating systems change. Maybe yours doesn't have the
|
||
|
<filename>foo.h</filename> header, but maybe a future
|
||
|
version will have it. If you want to <symbol>#include
|
||
|
<foo.h></symbol>, it doesn't matter what operating
|
||
|
system you are using; it only matters whether
|
||
|
<filename>foo.h</filename> is there.
|
||
|
</para>
|
||
|
<para>
|
||
|
Furthermore, operating systems change names or "fork" into
|
||
|
several ones. An <symbol>#ifdef MyOs</symbol> will break
|
||
|
over time.
|
||
|
</para>
|
||
|
<para>
|
||
|
If you use the feature of <command>autoconf</command> -- the
|
||
|
Gnu auto-configuration utility -- wisely, you will help
|
||
|
future porters automatically because your changes will test
|
||
|
for <emphasis>features</emphasis>, not names of operating
|
||
|
systems. A feature can be many things:
|
||
|
</para>
|
||
|
|
||
|
<itemizedlist>
|
||
|
<listitem>
|
||
|
<para>existance of a header file</para>
|
||
|
</listitem>
|
||
|
<listitem>
|
||
|
<para>existance of a library function</para>
|
||
|
</listitem>
|
||
|
<listitem>
|
||
|
<para>existance of libraries</para>
|
||
|
</listitem>
|
||
|
<listitem>
|
||
|
<para>bugs in header files, library functions, the compiler, ...</para>
|
||
|
</listitem>
|
||
|
<listitem>
|
||
|
<para>(you name it)</para>
|
||
|
</listitem>
|
||
|
</itemizedlist>
|
||
|
<para>
|
||
|
You will need Gnu Autoconf, which you can get from your
|
||
|
friendly Gnu mirror. This program takes Wine's
|
||
|
<filename>configure.in</filename> file and produces a
|
||
|
<filename>configure</filename> shell script that users use
|
||
|
to configure Wine to their system.
|
||
|
</para>
|
||
|
<para>
|
||
|
There <emphasis>are</emphasis> exceptions to the "avoid
|
||
|
<symbol>#ifdef MyOS</symbol>" rule. Wine, for example, needs
|
||
|
the internals of the signal stack -- that cannot easily be
|
||
|
described in terms of features.
|
||
|
</para>
|
||
|
<para>
|
||
|
Let's now turn to specific porting problems and how to solve
|
||
|
them.
|
||
|
</para>
|
||
|
</sect2>
|
||
|
|
||
|
<sect2>
|
||
|
<title>MyOS doesn't have the <filename>foo.h</filename> header!</title>
|
||
|
|
||
|
<para>
|
||
|
This first step is to make <command>autoconf</command> check
|
||
|
for this header. In <filename>configure.in</filename> you
|
||
|
add a segment like this in the section that checks for
|
||
|
header files (search for "header files"):
|
||
|
</para>
|
||
|
<programlisting>
|
||
|
AC_CHECK_HEADER(foo.h, AC_DEFINE(HAVE_FOO_H))
|
||
|
</programlisting>
|
||
|
<para>
|
||
|
If your operating system supports a header file with the
|
||
|
same contents but a different name, say
|
||
|
<filename>bar.h</filename>, add a check for that also.
|
||
|
</para>
|
||
|
<para>
|
||
|
Now you can change
|
||
|
</para>
|
||
|
<programlisting>
|
||
|
#include <foo.h>
|
||
|
</programlisting>
|
||
|
<para>
|
||
|
to
|
||
|
</para>
|
||
|
<programlisting>
|
||
|
#ifdef HAVE_FOO_H
|
||
|
#include <foo.h>
|
||
|
#elif defined (HAVE_BAR_H)
|
||
|
#include <bar.h>
|
||
|
#endif
|
||
|
</programlisting>
|
||
|
<para>
|
||
|
If your system doesn't have a corresponding header file even
|
||
|
though it has the library functions being used, you might
|
||
|
have to add an <symbol>#else</symbol> section to the
|
||
|
conditional. Avoid this if you can.
|
||
|
</para>
|
||
|
<para>
|
||
|
You will also need to add <symbol>#undef HAVE_FOO_H</symbol>
|
||
|
(etc.) to <filename>include/config.h.in</filename>
|
||
|
</para>
|
||
|
<para>
|
||
|
Finish up with <command>make configure</command> and
|
||
|
<command>./configure</command>.
|
||
|
</para>
|
||
|
</sect2>
|
||
|
|
||
|
<sect2>
|
||
|
<title>MyOS doesn't have the <function>bar</function> function!</title>
|
||
|
|
||
|
<para>
|
||
|
A typical example of this is the
|
||
|
<function>memmove</function> function. To solve this
|
||
|
problem you would add <function>memmove</function> to the
|
||
|
list of functions that <command>autoconf</command> checks
|
||
|
for. In <filename>configure.in</filename> you search for
|
||
|
<function>AC_CHECK_FUNCS</function> and add
|
||
|
<function>memmove</function>. (You will notice that someone
|
||
|
already did this for this particular function.)
|
||
|
</para>
|
||
|
<para>
|
||
|
Secondly, you will also need to add <symbol>#undef
|
||
|
HAVE_BAR</symbol> to
|
||
|
<filename>include/config.h.in</filename>
|
||
|
</para>
|
||
|
<para>
|
||
|
The next step depends on the nature of the missing function.
|
||
|
</para>
|
||
|
|
||
|
<variablelist>
|
||
|
<varlistentry>
|
||
|
<term>Case 1:</term>
|
||
|
<listitem>
|
||
|
<para>
|
||
|
It's easy to write a complete implementation of the
|
||
|
function. (<function>memmove</function> belongs to
|
||
|
this case.)
|
||
|
</para>
|
||
|
<para>
|
||
|
You add your implementation in
|
||
|
<filename>misc/port.c</filename> surrounded by
|
||
|
<symbol>#ifndef HAVE_MEMMOVE</symbol> and
|
||
|
<symbol>#endif</symbol>.
|
||
|
</para>
|
||
|
<para>
|
||
|
You might have to add a prototype for your function.
|
||
|
If so, <filename>include/miscemu.h</filename> might be the place. Don't
|
||
|
forget to protect that definition by <symbol>#ifndef
|
||
|
HAVE_MEMMOVE</symbol> and <symbol>#endif</symbol> also!
|
||
|
</para>
|
||
|
</listitem>
|
||
|
</varlistentry>
|
||
|
<varlistentry>
|
||
|
<term>Case 2:</term>
|
||
|
<listitem>
|
||
|
<para>
|
||
|
A general implementation is hard, but Wine is only
|
||
|
using a special case.
|
||
|
</para>
|
||
|
<para>
|
||
|
An example is the various <function>wait</function>
|
||
|
calls used in <function>SIGNAL_child</function> from
|
||
|
<filename>loader/signal.c</filename>. Here we have a
|
||
|
multi-branch case on features:
|
||
|
</para>
|
||
|
<programlisting>
|
||
|
#ifdef HAVE_THIS
|
||
|
...
|
||
|
#elif defined (HAVE_THAT)
|
||
|
...
|
||
|
#elif defined (HAVE_SOMETHING_ELSE)
|
||
|
...
|
||
|
#endif
|
||
|
</programlisting>
|
||
|
<para>
|
||
|
Note that this is very different from testing on
|
||
|
operating systems. If a new version of your operating
|
||
|
systems comes out and adds a new function, this code
|
||
|
will magically start using it.
|
||
|
</para>
|
||
|
</listitem>
|
||
|
</varlistentry>
|
||
|
</variablelist>
|
||
|
<para>
|
||
|
Finish up with <command>make configure</command> and
|
||
|
<command>./configure</command>.
|
||
|
</para>
|
||
|
|
||
|
</sect2>
|
||
|
</sect1>
|
||
|
|
||
|
<sect1 id="os2-wine">
|
||
|
<title>Running & Compiling WINE in OS/2</title>
|
||
|
|
||
|
<para>
|
||
|
written by Robert Pouliot <krynos@clic.net>, January 9, 1997
|
||
|
|
||
|
</para>
|
||
|
<para>
|
||
|
(Extracted from <filename>wine/documentation/wine_os2</filename>)
|
||
|
</para>
|
||
|
|
||
|
<para>
|
||
|
If you want to help the port of WINE to OS/2, send me a
|
||
|
message at <email>krynos@clic.net</email> I currently don't
|
||
|
want beta testers. It must work before we can test it.
|
||
|
</para>
|
||
|
<para>
|
||
|
Here is what you need to (try to) compile Wine for OS/2:
|
||
|
</para>
|
||
|
|
||
|
<itemizedlist>
|
||
|
<listitem>
|
||
|
<para>EMX 0.9c (fix 2)</para>
|
||
|
</listitem>
|
||
|
<listitem>
|
||
|
<para>XFree86 3.2 OS/2 (with development libraries)</para>
|
||
|
</listitem>
|
||
|
<listitem>
|
||
|
<para>
|
||
|
<command>bash</command>, gnu <command>make</command>,
|
||
|
<command>grep</command>, <command>tar</command>,
|
||
|
<command>bison</command>, <command>flex</command>
|
||
|
</para>
|
||
|
</listitem>
|
||
|
<listitem>
|
||
|
<para><command>sed</command> (a working copy of)</para>
|
||
|
</listitem>
|
||
|
<listitem>
|
||
|
<para>xpm</para>
|
||
|
</listitem>
|
||
|
<listitem>
|
||
|
<para><command>diff</command> and <command>patch</command>
|
||
|
are recommended</para>
|
||
|
</listitem>
|
||
|
<listitem>
|
||
|
<para>Lots of disk space (about 40-50 megs after EMX and XFree installed)</para>
|
||
|
</listitem>
|
||
|
</itemizedlist>
|
||
|
|
||
|
<para>
|
||
|
To compile:
|
||
|
</para>
|
||
|
|
||
|
<screen>
|
||
|
<prompt>$ </prompt><userinput>sh</userinput>
|
||
|
<prompt>$ </prompt><userinput>tools/make_os2.sh</userinput>
|
||
|
<prompt>$ </prompt><userinput>make depend</userinput>
|
||
|
<prompt>$ </prompt><userinput>make</userinput>
|
||
|
<prompt>$ </prompt><userinput>emxbind wine</userinput>
|
||
|
</screen>
|
||
|
|
||
|
<para>
|
||
|
Currently:
|
||
|
</para>
|
||
|
|
||
|
<itemizedlist>
|
||
|
<listitem>
|
||
|
<para><command>configure</command> and <command>make depend</command> work...</para>
|
||
|
</listitem>
|
||
|
<listitem>
|
||
|
<para><command>make</command> compiles (with a modified
|
||
|
Linux <filename>mman.h</filename>), but doesn't
|
||
|
link.</para>
|
||
|
</listitem>
|
||
|
<listitem>
|
||
|
<para>signal handling is horrible... (if any)</para>
|
||
|
</listitem>
|
||
|
<listitem>
|
||
|
<para>EMX doesn't support <function>mmap</function> (and
|
||
|
related), SysV IPC and <function>stafs()</function></para>
|
||
|
</listitem>
|
||
|
<listitem>
|
||
|
<para>
|
||
|
XFree86/OS2 3.2 doesn't support
|
||
|
<function>XShmQueryExtension()</function> and
|
||
|
<function>XShmPixmapFormat()</function> due to the same
|
||
|
lack in EMX...
|
||
|
</para>
|
||
|
</listitem>
|
||
|
</itemizedlist>
|
||
|
|
||
|
<para>
|
||
|
What needs to be redone:
|
||
|
</para>
|
||
|
|
||
|
<itemizedlist>
|
||
|
<listitem>
|
||
|
<para>LDT (using <function>DosAllocSeg</function> in
|
||
|
<filename>memory/ldt.c</filename>) *</para>
|
||
|
</listitem>
|
||
|
<listitem>
|
||
|
<para>Implement <function>mmap()</function> and SysV IPC in EMX *</para>
|
||
|
</listitem>
|
||
|
<listitem>
|
||
|
<para>File functions, </para>
|
||
|
</listitem>
|
||
|
<listitem>
|
||
|
<para>I/O access (do it!),</para>
|
||
|
</listitem>
|
||
|
<listitem>
|
||
|
<para>Communication (modem),</para>
|
||
|
</listitem>
|
||
|
<listitem>
|
||
|
<para>Interrupt (if int unknown, call current RealMode one...), </para>
|
||
|
</listitem>
|
||
|
<listitem>
|
||
|
<para>
|
||
|
Verify that everything is thread safe (how does Win95/NT handle multi-thread?),
|
||
|
</para>
|
||
|
</listitem>
|
||
|
<listitem>
|
||
|
<para>
|
||
|
Move X functions in some files (and make a wrapper, to use PM instead latter),
|
||
|
</para>
|
||
|
</listitem>
|
||
|
<listitem>
|
||
|
<para>Return right CPU type, </para>
|
||
|
</listitem>
|
||
|
<listitem>
|
||
|
<para>Make winsock work</para>
|
||
|
</listitem>
|
||
|
</itemizedlist>
|
||
|
|
||
|
<para>
|
||
|
The good things:
|
||
|
</para>
|
||
|
|
||
|
<itemizedlist>
|
||
|
<listitem>
|
||
|
<para>OS/2 have DOS interrupts</para>
|
||
|
</listitem>
|
||
|
<listitem>
|
||
|
<para>OS/2 have I/O port access</para>
|
||
|
</listitem>
|
||
|
<listitem>
|
||
|
<para>OS/2 have multi-thread</para>
|
||
|
</listitem>
|
||
|
<listitem>
|
||
|
<para>Merlin have Open32 (to be used later...)</para>
|
||
|
</listitem>
|
||
|
</itemizedlist>
|
||
|
</sect1>
|
||
|
|
||
|
</chapter>
|
||
|
|
||
|
<!-- Keep this comment at the end of the file
|
||
|
Local variables:
|
||
|
mode: sgml
|
||
|
sgml-parent-document:("wine-doc.sgml" "book" "part" "chapter" "")
|
||
|
End:
|
||
|
-->
|