Bundle the closure into one file the AppImage runtime mounts
Hosts without Nix had no way to run frq. nix-appimage squashes the runtime closure behind an AppImage type-2 runtime, which is a single 879 MB executable. Mesa rides along and that is not waste: an AppImage runs off NixOS by definition, so the launcher always takes the nixGL branch, and nixGL needs a store Mesa to put the host's driver in front of. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
f82b93f parent: bffe879 modified
flake.lock +73 -1 | @@ -19,6 +19,22 @@ | ||
| 19 | 19 | "url": "https://github.com/cisco/ChezScheme" |
| 20 | 20 | } |
| 21 | 21 | }, |
| 22 | + "flake-compat": { | |
| 23 | + "flake": false, | |
| 24 | + "locked": { | |
| 25 | + "lastModified": 1733328505, | |
| 26 | + "narHash": "sha256-NeCCThCEP3eCl2l/+27kNNK7QrwZB1IJCrXfrbv5oqU=", | |
| 27 | + "owner": "edolstra", | |
| 28 | + "repo": "flake-compat", | |
| 29 | + "rev": "ff81ac966bb2cae68946d5ed5fc4994f96d0ffec", | |
| 30 | + "type": "github" | |
| 31 | + }, | |
| 32 | + "original": { | |
| 33 | + "owner": "edolstra", | |
| 34 | + "repo": "flake-compat", | |
| 35 | + "type": "github" | |
| 36 | + } | |
| 37 | + }, | |
| 22 | 38 | "flake-utils": { |
| 23 | 39 | "inputs": { |
| 24 | 40 | "systems": "systems" |
| @@ -37,6 +53,24 @@ | ||
| 37 | 53 | "type": "github" |
| 38 | 54 | } |
| 39 | 55 | }, |
| 56 | + "flake-utils_2": { | |
| 57 | + "inputs": { | |
| 58 | + "systems": "systems_2" | |
| 59 | + }, | |
| 60 | + "locked": { | |
| 61 | + "lastModified": 1731533236, | |
| 62 | + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", | |
| 63 | + "owner": "numtide", | |
| 64 | + "repo": "flake-utils", | |
| 65 | + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", | |
| 66 | + "type": "github" | |
| 67 | + }, | |
| 68 | + "original": { | |
| 69 | + "owner": "numtide", | |
| 70 | + "repo": "flake-utils", | |
| 71 | + "type": "github" | |
| 72 | + } | |
| 73 | + }, | |
| 40 | 74 | "glimmer": { |
| 41 | 75 | "flake": false, |
| 42 | 76 | "locked": { |
| @@ -107,13 +141,35 @@ | ||
| 107 | 141 | "url": "https://github.com/jolt-lang/jolt" |
| 108 | 142 | } |
| 109 | 143 | }, |
| 110 | - "nixgl": { | |
| 144 | + "nix-appimage": { | |
| 111 | 145 | "inputs": { |
| 146 | + "flake-compat": "flake-compat", | |
| 112 | 147 | "flake-utils": "flake-utils", |
| 113 | 148 | "nixpkgs": [ |
| 114 | 149 | "nixpkgs" |
| 115 | 150 | ] |
| 116 | 151 | }, |
| 152 | + "locked": { | |
| 153 | + "lastModified": 1757920913, | |
| 154 | + "narHash": "sha256-jd0QwCVz4O1sHHkeaZILD/7D6oyalceEJ4EFnWCgm0k=", | |
| 155 | + "owner": "ralismark", | |
| 156 | + "repo": "nix-appimage", | |
| 157 | + "rev": "7946addbc0d97e358a6d7aefe5e82310f0fe6b18", | |
| 158 | + "type": "github" | |
| 159 | + }, | |
| 160 | + "original": { | |
| 161 | + "owner": "ralismark", | |
| 162 | + "repo": "nix-appimage", | |
| 163 | + "type": "github" | |
| 164 | + } | |
| 165 | + }, | |
| 166 | + "nixgl": { | |
| 167 | + "inputs": { | |
| 168 | + "flake-utils": "flake-utils_2", | |
| 169 | + "nixpkgs": [ | |
| 170 | + "nixpkgs" | |
| 171 | + ] | |
| 172 | + }, | |
| 117 | 173 | "locked": { |
| 118 | 174 | "lastModified": 1762090880, |
| 119 | 175 | "narHash": "sha256-fbRQzIGPkjZa83MowjbD2ALaJf9y6KMDdJBQMKFeY/8=", |
| @@ -151,6 +207,7 @@ | ||
| 151 | 207 | "jolt-android-src": "jolt-android-src", |
| 152 | 208 | "jolt-native": "jolt-native", |
| 153 | 209 | "jolt-src": "jolt-src", |
| 210 | + "nix-appimage": "nix-appimage", | |
| 154 | 211 | "nixgl": "nixgl", |
| 155 | 212 | "nixpkgs": "nixpkgs" |
| 156 | 213 | } |
| @@ -169,6 +226,21 @@ | ||
| 169 | 226 | "repo": "default", |
| 170 | 227 | "type": "github" |
| 171 | 228 | } |
| 229 | + }, | |
| 230 | + "systems_2": { | |
| 231 | + "locked": { | |
| 232 | + "lastModified": 1681028828, | |
| 233 | + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", | |
| 234 | + "owner": "nix-systems", | |
| 235 | + "repo": "default", | |
| 236 | + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", | |
| 237 | + "type": "github" | |
| 238 | + }, | |
| 239 | + "original": { | |
| 240 | + "owner": "nix-systems", | |
| 241 | + "repo": "default", | |
| 242 | + "type": "github" | |
| 243 | + } | |
| 172 | 244 | } |
| 173 | 245 | }, |
| 174 | 246 | "root": "root", |
| @@ -19,6 +19,22 @@ | |||
| 19 | "url": "https://github.com/cisco/ChezScheme" | 19 | "url": "https://github.com/cisco/ChezScheme" |
| 20 | } | 20 | } |
| 21 | }, | 21 | }, |
| 22 | + "flake-compat": { | ||
| 23 | + "flake": false, | ||
| 24 | + "locked": { | ||
| 25 | + "lastModified": 1733328505, | ||
| 26 | + "narHash": "sha256-NeCCThCEP3eCl2l/+27kNNK7QrwZB1IJCrXfrbv5oqU=", | ||
| 27 | + "owner": "edolstra", | ||
| 28 | + "repo": "flake-compat", | ||
| 29 | + "rev": "ff81ac966bb2cae68946d5ed5fc4994f96d0ffec", | ||
| 30 | + "type": "github" | ||
| 31 | + }, | ||
| 32 | + "original": { | ||
| 33 | + "owner": "edolstra", | ||
| 34 | + "repo": "flake-compat", | ||
| 35 | + "type": "github" | ||
| 36 | + } | ||
| 37 | + }, | ||
| 22 | "flake-utils": { | 38 | "flake-utils": { |
| 23 | "inputs": { | 39 | "inputs": { |
| 24 | "systems": "systems" | 40 | "systems": "systems" |
| @@ -37,6 +53,24 @@ | |||
| 37 | "type": "github" | 53 | "type": "github" |
| 38 | } | 54 | } |
| 39 | }, | 55 | }, |
| 56 | + "flake-utils_2": { | ||
| 57 | + "inputs": { | ||
| 58 | + "systems": "systems_2" | ||
| 59 | + }, | ||
| 60 | + "locked": { | ||
| 61 | + "lastModified": 1731533236, | ||
| 62 | + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", | ||
| 63 | + "owner": "numtide", | ||
| 64 | + "repo": "flake-utils", | ||
| 65 | + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", | ||
| 66 | + "type": "github" | ||
| 67 | + }, | ||
| 68 | + "original": { | ||
| 69 | + "owner": "numtide", | ||
| 70 | + "repo": "flake-utils", | ||
| 71 | + "type": "github" | ||
| 72 | + } | ||
| 73 | + }, | ||
| 40 | "glimmer": { | 74 | "glimmer": { |
| 41 | "flake": false, | 75 | "flake": false, |
| 42 | "locked": { | 76 | "locked": { |
| @@ -107,13 +141,35 @@ | |||
| 107 | "url": "https://github.com/jolt-lang/jolt" | 141 | "url": "https://github.com/jolt-lang/jolt" |
| 108 | } | 142 | } |
| 109 | }, | 143 | }, |
| 110 | - "nixgl": { | 144 | + "nix-appimage": { |
| 111 | "inputs": { | 145 | "inputs": { |
| 146 | + "flake-compat": "flake-compat", | ||
| 112 | "flake-utils": "flake-utils", | 147 | "flake-utils": "flake-utils", |
| 113 | "nixpkgs": [ | 148 | "nixpkgs": [ |
| 114 | "nixpkgs" | 149 | "nixpkgs" |
| 115 | ] | 150 | ] |
| 116 | }, | 151 | }, |
| 152 | + "locked": { | ||
| 153 | + "lastModified": 1757920913, | ||
| 154 | + "narHash": "sha256-jd0QwCVz4O1sHHkeaZILD/7D6oyalceEJ4EFnWCgm0k=", | ||
| 155 | + "owner": "ralismark", | ||
| 156 | + "repo": "nix-appimage", | ||
| 157 | + "rev": "7946addbc0d97e358a6d7aefe5e82310f0fe6b18", | ||
| 158 | + "type": "github" | ||
| 159 | + }, | ||
| 160 | + "original": { | ||
| 161 | + "owner": "ralismark", | ||
| 162 | + "repo": "nix-appimage", | ||
| 163 | + "type": "github" | ||
| 164 | + } | ||
| 165 | + }, | ||
| 166 | + "nixgl": { | ||
| 167 | + "inputs": { | ||
| 168 | + "flake-utils": "flake-utils_2", | ||
| 169 | + "nixpkgs": [ | ||
| 170 | + "nixpkgs" | ||
| 171 | + ] | ||
| 172 | + }, | ||
| 117 | "locked": { | 173 | "locked": { |
| 118 | "lastModified": 1762090880, | 174 | "lastModified": 1762090880, |
| 119 | "narHash": "sha256-fbRQzIGPkjZa83MowjbD2ALaJf9y6KMDdJBQMKFeY/8=", | 175 | "narHash": "sha256-fbRQzIGPkjZa83MowjbD2ALaJf9y6KMDdJBQMKFeY/8=", |
| @@ -151,6 +207,7 @@ | |||
| 151 | "jolt-android-src": "jolt-android-src", | 207 | "jolt-android-src": "jolt-android-src", |
| 152 | "jolt-native": "jolt-native", | 208 | "jolt-native": "jolt-native", |
| 153 | "jolt-src": "jolt-src", | 209 | "jolt-src": "jolt-src", |
| 210 | + "nix-appimage": "nix-appimage", | ||
| 154 | "nixgl": "nixgl", | 211 | "nixgl": "nixgl", |
| 155 | "nixpkgs": "nixpkgs" | 212 | "nixpkgs": "nixpkgs" |
| 156 | } | 213 | } |
| @@ -169,6 +226,21 @@ | |||
| 169 | "repo": "default", | 226 | "repo": "default", |
| 170 | "type": "github" | 227 | "type": "github" |
| 171 | } | 228 | } |
| 229 | + }, | ||
| 230 | + "systems_2": { | ||
| 231 | + "locked": { | ||
| 232 | + "lastModified": 1681028828, | ||
| 233 | + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", | ||
| 234 | + "owner": "nix-systems", | ||
| 235 | + "repo": "default", | ||
| 236 | + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", | ||
| 237 | + "type": "github" | ||
| 238 | + }, | ||
| 239 | + "original": { | ||
| 240 | + "owner": "nix-systems", | ||
| 241 | + "repo": "default", | ||
| 242 | + "type": "github" | ||
| 243 | + } | ||
| 172 | } | 244 | } |
| 173 | }, | 245 | }, |
| 174 | "root": "root", | 246 | "root": "root", |
modified
flake.nix +15 -1 | @@ -65,9 +65,16 @@ | ||
| 65 | 65 | url = "github:nix-community/nixGL"; |
| 66 | 66 | inputs.nixpkgs.follows = "nixpkgs"; |
| 67 | 67 | }; |
| 68 | + | |
| 69 | + # Wraps a closure into a single self-extracting file. Only the `appimage` | |
| 70 | + # output evaluates it. | |
| 71 | + nix-appimage = { | |
| 72 | + url = "github:ralismark/nix-appimage"; | |
| 73 | + inputs.nixpkgs.follows = "nixpkgs"; | |
| 74 | + }; | |
| 68 | 75 | }; |
| 69 | 76 | |
| 70 | - outputs = { self, nixpkgs, jolt-src, jolt-native, glimmer, chez-src, jolt-android-src, nixgl }: | |
| 77 | + outputs = { self, nixpkgs, jolt-src, jolt-native, glimmer, chez-src, jolt-android-src, nixgl, nix-appimage }: | |
| 71 | 78 | let |
| 72 | 79 | systems = [ "x86_64-linux" "aarch64-linux" ]; |
| 73 | 80 | forEachSystem = f: |
| @@ -274,6 +281,13 @@ | ||
| 274 | 281 | inherit native frq; |
| 275 | 282 | jolt = joltRuntime; |
| 276 | 283 | default = frq; |
| 284 | + | |
| 285 | + # frq and everything it loads, squashed into one runnable file for | |
| 286 | + # hosts without Nix. The whole closure rides along — Mesa included, | |
| 287 | + # which is not waste: off NixOS the launcher goes through nixGL, and | |
| 288 | + # nixGL needs a store Mesa to put the host's driver in front of. | |
| 289 | + appimage = | |
| 290 | + nix-appimage.bundlers.${pkgs.stdenv.hostPlatform.system}.default frq; | |
| 277 | 291 | } |
| 278 | 292 | # An APK is built by a linux-x86_64 NDK and a linux-x86_64 jolt, and |
| 279 | 293 | # Google ships no other; on aarch64 the Android outputs are simply |
| @@ -65,9 +65,16 @@ | |||
| 65 | url = "github:nix-community/nixGL"; | 65 | url = "github:nix-community/nixGL"; |
| 66 | inputs.nixpkgs.follows = "nixpkgs"; | 66 | inputs.nixpkgs.follows = "nixpkgs"; |
| 67 | }; | 67 | }; |
| 68 | + | ||
| 69 | + # Wraps a closure into a single self-extracting file. Only the `appimage` | ||
| 70 | + # output evaluates it. | ||
| 71 | + nix-appimage = { | ||
| 72 | + url = "github:ralismark/nix-appimage"; | ||
| 73 | + inputs.nixpkgs.follows = "nixpkgs"; | ||
| 74 | + }; | ||
| 68 | }; | 75 | }; |
| 69 | 76 | ||
| 70 | - outputs = { self, nixpkgs, jolt-src, jolt-native, glimmer, chez-src, jolt-android-src, nixgl }: | 77 | + outputs = { self, nixpkgs, jolt-src, jolt-native, glimmer, chez-src, jolt-android-src, nixgl, nix-appimage }: |
| 71 | let | 78 | let |
| 72 | systems = [ "x86_64-linux" "aarch64-linux" ]; | 79 | systems = [ "x86_64-linux" "aarch64-linux" ]; |
| 73 | forEachSystem = f: | 80 | forEachSystem = f: |
| @@ -274,6 +281,13 @@ | |||
| 274 | inherit native frq; | 281 | inherit native frq; |
| 275 | jolt = joltRuntime; | 282 | jolt = joltRuntime; |
| 276 | default = frq; | 283 | default = frq; |
| 284 | + | ||
| 285 | + # frq and everything it loads, squashed into one runnable file for | ||
| 286 | + # hosts without Nix. The whole closure rides along — Mesa included, | ||
| 287 | + # which is not waste: off NixOS the launcher goes through nixGL, and | ||
| 288 | + # nixGL needs a store Mesa to put the host's driver in front of. | ||
| 289 | + appimage = | ||
| 290 | + nix-appimage.bundlers.${pkgs.stdenv.hostPlatform.system}.default frq; | ||
| 277 | } | 291 | } |
| 278 | # An APK is built by a linux-x86_64 NDK and a linux-x86_64 jolt, and | 292 | # An APK is built by a linux-x86_64 NDK and a linux-x86_64 jolt, and |
| 279 | # Google ships no other; on aarch64 the Android outputs are simply | 293 | # Google ships no other; on aarch64 the Android outputs are simply |