This document will help prepare you to build the source code for illumos. It assumes some familiarity with development on Unix-like systems.
You need an illumos-based operating system to build illumos (cross-compilation is not supported). If you don't have one installed, the quickest way to get started is to download and install OpenIndiana from openindiana.org/download. If you have an existing system with OpenSolaris installed, see Updating OpenSolaris.
Note: All commands in this guide assume you run them as an unprivileged user. sudo will be prepended to commands which need additional privileges; on some systems pfexec can be used instead, if your user has the correct RBAC profiles. The generic commands below use a $USER variable to define the current (unprivileged) user account's name which will ultimately be used to compile the project. If you are not using a stock shell or have manipulated the $USER variable in your environment at a site, system, or user level, you are responsible for diagnosing and addressing any consequences.
Note: VirtualBox has proven unfit for purpose in building from source (builds take days instead of hours) and running debug kernels (systems have problems with clock discipline and are slow or become unresponsive). If you're interested in developing for illumos, consider running on bare metal or using an alternative virtualization product (KVM, VMware, Xen).
You need to install these packages in order to build illumos:
sudo pkg install -v \ pkg:/data/docbook \ pkg:/developer/astdev \ pkg:/developer/build/make \ pkg:/developer/build/onbld \ pkg:/developer/illumos-gcc \ pkg:/developer/gnu-binutils \ pkg:/developer/opensolaris/osnet \ pkg:/developer/java/jdk \ pkg:/developer/lexer/flex \ pkg:/developer/object-file \ pkg:/developer/parser/bison \ pkg:/developer/versioning/mercurial \ pkg:/library/glib2 \ pkg:/library/libxml2 \ pkg:/library/libxslt \ pkg:/library/nspr/header-nspr \ pkg:/library/perl-5/xml-parser \ pkg:/library/security/trousers \ pkg:/print/cups \ pkg:/print/filter/ghostscript \ pkg:/runtime/perl-510 \ pkg:/runtime/perl-510/extra \ pkg:/runtime/perl-510/module/sun-solaris \ pkg:/system/library/math/header-math \ pkg:/system/library/install \ pkg:/system/library/dbus \ pkg:/system/library/libdbus \ pkg:/system/library/libdbus-glib \ pkg:/system/library/mozilla-nss/header-nss \ pkg:/system/header \ pkg:/system/management/product-registry \ pkg:/system/management/snmp/net-snmp \ pkg:/text/gnu-gettext \ pkg:/library/python-2/python-extra-24 \ pkg:/web/server/apache-13 |
The source code was traditionally built using Sun's closed-source compiler suite, which was named Sun Studio at the time of the illumos fork. The specific versions of Studio required are no longer publicly available, it is possible to build illumos with GCC; this is the only option for "new" people in the project who do not have access to the distribution archives of required Sun Studio versions. You will still need some tools from Sun Studio even if you use GCC as your compilers, but those are available as packages in the legacy OpenSolaris repository.
It is possible to build illumos using GCC (the GNU Compiler Collection, specifically its C and C++ compilers), and you should generally prefer to do this, though it is convenient to still see build results from Studio in RTIs
The primary version of GCC necessary for development and integration 4.4.4 (4.4.4-il-2) should have been installed on your system when you installed the prerequisites above. If for some reason that didn't happen (old build system, or the like) tarballs are available as described in the initial heads-up notice 2012-06-15 Illumos will now build with GCC 4.4.4 + patches.
Unfortunately, Sun Studio dmake (Distributed Make) and lint are currently required even for GCC-only builds. We currently deliver Lint libraries built using the closed Sun Studio version of lint. The lint from the unpatched (but redistributable) version of Sun Studio 12.1 in the opensolaris.org repository can be used, regardless of its utility for actually checking the software.
Run:
sudo pkg set-publisher -g http://pkg.openindiana.org/legacy opensolaris.org sudo pkg install pkg:/developer/sunstudio12u1 sudo mkdir -p /opt/SUNWspro sudo ln -s /opt/sunstudio12.1 /opt/SUNWspro/sunstudio12.1 |
You'll want the symlink so that lint can be found during the build process.
If you wish to build with Sun Studio, you need specifically patched versions of both Studio 12 (used to compile) and 12.1 (used for lint) to get consistent results. If you do not have access to these versions, skip this section and use GCC.
illumos-gate does not build correctly with Sun Studio versions released after 12.0. Reportedly using a newer version of the compiler will produce a system containing grave, data-corrupting bugs. Patched compilers were previously available from Sun Microsystems, however not licensed for redistribution. After a recent Oracle site reorganization, the necessary compilers are no longer available.
If you have the patched versions of both Sun Studio 12 and 12.1, they should be installed in /opt/SUNWspro (Studio 12), and /opt/SUNWspro/sunstudio12.1 (Studio 12.1), respectively. Pay attention, the Studio 12.1 location is different from how it was in OpenSolaris, i.e. it's not /opt/sunstudio12.1.
The meta-procedure for cleaning up optionally prepackaged Sun Studio installations and installing the ones you require for building illumos (assuming your stashed Sun Studio 12 distribution archives are now pre-copied to /tmp) is as follows:
sudo pkg uninstall \
pkg:/developer/sunstudio12u1 \
pkg:/developer/sunstudioexpress \
pkg:/sunstudioexpress \
pkg:/ss-dev
sudo mkdir -p /opt/SUNWspro
cd /opt/SUNWspro
sudo tar xjf /tmp/sunstudio12-patched-ii-2009Sep-sol-x86.tar.bz2
sudo tar xzf /tmp/sunstudio12u1-patched-ii-2010Feb-sol-x86.tar.gz |
The first archive contains the product component sub-directories directly at the top-level, and the second has similar sub-directories under the top-level sunstudio12.1 as its children. Thus you receive the structure outlined above.
You can check if you have the correct versions installed as follows. All of the following tests must succeed and return these specific product/patch versions:
$ /opt/SUNWspro/bin/cc -V cc: Sun C 5.9 SunOS_i386 Patch 124868-10 2009/04/30 usage: cc ... $ /opt/SUNWspro/sunstudio12.1/bin/cc -V cc: Sun C 5.10 SunOS_i386 Patch 142363-03 2009/12/03 usage: cc ... $ /opt/SUNWspro/sunstudio12.1/bin/lint -V lint: Sun C 5.10 SunOS_i386 Patch 142363-03 2009/12/03 usage: lint ... |
You can use any location, but for the purposes of this guide, we will assume that you have a directory /code owned by your user ID, which you are using to obtain source and build.
For a less naive example, see the Build datasets page and some more industrious details on Managing multiple workspaces and Working on several bugs at once.
You may use the Git or Mercurial source code management systems to retrieve the illumos source code. Both tools will be able to retrieve the same history. Ensure about 6 gigabytes of free space for the source and binaries combined.
illumos.org hosts a Mercurial repository containing the illumos source code.
The Mercurial illumos-gate URI is:
ssh://anonhg@hg.illumos.org/illumos-gatehttp://hg.illumos.org/illumos-gate does not work. Use ssh.Additional Mercurial mirrors:
Mercurial pulls a complete replica (clone) of the repository, including all history, from a remote source, and then updates a working copy of the files from this clone. The working copy is the files you may edit and compile. You may update the working copy from any versions of files in the repository history.
When cloning an external source code repository, Mercurial starts by creating a new directory, and fails if one already exists and is not empty. The directory may be a mountpoint for an empty ZFS dataset. Mercurial creates a |
The following example creates a clone of the "Mercurial repository" ssh://anonhg@hg.illumos.org/illumos-gate containing the illumos source code under /code; this will create a sub-directory illumos-gate under that.
cd /code hg clone ssh://anonhg@hg.illumos.org/illumos-gate |
If you want to get latest version of illumos-gate merged with your private development code, you need to hg pull new changes into your clone and hg update the working copy. This can be done in one command as hg pull -u. If you have committed changes prior to updating, you may be wish to hg merge them with the new changes.
For more details see: http://mercurial.selenic.com/wiki/FAQ.
There is also a simple script to update the repository.
The repository is also available from Github using the Git source code control system.
Install Git using this command:
sudo pkg install git |
The Git repository URI is:git://github.com/illumos/illumos-gate.git
Or, if the Git protocol is firewalled at your site:https://github.com/illumos/illumos-gate.git
The illumos-gate source can then be cloned using:
cd /code git clone git://github.com/illumos/illumos-gate.git |
There are still closed components in illumos that have not yet been replaced. You must get the latest closed binaries from Sun/Oracle, since illumos currently needs those in order to build:
cd /code/illumos-gate wget -c \ http://dlc.sun.com/osol/on/downloads/20100817/on-closed-bins.i386.tar.bz2 \ http://dlc.sun.com/osol/on/downloads/20100817/on-closed-bins-nd.i386.tar.bz2 tar xjvpf on-closed-bins.i386.tar.bz2 tar xjvpf on-closed-bins-nd.i386.tar.bz2 |
Note that if you had a crypto tarball from an earlier build, do not use it here, as it is no longer required to build illumos. You should remove it from your tree if already present.
The build is configured using a shell script with environment variables, a template for this file is included:
cp usr/src/tools/env/illumos.sh . vi illumos.sh # or your favourite editor instead of @vi@ |
The settings we are going to focus on for now are the following:
NIGHTLY_OPTIONS - You may remove the "l" (lowercase L) option from the string, this will disable lint checking of the code to save some time during the build, but patches should be linted.CODEMGR_WS - This should be the root of the directory with the code. If you followed the previous example, it will be /code/illumos-gate.STAFFER - Change this to the name of the non-privileged user you use on the systemVERSION - Set this to illumos-gate or whatever version string you want for the buildImportant: ONNV_BUILDNUM specifies the build number which is used in packaging. If you intend to upgrade a system whose build number is greater than the one in illumos-gate (currently 148), such as OpenIndiana, you need to specify this to allow upgrades until issue #1118 is addressed. Run:
pkg info osnet-incorporation | grep Branch: |
If you see, for example, "Branch: 0.151.1", you must choose a number greater than the part after the leading "0.". For example, add
export ONNV_BUILDNUM=152 |
to the illumos.sh script.
If you are building with GCC 4.4.4 (i.e. you do NOT have Sun Studio with appropriate patches), you must append these lines to illumos.sh:
# The following are added to build with GCC (no Sun Studio)
export __GNUC=""
export CW_NO_SHADOW=1
export ONLY_LINT_DEFS=-I${SPRO_ROOT}/sunstudio12.1/prod/include/lint
# The following select the proper version of GCC
GCC_ROOT=/opt/gcc/4.4.4; export GCC_ROOT
CW_GCC_DIR=${GCC_ROOT}/bin; export CW_GCC_DIR |
Explanation of these settings:
__GNUC - Set this to "" (the empty string), and export it. This causes GCC to be used as the main compiler. Studio takes its place as the "shadow compiler".CW_NO_SHADOW - Set this to 1 to prevent the shadow compiler from running (for instance, if you do not have Studio at all).lint is able to find the proper note.h include file.The last two lines make sure the patched version of GCC-4.4.4 is used (the default gcc version shipped with e.g. OpenIndiana, gcc-3.4.3, is not suitable for building illumos), as described here.
For the moment we still require that contributed changes build with Sun Studio as the compiler. We understand that the required version of Sun Studio is no longer publicly available and will accept contributions that were tested only with GCC.
If you are trying to build with GCC 4.4.4 and your build fails because of some invalid GCC warning options, try setting the variables GCC_ROOT and CW_GCC_DIR as shown above and described here.
You are now ready to start the illumos build.
Since this process may take up to several hours depending on your system (reference build times are in a chart below), it may be wise to start the build job in a VNC session, GNU Screen (screen), or tmux. The screen program can be installed with the pkg:/terminal/screen package.
Run the following command to start the build:
cd /code/illumos-gate cp usr/src/tools/scripts/nightly.sh . chmod +x nightly.sh time ./nightly.sh illumos.sh |
Note that the command does not give any progress output. You can instead follow the log file at log/nightly.log, which is updated (slowly) during the build process. In another terminal, run:
tail -f /code/illumos-gate/log/nightly.log |
After the build is complete, the nightly.log file and some other generated logs are moved into a uniquely named subdirectory log/log.$TIMESTAMP/ (i.e. /code/illumos-gate/log/log.2012-04-20.04\:17/ ).
A dry overview of the build progress (hopefully small – about 2KB in size – with no errors) is saved in log/log.$TIMESTAMP/mail_msg file intended for mailing to the build administrator after the build completes (this automation is out of the scope of the nightly.sh script). If you do receive any errors in the mail_msg report file, you can grep the error lines in the larger nightly.log file.
If you've made changes after completing a nightly build, you can perform an incremental build without discarding the already built files.
cd /code/illumos-gate ./nightly.sh -i illumos.sh |
To make this the default, edit illumos.sh and add the character i to NIGHTLY_OPTIONS.
Before submitting a patch, we request that you perform a full, non-incremental build.
onu scriptThe build process will generate updated packages. Depending on the NIGHTLY_OPTIONS variable in illumos.sh script, the packages will be written either to $PWD/packages/i386/nightly (with debug, the typical default) or to $PWD/packages/i386/nightly-nd (without debug). Therefore there are two possible commands to install the software you you just built. You need choose the proper onu command, typically the first one listed below.
Typical install: you can install with onu for debug builds (the default, with 'F' and 'D' characters in NIGHTLY_OPTIONS variable in illumos.sh):
$ sudo ./usr/src/tools/scripts/onu \
-t nightly-`date +%Y-%m-%d` -d $PWD/packages/i386/nightly |
The non-typical installs are detailed in the following pages:
onu options for the different set of built packages.onu script automation and manipulates your boot environments with beadm and pkg commands directly.illumos has entirely different localization infrastructure from Solaris, so your existing system locales will not work.
The English locales for illumos are in pkg:/locale/en (NOT pkg:/system/locale/en), and if you wish to use them, you'll need to install that package after you reboot. Likewise, other locales are in pkg:/locale/<language code> where <language code> is a two letter ISO 639-1 code, except for zh_cn/zh_hk/zh_mo/zh_sg/zh_tw.
If your locale is not installed, it will cause problems with software which behaves badly if setlocale() fails. This includes, at least, time-slider and svcs(1M). The pkg(5) commands print a warning, but function normally.
If this is a problem, you can "export LANG=C LC_ALL=C" as a workaround, and change the LANG setting in/etc/default/init to 'C' (and reboot) to make the change permanent.
/code/illumos-gate/packages/i386/nightly/repo.redist) is not created and onu script failsThis error has happened to me whenever I ran the default checkout and full-build procedure outlined above (in VirtualBox VMs); I don't yet know why (possibly due to a wrong setup of my SunStudio compiler stack, as was later discovered).
However, rerunning with an incremental build has created the package repository correctly (as well as full builds with proper SunStudio setup):
./nightly.sh -i illumos.sh |
In any case, if you have build errors or other "inconsistencies", it would be wise to revise the mail_msg logfile that can contain short error descriptions, and grep for those errors in the longer nightly.log file. If that doesn't help, you should also recreate the build in a "clean lab" environment, which may be set up as a local zone according to the Building in zones instructions and rule out the local environment's influence (conflicting libraries and binaries, perhaps from your own earlier builds, come to mind first).