Nixos Build Issues
So I am doing a rebuild of my NixOS laptop in order to (supposedly) highly optimize the resulting binary code for my local host. Or, at least, all of the libraries written in C. So doing this was pretty straightforward. Before we can build the optimized code, we need to tell Nix that our system supports this as a feature. So the first thing I enabled in my configuration is:
nix.settings.system-features = [ "gccarch-x86-64-v3" ];
A quick nixos-rebuild switch
has me up and going in a few moments, as all it needs to do is
write a new nix.conf
file.
Enabling the Optimized Build
Now, enabling the optimized build in your system is pretty straightforward. All you need to do
is configure the nixpkgs.hostPlatform
. The key setting to enable in my flake looks like such:
nixpkgs.hostPlatform = {
system = "x86_64-linux";
gcc.arch = "x86-64-v3";
};
Ostensibly you can do this as well if you are doing an import nixpkgs { ... }
function somewhere,
but setting the above in my Flake config file was all I needed.
Go Grab a Drink
…and a nap, and the rest of the afternoon, and probably an overnight sleep. Because this, for me, on a daily driver laptop with Gnome took building more than 3300 packages. All the way up from a bootstrap of the systems. My laptop, admittedly, isn’t the most powerful system around. It’s an 11th gen Intel i7 mobile processor from Framework. The benchmarks for it are kinda weak. The i7-1165G7 from those first generation Framework boards are great for day to day work, and it doesn’t limit me from anything that I need to do (I’m a software engineer, but most of what I do on my personal system is writing little scripts and personal data tracking projects here and there and doing some VM development). The low power consumption is great.
My point is, your mileage may vary. My home servers are much more potent systems and can probably get their builds done much more quickly if this proves out to be useful.
A Build Failure?!
Rather than waltz straight into a nixos-rebuild switch
with wild abandon, I strongly recommend that
you trial the build process with a nix build
or similar. At the very least you will want to do something
along the lines of --keep-going
flag so that the builds continue. I know that NixOS builds are intended
to be reproducible. But that doesn’t mean every single package in the build tree has completely figured
out deterministic tests.
For my purposes, I had a build failure somewhere in the middle of the bootstrapping process that
required me to manually build a single package. For me, it was the bmake
package that failed when it
tried to run its unit tests. Proving that it was no fluke, it failed 3 more times in the midst of a
full system build. But it passes when built in isolation.
Since I was building a very specific version of bmake
that included the architecture tuning,
I couldn’t just do a nix build "nixpkgs#bmake"
to get it into my local store. However, and this
only works with a flake configuration - you’ll need slightly diffrent syntax if you aren’t using flakes.
You can still get the build of a very specific package to happen. In my case, with a laptop host named
“exodus”, I could do the following
nix build ".#nixosConfigurations.exodus.pkgs.bmake"
This command build the exact version of the package that was going to be used on my system with the optimizations in place and allowed me to progress the rest of the build.
This time, with the --keep-going
flag in order to waste as little time as possible if there were
future hiccups.