| <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 &name-robert-pouliot; <email>&email-robert-pouliot;</email>, |
| 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><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" "set" "book" "part" "chapter" "") |
| End: |
| --> |