!lheuhImcToQZYTQTuI:nixos.org

Nix on macOS

1206 Members
“There are still many issues with the Darwin platform but most of it is quite usable.” — http://yves.gnu-darwin.org202 Servers

Load older messages


SenderMessageTime
16 Apr 2026
@esperlily:matrix.orgEsperLily [she/her] i haven't used flake-parts myself. looking at it right now, it has a whole perSystem thing and it looks like you're supposed to do something like perSystem = { config, pkgs, ... }: { packages.foo = pkgs.callPackage ./foo.nix {}; }? my inclination would be to figure out how you look up the current system (is it just pkgs.stdenv.hostPlatform.system or is there a better way to check, such as is it available just as an argument here?) and to then just conditionally expose a packages.aerospace-focus-fzf package depending on whether that system is darwin. something like perSystem = { lib, config, pkgs, ... }: { packages.${lib.optionalDrvAttr pkgs.stdenv.hostPlatform.isDarwin "aerospace-focus-fzf"} = aerospace-focus-fzf; } 09:26:49
@reckenrode:matrix.orgRandy EckenrodeI remember the previous discussion about hardening flags, so LGTM. I approved and added it to the merge queue.10:42:28
@xored:xored.lolxored I tried this with mkIf and some part of flake-parts was referencing the missing platform, I’m not sure what optionalDrv… does but I’ll try later 12:25:06
@reckenrode:matrix.orgRandy Eckenrode I second the suggestion to set meta.platforms to lib.platforms.darwin. That flakes allow packages to vary per system feels like a footgun. You’ll get a worse error message on unsupported platforms (i.e., Nix will complain about a missing attribute instead of telling you the platform is unsupported), and it adds complexity to the flake definition. 13:15:08
@reckenrode:matrix.orgRandy EckenrodeI can understand the motivation (avoiding the need to eval the package to determine supported platforms), but it makes the UX worse.13:18:05
@xored:xored.lolxoredthe 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 need how to have it behave properly to begin with17:36:53
@xored:xored.lolxoredand I have meta.badPlatforms on the arrs btw, nix screams on refusing to evaluate17:37:34
@xored:xored.lolxored* 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 with17:39:36
@esperlily:matrix.orgEsperLily [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:matrix.orgEsperLily [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:matrix.orgEsperLily [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:matrix.orgEsperLily [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:xored.lolxored 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:matrix.orgEsperLily [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:matrix.orgEsperLily [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:matrix.orgEsperLily [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:xored.lolxoredwhen i tried it back with mkIf I got option packages.aarch64-darwin.foo option was accessed but not defined kind of error19:47:30
@esperlily:matrix.orgEsperLily [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:xored.lolxoredyeah19:48:09
@xored:xored.lolxoredi'll try in a sec fixing my rust crap :P19:48:19
@xored:xored.lolxoredi meant crab, surely :kappa:19:48:25
@esperlily:matrix.orgEsperLily [she/her]that's what happens with a lazyAttrsOf when the element type doesn't define an empty value19:48:26
@esperlily:matrix.orgEsperLily [she/her]* that's what happens with a lazyAttrsOf when the element type doesn't define an empty value and you use mkIf19:48:40
@esperlily:matrix.orgEsperLily [she/her] but if you got it accessing packages.aarch64-darwin.foo then that means your mkIf condition was wrong 19:49:28
@esperlily:matrix.orgEsperLily [she/her] because that error should only show up when the mkIf condition evaluates to false 19:49:43
@esperlily:matrix.orgEsperLily [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:matrix.orgEsperLily [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:xored.lolxored EsperLily [she/her] Randy Eckenrode that seems to have worked, thank you both 20:09:41
@xored:xored.lolxored 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:xored.lolxoredbut for manual packages seems to have done the trick20:11:06

Show newer messages


Back to Room ListRoom Version: 6