From b3dd5f285365f59153a8f4549efa0607ccddf19d Mon Sep 17 00:00:00 2001 From: Ben Sima Date: Sat, 15 Nov 2025 10:06:18 -0500 Subject: Fix NixOS integration: separate package building from OS builds Problem: Calling bild.run inside NixOS configs triggered IFD during OS evaluation. ANSI escape codes from bild broke JSON parsing in Nix sandbox, causing build failures. Root cause: bild.run uses IFD (Import From Derivation) which runs bild --plan during Nix evaluation. When this happened inside NixOS service definitions, it ran recursively and bild output ANSI codes that corrupted the JSON analysis output. Solution: Two-phase architecture + NO_COLOR support 1. Biz/Packages.nix: Pre-builds all packages outside NixOS context 2. Biz.nix: Accepts packages as function argument (default: Packages.nix) 3. Omni/Bild.nix: Sets NO_COLOR=1 in analysis derivation 4. Omni/Log/Terminal.hs: Respects NO_COLOR env var 5. Omni/Log/Terminal.hs: Skip getTerminalSize when NO_COLOR set to avoid escape code output 6. Omni/Log/Concurrent.hs: Skip line initialization without ANSI support Now NixOS builds succeed: - Package IFD happens once at top level - No recursive builds during service evaluation - Clean JSON output from bild --plan in Nix sandbox - NixOS configs reference pre-analyzed packages Changes: - Add Biz/Packages.nix - standalone package builder - Update Biz.nix to accept packages argument - Update Biz/Dragons/Analysis.nix to use Packages.nix - Remove Biz/Targets.nix (replaced by Packages.nix) - Add NO_COLOR support throughout logging stack - Fix ANSI.getTerminalSize outputting escape codes when NO_COLOR set Amp-Thread-ID: https://ampcode.com/threads/T-bc0f6fc7-46bf-4aa2-892e-dd62e7251d4b Co-authored-by: Amp --- Biz.nix | 36 +++++++++++++++++++++--------------- 1 file changed, 21 insertions(+), 15 deletions(-) (limited to 'Biz.nix') diff --git a/Biz.nix b/Biz.nix index 7435c08..3ccf955 100755 --- a/Biz.nix +++ b/Biz.nix @@ -1,16 +1,22 @@ #!/usr/bin/env run.sh # nunya -{bild, ...}: let - # Pre-declared targets prevent recursive builds during NixOS evaluation. - # All bild.run calls happen once at this top level. - targets = import ./Biz/Targets.nix {inherit bild;}; -in - # This is the biz hosting service. Currently it defines a base OS similar to - # Omni/Cloud.nix et al and starts each Biz/* thing as a systemd service. A - # better solution might be to define each Biz/* thing as a container, and then - # wire them together as necessary here, but I don't know how that works so I'll - # just stick to this method for now. - bild.os { +# +# To build the NixOS system: +# 1. First build packages: nix-build Biz/Packages.nix +# 2. Then build OS with packages: nix-build Biz.nix --arg packages "import ./Biz/Packages.nix {}" +# +# Or use the wrapper: Omni/Ide/run.sh Biz.nix +{ + bild, + packages ? import ./Biz/Packages.nix {inherit bild;}, + ... +}: +# This is the biz hosting service. Currently it defines a base OS similar to +# Omni/Cloud.nix et al and starts each Biz/* thing as a systemd service. A +# better solution might be to define each Biz/* thing as a container, and then +# wire them together as necessary here, but I don't know how that works so I'll +# just stick to this method for now. +bild.os { imports = [ ./Omni/Cloud/Hardware.nix ./Omni/Os/Base.nix @@ -25,14 +31,14 @@ in time.timeZone = "America/New_York"; services.storybook = { enable = false; - package = targets.storybook; + package = packages.storybook; }; services.podcastitlater-web = { enable = true; - package = targets.podcastitlater-web; + package = packages.podcastitlater-web; }; services.podcastitlater-worker = { enable = true; - package = targets.podcastitlater-worker; + package = packages.podcastitlater-worker; }; - } +} -- cgit v1.2.3