A brief tale of pkgsrc and illumos

Recently we got our hands on some nice DDR3 era hardware, which we’ll use eventually for NAS purposes. It’s got 96 gigs of ECC RAM, two Xeons, the works. For fun we’ve decided to run OpenIndiana on it, an illumos distribution. OpenIndiana has a package manager called the Image Package System (IPS), and the default repositories have basically everything we’d need, but for another layer of excitement we put pkgsrc on here too. pkgsrc is a repository of package build scripts, most of which work on NetBSD, Solaris, illumos, Linux, macOS, and more! Joyent actually provides a binary distribution of pkgsrc for illumos, but on our everlasting journey for increasingly esoteric layers of fun we’re building pkgsrc from source. Don’t worry, it was easier than you think.

Ok so let’s get something out of the way first, if you’re familiar with pkgsrc and just want to know what dependencies to install, here’s the spoilers. Install this stuff:

$ pkg install gcc-11 gnu-binutils c-runtime system/header

Then do your usual pkgsrc bootstrap. For everyone else, here’s the brief tale of how we got to that point.

How we got there

First off we need an actual OpenIndiana installation to work from. We’ll spare you the details since the installer explains itself fairly well, but if you have a lot of RAM you might want to modify the default partition layout. We ended up with a 96GB swap partition which is uhh, excessive, you might say, particularly on a 200GB SSD.

Once we reboot into the system, a system update is in order.

$ pkg update

This updated something upwards of 400 packages for us and took awhile. A coffee break later and we can move on to grabbing a copy of pkgsrc itself.

$ curl https://cdn.netbsd.org/pub/pkgsrc/stable/pkgsrc.tar.xz | xz -d | sudo tar xvof - -C /usr

This downloads a copy of the latest stable snapshot of pkgsrc and extracts it into /usr. Everything in the tar file is in pkgsrc/whatever so we end up with /usr/pkgsrc as our source tree. If you’re wondering why we use xz -d as its own step instead of passing J to tar: for some reason tar on our system gives us this weird error tar: directory checksum error when we try that, so we’re not sure what it’s doing but we don’t think it’s doing it right.

We’ll probably also need a compiler toolchain so let’s install gcc and binutils to get things going.

$ pkg install gcc-11 gnu-binutils

Cool, so do we have everything we need? Let’s find out:

$ cd /usr/pkgsrc/bootstrap
$ ./bootstrap --prefix=/usr/pkg --prefer-pkgsrc yes --make-jobs 16

[... blah blah blah a bunch of build output ...]

ld: fatal: file crt1.o: open failed: No such file or directory

Hmm, that’s no good. We actually have no idea what crt1.o is used for, but whatever the case, we definitely need it. This is a decent opportunity to learn the ropes of IPS’s package searching features. pkg search has a lot of advanced querying functionality, and the man page has some examples of it. Here it demonstrates searching the locally installed packages (-l) for a file named vim (file:basename:vim).

$ pkg search -o path,pkg.name -l file:basename:vim
usr/bin/vim  editor/vim/vim-core

This demonstrates the file:basename: query, and we can use that to search the remote repository for a file named crt1.o

$ pkg search file:basename:crt1.o
INDEX      ACTION VALUE                PACKAGE
basename   file   usr/lib/amd64/crt1.o pkg:/system/library/c-runtime@0.5.11-2022.0.0.21001
basename   file   usr/lib/crt1.o       pkg:/system/library/c-runtime@0.5.11-2022.0.0.21001
basename   file   usr/lib/amd64/crt1.o pkg:/system/library/c-runtime@0.5.11-2022.0.0.21001
basename   file   usr/lib/crt1.o       pkg:/system/library/c-runtime@0.5.11-2022.0.0.21001

pkg install c-runtime

Ok let’s give bootstrap another shot to see if that was all we needed.

conftest.c:9:10: fatal error: stdio.h: No such file or directory
    9 | #include <stdio.h>
      |          ^~~~~~~~~

Alright fair enough, so we didn’t have our libc headers. Let’s search for stdio.h this time.

$ pkg search file:basename:stdio.h
INDEX      ACTION VALUE                PACKAGE
basename   file   usr/include/stdio.h  pkg:/system/header@0.5.11-2022.0.0.21001

$ pkg install system/header
$ ./bootstrap --prefix=/usr/pkg --prefer-pkgsrc yes --make-jobs 16 

And what do you know it works! That’s all we need to successfully bootstrap pkgsrc and start building things. After that we succesfully built rust from source, which pulled in a build of cmake, llvm and a few other fan favorites along the way, so it’s safe to say this is a fully functional pkgsrc bootstrap. Thanks for coming along on the journey.

Until next time!