---
title: "Nixos Build Issues"
date: 2025-09-28T20:06:51-05:00
draft: false
---
So I am doing a rebuild of my [NixOS](https://nixos.org) 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
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:

```nix
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](https://www.intel.com) i7 mobile processor from [Framework](https://frame.work).
The benchmarks for it are kinda weak. The [i7-1165G7](https://www.cpubenchmark.net/cpu.php?cpu=Intel+Core+i7-1165G7+%40+2.80GHz&id=3814)
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

```console
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.
