Reputation: 754
I would like to write my nixos-configuration and home-manager-configuration files in a way that they work on both NixOs (linux) and MacOs (darwin).
While some things are configured the same way on both systems (eg git) other only make sense on one of them (like wayland-windowmanagers being only a thing on linux).
Nix-language features if-else-statements, so now all I need is a way to find out what kind of system I am on.
What I am after is something like:
wayland.sway.enable = if (os == "MacOs") then false else true;
Is there a way to find out what system I am on in nix?
Upvotes: 10
Views: 5708
Reputation: 754
I (independently) found a similar answer to that one of to @robert-hensing. So here it is for completeness sake:
The following config will install "hello" on MacOs and "tree" on other systems.
{ config, pkgs, ... }:
let
my_packages = if pkgs.system == "x86_64-darwin"
then [ pkgs.hello ]
else [ pkgs.tree ];
in
{
environment.systemPackages = my_packages;
}
You can find your pkgs.system string by running nix repl '<nixpkgs>'
and then just enter system
.
Upvotes: 10
Reputation: 7379
In a NixOS module, you can do this:
{ config, lib, pkgs, ... }:
{
wayland.sway.enable = if pkgs.stdenv.isLinux then true else false;
# or if you want to be more specific
wayland.sway.enable = if pkgs.system == "x86_64-linux" then true else false;
# or if you want to use the default otherwise
# this works for any option type
wayland.sway.enable = lib.mkIf pkgs.stdenv.isLinux true;
}
However, I prefer to factor the configuration into modules and then only imports
the ones I need.
darwin-configuration.nix
{ ... }:
{
imports = [ ./common-configuration.nix ];
launchd.something.something = "...";
}
And for NixOS:
configuration.nix
{ ... }:
{
imports = [ ./common-configuration.nix ];
wayland.sway.enable = true;
}
Upvotes: 3