diff --git a/configuration.nix b/configuration.nix index 821e3f8..95a2073 100644 --- a/configuration.nix +++ b/configuration.nix @@ -1,15 +1,10 @@ { config, pkgs, radiantwaveApp, upgradeFlakeRef, radiantwavePlymouth, ... }: let + # The published app is a store path with context (builtins.storePath in + # flake.nix), so Nix substitutes it from the channel's Attic cache and the + # system closure depends on it. radiantApp = radiantwaveApp; - # The published app arrives as a bare store-path string (from the channel - # manifest, see flake.nix). Wrap it in a derivation built with this system's - # pkgs so it can live in environment.systemPackages; the wrapper is a symlink - # farm and the real closure is substituted from the channel's Attic cache. - radiantAppPackage = pkgs.symlinkJoin { - name = "radiantwave-published"; - paths = [ radiantApp ]; - }; # When the live-updater module is enabled, RadiantWave launches through the # mutable /var/lib/radiantwave/current # pointer so it can be swapped without a full nixos-rebuild. Otherwise it @@ -28,7 +23,7 @@ in # Included packages environment.systemPackages = [ pkgs.cage pkgs.rsync pkgs.dbus pkgs.mesa pkgs.git pkgs.tailscale pkgs.sqlite pkgs.wireplumber - radiantAppPackage + radiantApp ]; # This populates the EFI partition and tells the NUC how to start NixOS. diff --git a/flake.nix b/flake.nix index 65dfea2..2888358 100644 --- a/flake.nix +++ b/flake.nix @@ -93,11 +93,17 @@ url = "${channelManifestDir}/${manifestFile}"; })); - # The published closure as a plain store-path string. configuration.nix - # wraps it in a symlinkJoin so it can live in environment.systemPackages - # (a bare string there would be coerced with builtins.storePath, which - # requires the closure to already be local at eval time). - publishedApp = manifestFile: (manifestFor manifestFile).storePath; + # The published closure as a plain store-path string. Used for the + # updater's runtime baseline pointer (a plain string; the closure itself + # is pulled in via publishedApp below). + publishedPath = manifestFile: (manifestFor manifestFile).storePath; + + # The published closure as a real store-path dependency. + # builtins.storePath makes the derivation depend on this exact path and + # substitute it from the channel's Attic cache (configured as a trusted + # substituter), so the app is never compiled from source. The closure + # itself is not fetched by this repository; RadiantWave CI publishes it. + publishedApp = manifestFile: builtins.storePath (publishedPath manifestFile); # Live app-update side channel. The manifest is served by the # fileserver; closures are fetched (never built) from the channel's @@ -249,7 +255,7 @@ diskModule = ./disk-config.nix; upgradeFlakeRef = "git+https://gitea.radiantwavetech.com/RadiantWaveTech/KioskConfig.git${channel.gitRef}#radiantwavekiosk"; extraModules = [ - (radiantwaveUpdaterModule { repo = channel.atticRepo; baseline = publishedApp "manifest.json"; }) + (radiantwaveUpdaterModule { repo = channel.atticRepo; baseline = publishedPath "manifest.json"; }) ]; }; radiantwavekiosk-commercial = mkKioskSystem { @@ -258,7 +264,7 @@ diskModule = ./commercial-disk-config.nix; upgradeFlakeRef = "git+https://gitea.radiantwavetech.com/RadiantWaveTech/KioskConfig.git${channel.gitRef}#radiantwavekiosk-commercial"; extraModules = [ - (radiantwaveUpdaterModule { repo = channel.atticRepo; baseline = publishedApp "manifest.json"; }) + (radiantwaveUpdaterModule { repo = channel.atticRepo; baseline = publishedPath "manifest.json"; }) ]; }; # Rotated screen for android-style displays. @@ -269,7 +275,7 @@ upgradeFlakeRef = "git+https://gitea.radiantwavetech.com/RadiantWaveTech/KioskConfig.git${channel.gitRef}#radiantwavekiosk-android"; extraModules = [ ./rotated_display.nix - (radiantwaveUpdaterModule { repo = channel.atticRepo; baseline = publishedApp "manifest.json"; }) + (radiantwaveUpdaterModule { repo = channel.atticRepo; baseline = publishedPath "manifest.json"; }) ]; }; # Raspberry Pi 5. @@ -279,7 +285,7 @@ extraModules = [ (radiantwaveUpdaterModule { repo = channel.atticRepo; - baseline = publishedApp "aarch64-manifest.json"; + baseline = publishedPath "aarch64-manifest.json"; manifestFile = "aarch64-manifest.json"; }) ];