New post
This commit is contained in:
@@ -0,0 +1,75 @@
|
||||
---
|
||||
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.
|
||||
Reference in New Issue
Block a user