HowTo Build OSKit-Mach

  <h3><a name="Introduction"> Introduction </a></h3> This is a brief "<nop>HowTO build OSKit-Mach" (a.k.a GNUmach 2.0). It covers everything from getting the latest sources of both the <a href="" target="_top">OSKit</a> and the GNUmach kernel, down to building and debugging them. <p> To be able to actually make use of your recently checked out CVS version of the GNUMach kernel &amp;amp; c:o you need a GNU system of <a href="" target="_top">gnu-20020816.tar.gz</a> or later. See <span class="createlink"><a href="/cgi-bin/hurd-web?page=Distrib%2FTarballNotesHome&amp;from=unsorted%2FBuildingOskitMach&amp;do=create" rel="nofollow">?</a>TarballNotesHome</span> for more info. </p></nop></td>

Getting your hands on the source

First you need to checkout the relevant sources. It comes in various flavours and the recommended way is to checkout from CVS.

The OSKit Sources

Note: The Savannah OSKit project is the recommended source today of the OSKit. Its CVS tree holds the official sources and all known patches, plus a few others.

Official Sources:

Official Patches:

  • Download useful OskitPatches or on the nearest Debian FTP.

Savannah CVS:

The recommended document for accessing the Savannah OSKit CVS is

The following command should get the sources for you:

$ export CVS_RSH="ssh"
$ cvs -z3 co oskit

Note: if you get a message about RSA/DSA keys, please go check it here:

GNUmach & Mig Sources

The recommended document for accessing the Hurd CVS on Savannah is at

Remember to set up you environment to use 'ssh' for cvs:

$ export CVS_RSH="ssh"

Note: if you get a message about RSA/DSA keys when using cvs commands, please go check it here:

Gnu Mach:

All development, apart from critical bug fixes, is done on the upcoming 2.0 release (OSKit/Mach). A potentially confusing point is that the code for OSKit/Mach (as opposed to the 1.X release, aka "GNU Mach") is now on the TRUNK of the 'gnumach' CVS module. In the past the trunk was 1.X (GNU Mach) and 2.0 (OSKit/Mach) was a branch.

$ cvs -z3 co gnumach

In case you have been tracking the oskit-branch and want to move to the current HEAD branch you can issue the following instead to update your tree.

$ cvs -z3 update -Pd -A

Where <YOUR MACH DIR> can be gnumach, oskit-mach, or similar. The -A is what moves you from a branch to the default (in this case HEAD), but without forcing a specific tag. -P Prunes your local copy from stale directories and -d creates new directories for you.

The Hurd servers:

In case you want to build the Hurd servers as well, you can check them out with:

$ cvs -z3 co hurd

Inteface generator:

See the MIG for more information.

Check it out using

$ cvs -z3 co mig


The recommended versions of GCC are

For the OSKit
GCC 2.95.X
For GNUmach and MiG
GCC 3.2

The OSKit

Do not forget to apply all known OskitPatches before starting the build! This does not apply if you use the OSKit from Savannah.

The attached ?ATTACHURLmodulesx86pc, or ?ATTACHURLmodules-lightx86pc, is an example setup, your needs may vary but this one works for standard COTS PC's. Now, how to configure and build the OSKit.

$ cd oskit-20020317/
$ mkdir build
$ cd build
$ CC=gcc-2.95                            \
  CFLAGS="-g"                            \
  ../configure --prefix=/usr/local       \
               --enable-debug            \
$ make
$ sudo make install

Comment: Barry deFreese

For you newbies like me, I had problems using modules.x86.pc.full and modules.x86.pc. There seems to be problems with examples/dyntest. Make sure you pull down and use the ?ATTACHURLmodules-lightx86pc.

Comment: Luis Miguel

I needed to apply another patch that is not in CVS yet. The patch is in this message in the bug-hurd mailing list.

Mach Interface Generator

To build any Mach kernel you need an interface generator, MiG. To be on the safe side, use the CVS version. If you use Debian, you can install package mig-i386-gnu. If you don't use Debian or want to compile MiG by yourself on Linux/*BSD system, you must first install Mach headers. In Mach directory do:

$ mkdir build
$ cd build
$ ../configure --prefix=/usr/local      # Default prefix is / !
$ sudo make -k install-headers          # -k is for ignoring errors

Now you are ready to compile and install MiG (commands are in Mig's source directory):

$ automake --add-missing                # sometimes it's needed
$ mkdir build
$ cd build
$ ../configure
$ make
$ sudo make install

GNUmach 2.0 (OSKit-Mach)

Unlike its half sister, the OSKit-Mach kernel does not need a cross compiler. The regular gcc for your x86 Linux system does just fine. However, you might want to use gcc 3.2 with the latest and greatest CVS version of Mach.


$ cd gnumach
$ mkdir build
$ cd build
$ MIG=/usr/local/bin/mig                   \
  CC=gcc-3.2                               \
  CFLAGS="-g -O2"                          \
  OSKIT_LIBDIR=/usr/local/lib/oskit        \
  ../configure --prefix=/gnu

Comment: Barry deFreese

I updated CFLAGS to CFLAGS="-g -O2". Using just -O I was getting errors in the machine_init function. For newbies like me, the -g is only needed if you want to enable debugging. The -O2 is Oh 2, not Zero 2.


Instead of using make kernel to build kernel, in OSKit-Mach you have to use make kernel-DRIVERS, where DRIVERS is DRIVER+DRIVER+...+DRIVER (a list of drivers separated by +). DRIVER can be one of:

  • ide
  • floppy
  • ethernet_ETHDRV where ETHDRV is taken from oskit/oskit/dev/linux_ethernet.h.
  • scsi_SCSIDRV where SCSIDRV is taken from oskit/oskit/dev/linux_scsi.h.

Thus, to build a IDE capable kernel with 3Com Vortex Boomerang support you use the following:

$ make kernel-ide+ethernet_vortex
$ sudo make install
$ sudo gzip -f /gnu/boot/oskit-mach

If the make command complains about missing dependencies, then you haven't passed correct OSKIT_LIBDIR variable to the configure script. Or you can use the patch below and pass something like --with-oskit=/usr/local to configure.

Comment: Barry deFreese

If you receive an error like No rule to make target Kernel-ide..., there is a patch for an issue with finding the oskit libraries. Then run configure on gnumach again with the option --with-oskit=/path/to/oskit/libraries.

The patch can be found here: gnumach-oskit-path.patch Thanks wagi!!

Don't use both --with-oskit and OSKIT_LIBDIR. Choose one of these methods.

If you want to use tftp to download the kernel from Grub and don't care about the symbols I recommend either stripping or removing the --enable-debug and -g statements.


See the ?RemoteDebugOskitMach page.


  • ?ATTACHURLmodulesx86pc: Configures modules to build in OSKit.

    Compared to 21May04 CVS, this adds SMP but omits the random module which was added to CVS in Jan03.

  • ?ATTACHURLmodules-lightx86pc: Lighter version of required modules. Used for building GNUmach with OSKit, i.e. OSKit/Mach.

    Compared to the above config, this omits the Linux, MSDOS,

    NetBoot, and PXE loader support, bootp support, OSKit on UNIX support, some thread-safe library versions, the address map manager, fsread, fsnamespace/{fsn,fsn_r}, fudp, memdebug, memfs, smp, POSIX threads, svm, uvm, the Simple Process Library, realtime support, FreeBSD devices and code, linux/fs, the UDP library, the sets of x86 and UNIX example kernels, the testsuite, and the security server. The new random module is also not configured.