Make the baked app a real store-path dependency via builtins.storePath

The previous commit wrapped the manifest's storePath string in a
symlinkJoin. symlinkJoin passes its paths as a file, so a bare store-path
string registered no dependency: Nix never substituted the closure and the
symlinkJoin failed with 'radiantwave-: No such file or directory'.

builtins.storePath turns the published path into a real store-path
dependency that Nix substitutes from the channel's Attic cache, so the app
is baked and never compiled. Keep the raw string (publishedPath) for the
updater's plain-string baseline pointer.
This commit is contained in:
NeilClack
2026-10-07 10:48:45 -05:00
parent d54637d249
commit 48bab43a21
2 changed files with 19 additions and 18 deletions
+4 -9
View File
@@ -1,15 +1,10 @@
{ config, pkgs, radiantwaveApp, upgradeFlakeRef, radiantwavePlymouth, ... }: { config, pkgs, radiantwaveApp, upgradeFlakeRef, radiantwavePlymouth, ... }:
let 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; 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 # When the live-updater module is enabled, RadiantWave launches through the
# mutable /var/lib/radiantwave/current # mutable /var/lib/radiantwave/current
# pointer so it can be swapped without a full nixos-rebuild. Otherwise it # pointer so it can be swapped without a full nixos-rebuild. Otherwise it
@@ -28,7 +23,7 @@ in
# Included packages # Included packages
environment.systemPackages = [ environment.systemPackages = [
pkgs.cage pkgs.rsync pkgs.dbus pkgs.mesa pkgs.git pkgs.tailscale pkgs.sqlite pkgs.wireplumber 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. # This populates the EFI partition and tells the NUC how to start NixOS.
+15 -9
View File
@@ -93,11 +93,17 @@
url = "${channelManifestDir}/${manifestFile}"; url = "${channelManifestDir}/${manifestFile}";
})); }));
# The published closure as a plain store-path string. configuration.nix # The published closure as a plain store-path string. Used for the
# wraps it in a symlinkJoin so it can live in environment.systemPackages # updater's runtime baseline pointer (a plain string; the closure itself
# (a bare string there would be coerced with builtins.storePath, which # is pulled in via publishedApp below).
# requires the closure to already be local at eval time). publishedPath = manifestFile: (manifestFor manifestFile).storePath;
publishedApp = 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 # Live app-update side channel. The manifest is served by the
# fileserver; closures are fetched (never built) from the channel's # fileserver; closures are fetched (never built) from the channel's
@@ -249,7 +255,7 @@
diskModule = ./disk-config.nix; diskModule = ./disk-config.nix;
upgradeFlakeRef = "git+https://gitea.radiantwavetech.com/RadiantWaveTech/KioskConfig.git${channel.gitRef}#radiantwavekiosk"; upgradeFlakeRef = "git+https://gitea.radiantwavetech.com/RadiantWaveTech/KioskConfig.git${channel.gitRef}#radiantwavekiosk";
extraModules = [ extraModules = [
(radiantwaveUpdaterModule { repo = channel.atticRepo; baseline = publishedApp "manifest.json"; }) (radiantwaveUpdaterModule { repo = channel.atticRepo; baseline = publishedPath "manifest.json"; })
]; ];
}; };
radiantwavekiosk-commercial = mkKioskSystem { radiantwavekiosk-commercial = mkKioskSystem {
@@ -258,7 +264,7 @@
diskModule = ./commercial-disk-config.nix; diskModule = ./commercial-disk-config.nix;
upgradeFlakeRef = "git+https://gitea.radiantwavetech.com/RadiantWaveTech/KioskConfig.git${channel.gitRef}#radiantwavekiosk-commercial"; upgradeFlakeRef = "git+https://gitea.radiantwavetech.com/RadiantWaveTech/KioskConfig.git${channel.gitRef}#radiantwavekiosk-commercial";
extraModules = [ extraModules = [
(radiantwaveUpdaterModule { repo = channel.atticRepo; baseline = publishedApp "manifest.json"; }) (radiantwaveUpdaterModule { repo = channel.atticRepo; baseline = publishedPath "manifest.json"; })
]; ];
}; };
# Rotated screen for android-style displays. # Rotated screen for android-style displays.
@@ -269,7 +275,7 @@
upgradeFlakeRef = "git+https://gitea.radiantwavetech.com/RadiantWaveTech/KioskConfig.git${channel.gitRef}#radiantwavekiosk-android"; upgradeFlakeRef = "git+https://gitea.radiantwavetech.com/RadiantWaveTech/KioskConfig.git${channel.gitRef}#radiantwavekiosk-android";
extraModules = [ extraModules = [
./rotated_display.nix ./rotated_display.nix
(radiantwaveUpdaterModule { repo = channel.atticRepo; baseline = publishedApp "manifest.json"; }) (radiantwaveUpdaterModule { repo = channel.atticRepo; baseline = publishedPath "manifest.json"; })
]; ];
}; };
# Raspberry Pi 5. # Raspberry Pi 5.
@@ -279,7 +285,7 @@
extraModules = [ extraModules = [
(radiantwaveUpdaterModule { (radiantwaveUpdaterModule {
repo = channel.atticRepo; repo = channel.atticRepo;
baseline = publishedApp "aarch64-manifest.json"; baseline = publishedPath "aarch64-manifest.json";
manifestFile = "aarch64-manifest.json"; manifestFile = "aarch64-manifest.json";
}) })
]; ];