| 16 Apr 2026 |
EsperLily [she/her] | (technically that method exists to use for derivation attributes, because nulls get omitted from the environment, but it works equally well as shorthand for "${if cond then "key" else null} = value syntax) | 18:04:56 |
EsperLily [she/her] | * (technically that method exists to use for derivation attributes, because nulls get omitted from the environment, but it works equally well as shorthand for "${if cond then "key" else null} = value; syntax) | 18:05:06 |
EsperLily [she/her] | i guess the other idea is to see if you can do this in the top-level flake section, if you define e.g. flake.packages.aarch64-darwin.aerospace-focus-fzf maybe that will get merged with the perSystem stuff? | 18:07:34 |
xored | unfortunately flake-parts does something weird with flake.packages and i can't seem to export packages that way (i believe it tries to transpose system into it, I might be wrong | 18:10:56 |
EsperLily [she/her] | does it give you some sort of error? I'm digging into the code but there's a lot here. it looks to me like perSystem is a deferred module (which is a thing i haven't really explored how it works yet) and it uses that to construct config.allSystems as a lazy attrset where each attr is a system and the value is the perSystem module module set evaluated with that system. And then for each of the options defined in perSystem it also defines flake.${option}.${system} = config.allSystems.${system}.${option}. The packages attrset is lazy so you can't write packages.foo = mkIf (or rather if you do I think what will happen is accessing that package from any system where that evaluates false will throw an error as package doesn't define an empty value). But defining packages.${if stdenv.hostPlatform.isDarwin then "aerospace-focus-fzf" else null} = aerospace-focus-fzf; still seems like it should work? and similarly, just defining flake.packages.aarch64-darwin.aerospace-focus-fzf should also work? | 19:45:39 |
EsperLily [she/her] | * does it give you some sort of error? I'm digging into the code but there's a lot here. it looks to me like perSystem is a deferred module and it uses that to construct config.allSystems as a lazy attrset where each attr is a system and the value is the perSystem module module set evaluated with that system. And then for each of the options defined in perSystem it also defines flake.${option}.${system} = config.allSystems.${system}.${option}. The packages attrset is lazy so you can't write packages.foo = mkIf (or rather if you do I think what will happen is accessing that package from any system where that evaluates false will throw an error as package doesn't define an empty value). But defining packages.${if stdenv.hostPlatform.isDarwin then "aerospace-focus-fzf" else null} = aerospace-focus-fzf; still seems like it should work? and similarly, just defining flake.packages.aarch64-darwin.aerospace-focus-fzf should also work? | 19:46:21 |
EsperLily [she/her] | * does it give you some sort of error? I'm digging into the code but there's a lot here. it looks to me like perSystem is a deferred module and it uses that to construct config.allSystems as a lazy attrset where each attr is a system and the value is the perSystem module set evaluated with that system. And then for each of the options defined in perSystem it also defines flake.${option}.${system} = config.allSystems.${system}.${option}. The packages attrset is lazy so you can't write packages.foo = mkIf (or rather if you do I think what will happen is accessing that package from any system where that evaluates false will throw an error as package doesn't define an empty value). But defining packages.${if stdenv.hostPlatform.isDarwin then "aerospace-focus-fzf" else null} = aerospace-focus-fzf; still seems like it should work? and similarly, just defining flake.packages.aarch64-darwin.aerospace-focus-fzf should also work? | 19:46:34 |
xored | when i tried it back with mkIf I got option packages.aarch64-darwin.foo option was accessed but not defined kind of error | 19:47:30 |
EsperLily [she/her] | with mkIf I'd expect an error that looks like "The option `${showOption loc}' was accessed but has no value defined. Try setting the option." | 19:48:02 |
xored | yeah | 19:48:09 |
xored | i'll try in a sec fixing my rust crap :P | 19:48:19 |
xored | i meant crab, surely :kappa: | 19:48:25 |
EsperLily [she/her] | that's what happens with a lazyAttrsOf when the element type doesn't define an empty value | 19:48:26 |
EsperLily [she/her] | * that's what happens with a lazyAttrsOf when the element type doesn't define an empty value and you use mkIf | 19:48:40 |
EsperLily [she/her] | but if you got it accessing packages.aarch64-darwin.foo then that means your mkIf condition was wrong | 19:49:28 |
EsperLily [she/her] | because that error should only show up when the mkIf condition evaluates to false | 19:49:43 |
EsperLily [she/her] | but again i'm recommending you do the dynamic attribute approach rather than the mkIf so that way it's simply not defined in non-darwin package sets | 19:50:14 |
EsperLily [she/her] | you only need mkIf if you're relying on other parts of the config. it looks like for perSystem, the argument system is a specialArgs so you can use that strictly. actually I suggested before writing ${if stdenv.hostPlatform.isDarwin then … } but you can't actually do that as stdenv comes from pkgs which is presumably not a special arg. you can refer to the system arg safely this way though | 19:52:37 |
xored | EsperLily [she/her] Randy Eckenrode that seems to have worked, thank you both | 20:09:41 |
xored | now i just need to figure out the hellhole that is packagesFromDirectoryRecursive to make the auto packages exclude a platform somehow | 20:10:55 |
xored | but for manual packages seems to have done the trick | 20:11:06 |
EsperLily [she/her] | in the general case it may be better to just use meta.platforms to mark platform-specific packages, so that way the attribute path itself exists on other platforms, which interacts better with callPackage (it's generally simpler for a package to declare the argument and then just conditionally use it, than to mark the argument as nullable and assert that it has a value on the expected platform) | 20:12:39 |
xored | right, but I remember reading something about not having to eval | 20:13:53 |
xored | so what i'm thinking is to have a directory with the platform name and somehow filter these out, so you'd have packages/x86_64-linux/foo for platform-specific packages | 20:14:31 |
xored | only if you're curious: https://github.com/drupol/pkgs-by-name-for-flake-parts/blob/main/flake-module.nix | 20:16:32 |
xored | I'd have access to system | 20:16:52 |
xored | i just need to find a way to have them filtered out from packages and legacyPackages, nix flake show:_ | 20:17:24 |
xored | └───x86_64-linux
├───nvim omitted (use '--all-systems' to show)
├───prometheus-opnsense-exporter omitted (use '--all-systems' to show)
├───write-flake omitted (use '--all-systems' to show)
├───write-inputs omitted (use '--all-systems' to show)
├───write-lock omitted (use '--all-systems' to show)
├───x86_64-linux/arrs/prowlarr omitted (use '--all-systems' to show)
├───x86_64-linux/arrs/radarr omitted (use '--all-systems' to show)
├───x86_64-linux/arrs/seerr omitted (use '--all-systems' to show)
└───x86_64-linux/arrs/sonarr omitted (use '--all-systems' to show)_
| 20:17:58 |
| 17 Apr 2026 |
| LogN changed their display name from LogN [unavailable @ CinemaCon -> 4/18] to LogN. | 01:24:09 |
Randy Eckenrode | Got network_cmds building finally. It ended up being easier to restore the XNU headers build than to try to keep scraping structs out of files. Unfortunately, the XNU headers still have to be copied because some conflict with the SDK. | 04:03:48 |