1
0
Fork 0
mirror of https://gitlab.com/sortix/sortix.git synced 2023-02-13 20:55:38 -05:00
sortix--sortix/doc/cross-development
Jonas 'Sortie' Termansen 425069cbf1 Add documentation.
2013-12-19 17:42:07 +01:00

198 lines
7.4 KiB
Text

Sortix Cross Development Guide
==============================
The primary way to build Sortix is on Sortix itself. However, the system may not
be fully up to the task yet and your favorite development environment may not
have been ported. You can cross-compile Sortix from a reasonable similar system
such as GNU+Linux. The build process will liberally use common GNU tool options,
so you may wish to install the basic GNU distribution or compatible.
Overview
--------
To build Sortix you need these components:
* Sortix source tree
* Sortix binutils
* Sortix gcc
* GRUB2 (iso support)
* xorriso (iso support)
In this tutorial we will cross-compile a Sortix using by following these steps:
1. Retrieve all the source code.
2. Build additional Sortix-specific tool programs.
3. Create a system root containing all the Sortix system headers.
4. Compile a new compiler that targets Sortix and uses the system root.
5. Actually compile Sortix.
It is necessary to compile binutils and gcc because your system compilers
doesn't produce executables for Sortix, but rather for your current system.
Source Code
-----------
You can find the latest Sortix source code at:
https://gitorious.org/sortix/sortix/
You can find the latest Sortix binutils source code at:
https://cs.au.dk/~sortie/sortix/toolchain/sortix-binutils-latest.tar.xz
You can find the latest Sortix gcc source code at:
https://cs.au.dk/~sortie/sortix/toolchain/sortix-gcc-latest.tar.xz
It is only possible to build Sortix with this blessed toolchain or a derivative
thereof as it has been customized to understand Sortix and provide a number of
useful extensions. You may need to occasionally upgrade the toolchain, in the
event that it is further modified and Sortix takes advantage of these changes.
Target Platform
---------------
You need to decide what the platform your final Sortix system will run on. You
can currently decide between i486-sortix and x86_64-sortix. In this guide we
will refer to that platform triplet as $SORTIX_PLATFORM. If you want to build
another platform afterwards, then you will have to follow this guide again.
Cross-Environment
-----------------
You should install your cross-toolchain into a useful and isolated directory
such as $HOME/opt/$SORTIX_PLATFORM. This allows you to easily dispose of the
directory and keeps it neatly isolated from the rest of the system. Let's refer
to that location as $CROSS_PREFIX.
You need to add $CROSS_PREFIX/bin to your $PATH variable:
export PATH="$CROSS_PREFIX/bin:$PATH"
This will modify the $PATH variable in this particular shell session. Depending
on your shell and system configuration you can make this permanent by adding
that line to your ~/.profile. Consult your shell documentation. Otherwise type
it in all Sortix-related shells before doing anything.
Sortix build tools
------------------
You need to install some additional Sortix programs into your local environment
as they are needed to build Sortix. Assuming you cloned the Sortix source code
tree into the ~/sortix directory, you can install them by typing the following
commands:
cd ~/sortix &&
make PREFIX="$CROSS_PREFIX" build-tools &&
make PREFIX="$CROSS_PREFIX" install-build-tools
These tools produce platform independent output so you may wish to install them
into $HOME/bin or /usr/local/bin or where it suits you in your $PATH.
Setting up basic system root
----------------------------
The compiler has been taught how to correctly build programs for a Sortix
system, however it gets part of this information from the system headers. The
first step is to create a basic system root that contains the headers and
filesystem structure for the final system. We will install the kernel, libc,
libm, and other core library headers into this directory. Run the following:
cd ~/sortix &&
make sysroot-base-headers HOST=$SORTIX_PLATFORM
This will automatically set up a basic system root in ~/sortix/sysroot. We will
use this when we build the cross-compiler in a moment. Let's call the system
root directory $SYSROOT.
Cross-Toolchain Dependencies
----------------------------
You may need to install these packages (and their development packages) before
building binutils and gcc, or the packages will refuse to configure or some
obscure error will occur. In particular, you may need to install:
* Bison
* Flex
* GNU GMP
* GNU MPFR
* GNU MPC
You should consult the official binutils and gcc documentation on what exactly
you need to install before building these packages yourself.
Cross-Binutils
--------------
We need a cross-binutils that have been taught the Sortix program format. If you
have extracted the Sortix binutils source code into ~/src/sortix-binutils then
you can build binutils out-of-directory using these commands:
mkdir ~/src/binutils-build &&
cd ~/src/binutils-build &&
../sortix-binutils/configure \
--target=$SORTIX_PLATFORM \
--with-sysroot="$SYSROOT" \
--prefix="$CROSS_PREFIX" \
--program-prefix=$SORTIX_PLATFORM- &&
make &&
make install
You may need to install some dependencies before you build binutils. You can
remove the temporary ~/src/binutils-build directory when you are done.
Cross-GCC
---------
We need a cross-compiler that has been taught what Sortix is and that supports a
few extensions that have been added to Sortix gcc that isn't present in upstream
gcc. If you have extracted the Sortix gcc source code into ~/src/sortix-gcc then
you can build gcc out-of-directory using these commands.
mkdir ~/src/gcc-build &&
cd ~/src/gcc-build &&
../sortix-gcc/configure \
--target=$SORTIX_PLATFORM \
--with-sysroot=$SYSROOT \
--prefix="$CROSS_PREFIX" \
--enable-languages=c,c++ \
--program-prefix=$SORTIX_PLATFORM- &&
make all-gcc all-target-libgcc &&
make install-gcc install-target-libgcc
You may need to install some dependencies before you build gcc, such as libmpc,
libmpfr and libgmp. You can remove the temporary ~/src/gcc-build directory when
you are done. Notice how we don't build all of gcc as this isn't possible yet.
For instance, the C++ library requires the Sortix libc to have been built.
Building Sortix
---------------
You now have the needed components to build a working Sortix system. If you have
completed the above steps correctly, then you can simply do:
cd ~/sortix &&
make HOST=$SORTIX_PLATFORM
This will compile a basic Sortix system into ~/sortix/sysroot with a kernel,
headers, libraries, programs, everything you need. This isn't a bootable system
yet. If you have xorriso and grub-mkrescue from GRUB 2 installed, then you can
can build a bootable .iso by typing:
cd ~/sortix &&
make HOST=$SORTIX_PLATFORM sortix.iso
This will produce a ~/sortix/sortix.iso file that is bootable on real hardware
and virtual machines. Alternatively, you can take the sortix.bin file and boot
that with GRUB as a multiboot kernel and sortix.initrd (snapshot of the sysroot)
as a multiboot module/initrd.
You can clean the source directory fully:
cd ~/sortix &&
make distclean
This will clean all the source directories and ports and delete all the builds
and the binary package repositories (if you use ports as below) and it will
delete the system root containing your installed system. Alternatively, you may
be interested in the target `mostlyclean `that doesn't delete binary packages
for ports, as they may take considerable time to recompile. See also the targets
`clean`, `clean-core`, `clean-sysroot`, `clean-repository`, `clean-builds`,
and `clean-ports` which lets you control what is cleaned.