What is this?
------------

This note is a short description of

* How to port Wine to your favourite operating system
* Why you probably shouldn't use "#ifdef MyOS"
* What to do instead.

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?




Why "#ifdef MyOS" is probably a mistake.
---------------------------------------

Operating systems change.  Maybe yours doesn't have the "foo.h"
header, but maybe a future version will have it.  If you want
to "#include <foo.h>", it doesn't matter what operating system
you are using; it only matters whether "foo.h" is there.

Furthermore, operating systems change names or "fork" into
several ones.  An "#ifdef MyOs" will break over time.

If you use the feature of Autoconf, the Gnu auto-configuration
utility wisely, you will help future porters automatically
because your changes will test for _features_, not names of
operating systems.  A feature can be many things:

* existance of a header file
* existance of a library function
* existance of libraries
* bugs in header files, library functions, the compiler, ...
* (you name it)

You will need Gnu Autoconf, which you can get from your
friendly Gnu mirror.  This program takes Wine's "configure.in"
file and produces a "configure" shell script that users use to
configure Wine to their system.

There _are_ exceptions to the "avoid #ifdef MyOS" rule.  Wine,
for example, needs the internals of the signal stack -- that
cannot easily be described in terms of features.

Let's now turn to specific porting problems and how to solve
them.



MyOS doesn't have the `foo.h' header!
------------------------------------

This first step is to make Autoconf check for this header.
In configure.in you add a segment like this in the section
that checks for header files (search for "header files"):

  AC_CHECK_HEADER(foo.h, AC_DEFINE(HAVE_FOO_H))

If your operating system supports a header file with the
same contents but a different name, say bar.h, add a check
for that also.

Now you can change

  #include <foo.h>

to

  #ifdef HAVE_FOO_H
  #include <foo.h>
  #elif defined (HAVE_BAR_H)
  #include <bat.h>
  #endif

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 "#else" section to the conditional.  Avoid
this if you can.

You will also need to add "#undef HAVE_FOO_H" (etc.) to
include/config.h.in

Finish up with "make configure" and "./configure".


MyOS doesn't have the `bar' function!
------------------------------------

A typical example of this is the `memmove'.  To solve this
problem you would add `memmove' to the list of functions
that Autoconf checks for.  In configure.in you search for
AC_CHECK_FUNCS and add `memmove'.  (You will notice that
someone already did this for this particular function.)

Secondly, you will also need to add "#undef HAVE_BAR"
to include/config.h.in

The next step depends on the nature of the missing function.

Case 1: It's easy to write a complete emulation of the
  function.  (`memmove' belongs to this case.)

  You add your emulation in misc/port.c surrounded by
  "#ifndef HAVE_MEMMOVE" and "#endif".

  You might have to add a prototype for your function.  If so,
  include/miscemu.h might be the place.  Don't forget to protect
  that definition by "#ifndef HAVE_MEMMOVE" and "#endif" also!

Case 2: A general emulation is hard, but Wine is only using
  a special case.

  An example is the various "wait" calls used in SIGNAL_child
  from loader/signal.c.  Here we have a multi-branch case on
  features:

    #ifdef HAVE_THIS
    ...
    #elif defined (HAVE_THAT)
    ...
    #elif defined (HAVE_SOMETHING_ELSE)
    ...
    #endif

  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.

Finish up with "make configure" and "./configure".


