From 218a8c4d9010538fc6b3d533b32142bb68f5e874 Mon Sep 17 00:00:00 2001
From: Robert Helgesson <robert@rycee.net>
Date: Sun, 16 Dec 2018 12:23:01 +0100
Subject: [PATCH] modules: support conditional module inclusion

Also make use of this functionality for the `programs.chromium`
module.

See #501
---
 modules/misc/news.nix |   4 +-
 modules/modules.nix   | 209 ++++++++++++++++++++++--------------------
 2 files changed, 112 insertions(+), 101 deletions(-)

diff --git a/modules/misc/news.nix b/modules/misc/news.nix
index e609cadb2..959485513 100644
--- a/modules/misc/news.nix
+++ b/modules/misc/news.nix
@@ -6,6 +6,8 @@ let
 
   cfg = config.news;
 
+  hostPlatform = pkgs.stdenv.hostPlatform;
+
   entryModule = types.submodule ({ config, ... }: {
     options = {
       id = mkOption {
@@ -734,7 +736,7 @@ in
 
       {
         time = "2018-08-19T20:46:09+00:00";
-        condition = pkgs.stdenv.isLinux;
+        condition = hostPlatform.isLinux;
         message = ''
           A new modules is available: 'programs.chromium'.
         '';
diff --git a/modules/modules.nix b/modules/modules.nix
index c3298d251..aa9c4583a 100644
--- a/modules/modules.nix
+++ b/modules/modules.nix
@@ -12,106 +12,115 @@ with lib;
 
 let
 
-  modules = [
-    ./accounts/email.nix
-    ./files.nix
-    ./home-environment.nix
-    ./manual.nix
-    ./misc/fontconfig.nix
-    ./misc/gtk.nix
-    ./misc/lib.nix
-    ./misc/news.nix
-    ./misc/nixpkgs.nix
-    ./misc/pam.nix
-    ./misc/qt.nix
-    ./misc/version.nix
-    ./misc/xdg.nix
-    ./programs/afew.nix
-    ./programs/alot.nix
-    ./programs/astroid.nix
-    ./programs/autorandr.nix
-    ./programs/bash.nix
-    ./programs/beets.nix
-    ./programs/browserpass.nix
-    ./programs/command-not-found/command-not-found.nix
-    ./programs/direnv.nix
-    ./programs/eclipse.nix
-    ./programs/emacs.nix
-    ./programs/feh.nix
-    ./programs/firefox.nix
-    ./programs/fish.nix
-    ./programs/fzf.nix
-    ./programs/git.nix
-    ./programs/gnome-terminal.nix
-    ./programs/go.nix
-    ./programs/home-manager.nix
-    ./programs/htop.nix
-    ./programs/info.nix
-    ./programs/jq.nix
-    ./programs/lesspipe.nix
-    ./programs/man.nix
-    ./programs/mbsync.nix
-    ./programs/mercurial.nix
-    ./programs/msmtp.nix
-    ./programs/neovim.nix
-    ./programs/newsboat.nix
-    ./programs/noti.nix
-    ./programs/notmuch.nix
-    ./programs/obs-studio.nix
-    ./programs/offlineimap.nix
-    ./programs/pidgin.nix
-    ./programs/rofi.nix
-    ./programs/ssh.nix
-    ./programs/taskwarrior.nix
-    ./programs/termite.nix
-    ./programs/texlive.nix
-    ./programs/tmux.nix
-    ./programs/urxvt.nix
-    ./programs/vim.nix
-    ./programs/vscode.nix
-    ./programs/zathura.nix
-    ./programs/zsh.nix
-    ./services/blueman-applet.nix
-    ./services/compton.nix
-    ./services/dunst.nix
-    ./services/flameshot.nix
-    ./services/gnome-keyring.nix
-    ./services/gpg-agent.nix
-    ./services/kbfs.nix
-    ./services/kdeconnect.nix
-    ./services/keepassx.nix
-    ./services/keybase.nix
-    ./services/mbsync.nix
-    ./services/mpd.nix
-    ./services/network-manager-applet.nix
-    ./services/nextcloud-client.nix
-    ./services/owncloud-client.nix
-    ./services/parcellite.nix
-    ./services/pasystray.nix
-    ./services/polybar.nix
-    ./services/random-background.nix
-    ./services/redshift.nix
-    ./services/screen-locker.nix
-    ./services/stalonetray.nix
-    ./services/status-notifier-watcher.nix
-    ./services/syncthing.nix
-    ./services/taffybar.nix
-    ./services/tahoe-lafs.nix
-    ./services/udiskie.nix
-    ./services/unclutter.nix
-    ./services/window-managers/awesome.nix
-    ./services/window-managers/i3.nix
-    ./services/window-managers/xmonad.nix
-    ./services/xscreensaver.nix
-    ./systemd.nix
-    ./xcursor.nix
-    ./xresources.nix
-    ./xsession.nix
-    <nixpkgs/nixos/modules/misc/assertions.nix>
-    <nixpkgs/nixos/modules/misc/meta.nix>
-  ]
-  ++
-  optional pkgs.stdenv.isLinux ./programs/chromium.nix;
+  hostPlatform = pkgs.stdenv.hostPlatform;
+
+  checkPlatform = any (meta.platformMatch pkgs.stdenv.hostPlatform);
+
+  loadModule = file: { condition ? true }: {
+    inherit file condition;
+  };
+
+  allModules = [
+    (loadModule ./accounts/email.nix { })
+    (loadModule ./files.nix { })
+    (loadModule ./home-environment.nix { })
+    (loadModule ./manual.nix { })
+    (loadModule ./misc/fontconfig.nix { })
+    (loadModule ./misc/gtk.nix { })
+    (loadModule ./misc/lib.nix { })
+    (loadModule ./misc/news.nix { })
+    (loadModule ./misc/nixpkgs.nix { })
+    (loadModule ./misc/pam.nix { })
+    (loadModule ./misc/qt.nix { })
+    (loadModule ./misc/version.nix { })
+    (loadModule ./misc/xdg.nix { })
+    (loadModule ./programs/afew.nix { })
+    (loadModule ./programs/alot.nix { })
+    (loadModule ./programs/astroid.nix { })
+    (loadModule ./programs/autorandr.nix { })
+    (loadModule ./programs/bash.nix { })
+    (loadModule ./programs/beets.nix { })
+    (loadModule ./programs/browserpass.nix { })
+    (loadModule ./programs/chromium.nix { condition = hostPlatform.isLinux; })
+    (loadModule ./programs/command-not-found/command-not-found.nix { })
+    (loadModule ./programs/direnv.nix { })
+    (loadModule ./programs/eclipse.nix { })
+    (loadModule ./programs/emacs.nix { })
+    (loadModule ./programs/feh.nix { })
+    (loadModule ./programs/firefox.nix { })
+    (loadModule ./programs/fish.nix { })
+    (loadModule ./programs/fzf.nix { })
+    (loadModule ./programs/git.nix { })
+    (loadModule ./programs/gnome-terminal.nix { })
+    (loadModule ./programs/go.nix { })
+    (loadModule ./programs/home-manager.nix { })
+    (loadModule ./programs/htop.nix { })
+    (loadModule ./programs/info.nix { })
+    (loadModule ./programs/jq.nix { })
+    (loadModule ./programs/lesspipe.nix { })
+    (loadModule ./programs/man.nix { })
+    (loadModule ./programs/mbsync.nix { })
+    (loadModule ./programs/mercurial.nix { })
+    (loadModule ./programs/msmtp.nix { })
+    (loadModule ./programs/neovim.nix { })
+    (loadModule ./programs/newsboat.nix { })
+    (loadModule ./programs/noti.nix { })
+    (loadModule ./programs/notmuch.nix { })
+    (loadModule ./programs/obs-studio.nix { })
+    (loadModule ./programs/offlineimap.nix { })
+    (loadModule ./programs/pidgin.nix { })
+    (loadModule ./programs/rofi.nix { })
+    (loadModule ./programs/ssh.nix { })
+    (loadModule ./programs/taskwarrior.nix { })
+    (loadModule ./programs/termite.nix { })
+    (loadModule ./programs/texlive.nix { })
+    (loadModule ./programs/tmux.nix { })
+    (loadModule ./programs/urxvt.nix { })
+    (loadModule ./programs/vim.nix { })
+    (loadModule ./programs/vscode.nix { })
+    (loadModule ./programs/zathura.nix { })
+    (loadModule ./programs/zsh.nix { })
+    (loadModule ./services/blueman-applet.nix { })
+    (loadModule ./services/compton.nix { })
+    (loadModule ./services/dunst.nix { })
+    (loadModule ./services/flameshot.nix { })
+    (loadModule ./services/gnome-keyring.nix { })
+    (loadModule ./services/gpg-agent.nix { })
+    (loadModule ./services/kbfs.nix { })
+    (loadModule ./services/kdeconnect.nix { })
+    (loadModule ./services/keepassx.nix { })
+    (loadModule ./services/keybase.nix { })
+    (loadModule ./services/mbsync.nix { })
+    (loadModule ./services/mpd.nix { })
+    (loadModule ./services/network-manager-applet.nix { })
+    (loadModule ./services/nextcloud-client.nix { })
+    (loadModule ./services/owncloud-client.nix { })
+    (loadModule ./services/parcellite.nix { })
+    (loadModule ./services/pasystray.nix { })
+    (loadModule ./services/polybar.nix { })
+    (loadModule ./services/random-background.nix { })
+    (loadModule ./services/redshift.nix { })
+    (loadModule ./services/screen-locker.nix { })
+    (loadModule ./services/stalonetray.nix { })
+    (loadModule ./services/status-notifier-watcher.nix { })
+    (loadModule ./services/syncthing.nix { })
+    (loadModule ./services/taffybar.nix { })
+    (loadModule ./services/tahoe-lafs.nix { })
+    (loadModule ./services/udiskie.nix { })
+    (loadModule ./services/unclutter.nix { })
+    (loadModule ./services/window-managers/awesome.nix { })
+    (loadModule ./services/window-managers/i3.nix { })
+    (loadModule ./services/window-managers/xmonad.nix { })
+    (loadModule ./services/xscreensaver.nix { })
+    (loadModule ./systemd.nix { })
+    (loadModule ./xcursor.nix { })
+    (loadModule ./xresources.nix { })
+    (loadModule ./xsession.nix { })
+    (loadModule <nixpkgs/nixos/modules/misc/assertions.nix> { })
+    (loadModule <nixpkgs/nixos/modules/misc/meta.nix> { })
+  ];
+
+  modules = map (getAttr "file") (filter (getAttr "condition") allModules);
 
   pkgsModule = {
     options.nixosSubmodule = mkOption {