User Tools

Site Tools


developersguide:crosscompiling

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
developersguide:crosscompiling [2015/06/19 17:48]
dcvmoole [Using build.sh directly] FreeBSD mtools hint
developersguide:crosscompiling [2021/04/12 06:43]
marceloalencar [Build compatibility] Update Debian 10
Line 1: Line 1:
 +====== Cross-compiling MINIX 3 ======
 +
 +<div round info>
 +**Note:**
 +
 +This is for cross-compiling MINIX from another Unix-like system. To build MINIX from within MINIX, [[.:​rebuildingsystem|check this page]] instead.
 +</​div>​
 +
 +Cross-compilation is the act of building MINIX from another operating system. Since MINIX now uses the build.sh framework from NetBSD, cross-compilation should work on most mainstream UNIX-compatible systems. A build compatibility table is available at the end of this document.
 +
 +===== Install dependencies =====
 +
 +Before attempting to cross-compile MINIX, you need a working C toolchain, Git and some additional software on your host platform.
 +
 +For Debian-based operating systems, run the following command as super-user:
 +
 +<​code>​
 +# apt-get install build-essential curl git zlibc zlib1g zlib1g-dev
 +</​code>​
 +
 +**Note**: Also on Ubuntu, if you get an error stating that "'/​lib/​cpp'​ fails sanity check",​ you need to install the GNU C++ compiler:
 +
 +<​code>​
 +$ sudo apt-get install g++
 +</​code>​
 +
 +**Note**: On FreeBSD and Minix ([[developersguide:​minixonarm#​building_minix_arm |compiling for ARM on x86, e.g.)]], if you get a message along the lines of "​Skipping image creation: missing tool '​mcopy'",​ please install the emulators/​mtools package.
 +
 +===== Getting the sources =====
 +
 +Once the required tools are installed, the next step is to obtain the sources. Run the following commands in a terminal:
 +
 +<​code>​
 +$ mkdir minix
 +$ cd minix
 +$ git clone git://​git.minix3.org/​minix src
 +$ cd src
 +</​code>​
 +
 +NOTE: The releasetools script will generate object files and put them //outside// the source directory; i.e., if you've cloned to ~/​minix/​src/​ and build from there, things will start showing up in ~/minix/ as an artifact of the build process.
 +
 +===== Cross-building for x86 =====
 +
 +It's time to build MINIX itself. There are some wrapper scripts that will build ready-to-boot images from scratch (i.e. just the minix source tree) for either x86 or ARM. These scripts produce a lot of output and will take a while to complete the first time - a cross-toolchain based on LLVM is built from scratch.
 +
 +<​code>​
 +$ bash ./​releasetools/​x86_hdimage.sh ​
 +[..]
 +Writing Minix filesystem images
 + - ROOT
 + - USR
 + - HOME
 +Part     ​First ​        ​Last ​        ​Base ​     Size       Kb
 +  0      0/​000/​00 ​    ​0/​000/​07 ​        ​0 ​        ​8 ​       4
 +  1      0/​000/​08 ​   64/​000/​07 ​        ​8 ​   131072 ​   65536
 +  2     ​64/​000/​08 ​ 1856/​000/​07 ​   131080 ​  ​3670016 ​ 1835008
 +  3   ​1856/​000/​08 ​ 1984/​000/​07 ​  ​3801096 ​   262144 ​  ​131072
 +To boot this image on kvm:
 +[..]
 +</​code>​
 +
 +A command line for running the result in a KVM virtual machine is printed at the end of the process.
 +
 +===== Cross-building for ARM =====
 +
 +A similar procedure exists for ARM. Please see [[.:​MinixOnARM]] for much more information.
 +
 +===== Using build.sh directly =====
 +
 +Please refer to NetBSD'​s documentation on build.sh for details.
 +
 +From a source directory:
 +
 +<​code>​
 +$ sh build.sh -mi386 -O ../build tools
 +</​code>​
 +
 +Please note that by default, the build.sh script will output the built objects to ''/​usr/​obj'',​ so make sure it exists. Alternatively,​ use as above the "​-O"​ option to redirect the output to somewhere else. When this process is completed, you'll have a ../​build/​tooldir.<​something>​ directory. The <​something>​ is roughly equivalent to
 +
 +<​code>​
 +$ echo ''​uname -s''​-''​uname -r''​-''​uname -m''​
 +</​code>​
 +
 +Among the tools that are built are ''​gcc'',​ ''​binutils'',​ and ''​gmake''​. The sources for these tools are not provided by us. Instead, they are downloaded on-the-fly as tarballs from the minix webserver
 +
 +===== Building world =====
 +
 +The next step is to actually build MINIX:
 +
 +<​code>​
 +$ sh build.sh -mi386 -O ../build -U distribution
 +</​code>​
 +
 +This process will create a ../​build/​destdir.i386 directory that holds the built distribution of MINIX. ​
 +
 +Other useful options for qemu are ''​-monitor telnet::​4444,​server,​nowait''​ (to access some interesting internal state by telnet) and ''​-serial stdio''​ - for convenient debug output over '​serial.'​
 +
 +===== Compiling things without build.sh =====
 +
 +To run make in the cross-environment,​ i.e. to rebuild a tool (host target) or minix item (minix target), without running the full build.sh procedure all over again, use nbmake-i386,​ a make wrapper that sets all the right environment. First expand your $PATH to include it:
 +
 +<​code>​
 +$ PATH=$PATH:​OBJDIR/​tooldir.OS-VERSION-ARCH/​bin/​
 +$ cd SRCDIR/​tools
 +$ nbmake-i386 clean
 +$ nbmake-i386
 +</​code>​
 +will rebuild all the tools. After that you can e.g.
 +
 +<​code>​
 +$ cd zic
 +$ nbmake-i386 clean
 +$ nbmake-i386
 +</​code>​
 +
 +to just rebuild zic. As you can tell if you set MAKEVERBOSE=2,​ tools/zic/ will invoke cc (to run on the host platform), whereas nbmake-i386 will invoke i486--netbsdelf-gcc from your tools dir if you run it in usr.sbin/​zic/,​ so a Minix-targeted binary is produced.
 +
 +===== Caveats =====
 +
 +The ''​build.sh''​ is tailored towards NetBSD and as such not all features make sense for MINIX. For example, we don't have a kernel configuration file. Also, you can't use ''​build.sh''​ for native builds on MINIX at the time of this writing. You can consult ''​build.sh'''​s documentation by invoking:
 +
 +<​code>​
 +$ sh build.sh
 +</​code>​
 +
 +But know that not all operations and options are supported. For example, we only support the ''​distribution''​ build operation. You can't generate iso images with the ''​build.sh''​ script.
 +
 +==== Build flags for build.sh ====
 +
 +It is possible to tweak the build using build flags. Here are some you might find useful.
 +
 +|Option name |value |example |Description |
 +|COPTS |c flags |COPTS=-g |**c** compiler **opt**ions |
 +
 +
 +
 +
 +==== Build flags for nbmake ====
 +
 +It is also possible to tweak when building separate components using nbmake-i386
 +
 +| Option name | value | example ​      | Description ​                     |
 +| MAKEVERBOSE | [1]   | MAKEVERBOSE=2 | Instruct make to be more verbose |
 +
 +
 +==== Mounting a MINIX disk image on Linux ====
 +
 +1. Load the loop kernel module, or adapt kernel command line:
 +
 +<​code>​
 +$ modprobe loop max_part=15
 +</​code>​
 +
 +or add to your kernel commandline : **max_part=15**
 +
 +2. Setup a loopback device to point to your disk image:
 +
 +<​code>​
 +$ losetup /dev/loop0 minix.img
 +</​code>​
 +
 +3. (Optional) list the available partitions:
 +
 +<​code>​
 +$ dmesg | tail
 +</​code>​
 +
 +or use
 +
 +<​code>​
 +$ ls /dev/loop0*
 +</​code>​
 +
 +4. Mount the desired partition somewhere
 +
 +<​code>​
 +$ mount /​dev/​loop0p5 /mnt
 +</​code>​
 +
 +===== Build compatibility =====
 +
 +^  Host platform ​                    ^ Version ​ ^  Buildable MINIX architectures ^ Version ^ Updated ​ |
 +| Ubuntu x86 32-bit ​                 | 14.04    | x86 32-bit / ARMv7             | 3.4.0rc | 2016-02 ​ |
 +| Ubuntu x86 64-bit ​                 | 14.04    | x86 32-bit / ARMv7             | 3.4.0rc | 2016-02 ​ |
 +| Arch Linux x86 32-bit ​             |          | x86 32-bit ​                    | 3.2.1   | 2013-08 ​ |
 +| Arch Linux x86 64-bit ​             |          | x86 32-bit / ARMv7             | 3.2.1   | 2013-08 ​ |
 +| Mac OS X Lion x86 64-bit ​          ​| ​         | x86 32-bit / ARMv7             | 3.2.1   | 2013-08 ​ |
 +| Mac OS X Maverick x86 64-bit ​      ​| ​         | x86 32-bit / ARMv7             | 3.3.0   | 2014-10 ​ |
 +| FreeBSD x86 32-bit ​                | 10-CURR. | x86 32-bit / ARMv7             | 3.2.1   | 2013-08 ​ |
 +| FreeBSD x86 64-bit ​                | 10-CURR. | x86 32-bit / ARMv7             | 3.2.1   | 2013-08 ​ |
 +| Windows Subsystem for Linux 64-bit | 10.14393 | x86 32-bit / ARMv7             | 3.4.0rc | 2016-08 ​ |
 +| Debian x86 32-bit ​                 | 8.8.0    | x86 32-bit ​                    | 3.3.0   | 2017-05 ​ |
 +| Debian x86 64-bit ((Apply [[https://​github.com/​Stichting-MINIX-Research-Foundation/​minix/​pull/​301|this]] patch)) ​                | 10.9.0 ​  | x86 32-bit / ARMv7             | 3.4.0rc | 2021-03 ​ |
  
developersguide/crosscompiling.txt · Last modified: 2021/04/12 06:43 by marceloalencar