| 16 Apr 2026 |
xored | * the problem is I have more than one package that has this issue, e.g the arrs don't build on darwin at this point, so I need to force them on linux only, i've been experimenting with patching pkgs-by-name-for-flake-parts (which handles the linux ones), but I'd need to know how to have it behave properly to begin with | 17:39:36 |
EsperLily [she/her] | optionalDrvAttr cond s is just if cond then s else null, so this avoids defining the key unless the condition holds | 18:03:52 |
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 |