2026-06-16 13:29:15 +01:00
|
|
|
# Feature-flag option declarations shared by every NixOS host (imported via
|
|
|
|
|
# baseModules in flake.nix). Declaring the flags here -- rather than inside the
|
|
|
|
|
# module that implements them -- means a host can read or set a flag without
|
|
|
|
|
# importing the (often large) implementation module. In particular,
|
2026-06-29 13:06:23 +01:00
|
|
|
# features.swayDesktop.enable is read by modules/users.nix on every host, but a
|
2026-06-16 13:29:15 +01:00
|
|
|
# headless host (e.g. the Pi) must be able to leave it at its default without
|
2026-06-29 13:06:23 +01:00
|
|
|
# pulling in modules/sway.nix. The implementation lives in modules/sway.nix,
|
2026-06-16 13:29:15 +01:00
|
|
|
# gated on this flag.
|
2026-08-17 20:35:29 +01:00
|
|
|
#
|
|
|
|
|
# The file also carries the host capability facts those flags derive from
|
|
|
|
|
# (features.cpu.*). features.claudeCode.enable is such a derived flag: it is
|
|
|
|
|
# computed from the declared CPU level here and read by home/claude.nix through
|
|
|
|
|
# home-manager's osConfig, so a machine that cannot run the tool never installs
|
|
|
|
|
# it, on any host, without per-host opt-outs.
|
2026-06-16 13:29:15 +01:00
|
|
|
{
|
2026-08-17 20:35:29 +01:00
|
|
|
config,
|
|
|
|
|
lib,
|
|
|
|
|
pkgs,
|
|
|
|
|
...
|
|
|
|
|
}:
|
|
|
|
|
let
|
|
|
|
|
cfg = config.features;
|
|
|
|
|
|
|
|
|
|
# Claude Code runs on Node, whose V8 build requires SSE4.2 and POPCNT -- the
|
|
|
|
|
# x86-64-v2 feature set. On an older x86_64 CPU it does not run (illegal
|
|
|
|
|
# instruction), so it must not be installed there.
|
|
|
|
|
claudeCodeMinLevel = 2;
|
|
|
|
|
claudeCodeSupported =
|
|
|
|
|
!pkgs.stdenv.hostPlatform.isx86_64 || cfg.cpu.microarchLevel >= claudeCodeMinLevel;
|
|
|
|
|
in
|
|
|
|
|
{
|
|
|
|
|
options.features = {
|
|
|
|
|
swayDesktop.enable = lib.mkEnableOption "the Sway desktop";
|
|
|
|
|
|
|
|
|
|
cpu.microarchLevel = lib.mkOption {
|
|
|
|
|
type = lib.types.ints.between 1 4;
|
|
|
|
|
default = 2;
|
|
|
|
|
example = 1;
|
|
|
|
|
description = ''
|
|
|
|
|
The x86-64 psABI microarchitecture level the host CPU implements:
|
|
|
|
|
1 = the original baseline, 2 = SSE4.2/POPCNT (Nehalem, 2008+),
|
|
|
|
|
3 = AVX2, 4 = AVX-512.
|
|
|
|
|
|
|
|
|
|
Nix cannot detect this (evaluation is pure and hosts are often built
|
|
|
|
|
elsewhere), so a machine older than the default declares its own level
|
|
|
|
|
and the flags below derive from it. Ignored on non-x86_64 hosts.
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
claudeCode.enable = lib.mkOption {
|
|
|
|
|
type = lib.types.bool;
|
|
|
|
|
default = claudeCodeSupported;
|
|
|
|
|
defaultText = lib.literalMD ''
|
|
|
|
|
`true`, unless the host declares an x86-64 microarchitecture level
|
|
|
|
|
below ${toString claudeCodeMinLevel}
|
|
|
|
|
'';
|
|
|
|
|
description = ''
|
|
|
|
|
Whether to install Claude Code in this host's home-manager profiles
|
|
|
|
|
(implemented in home/claude.nix). Defaults off on CPUs below
|
|
|
|
|
x86-64-v${toString claudeCodeMinLevel}, which cannot run it; forcing it
|
|
|
|
|
on such a host is an evaluation error.
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
config.assertions = [
|
|
|
|
|
{
|
|
|
|
|
assertion = cfg.claudeCode.enable -> claudeCodeSupported;
|
|
|
|
|
message = ''
|
|
|
|
|
features.claudeCode.enable is on, but this host declares
|
|
|
|
|
features.cpu.microarchLevel = ${toString cfg.cpu.microarchLevel}.
|
|
|
|
|
Claude Code needs x86-64-v${toString claudeCodeMinLevel}
|
|
|
|
|
(SSE4.2/POPCNT) and will not run on an older CPU.
|
|
|
|
|
'';
|
|
|
|
|
}
|
|
|
|
|
];
|
2026-06-16 13:29:15 +01:00
|
|
|
}
|