diff --git a/pkgs/build-support/usernixos/activation.nix b/pkgs/build-support/usernixos/activation.nix new file mode 100644 index 000000000000..2e3f0af2bf77 --- /dev/null +++ b/pkgs/build-support/usernixos/activation.nix @@ -0,0 +1,26 @@ +{ pkgs, config, ... }: + +let + script = pkgs.writeScriptBin "usernixos" ('' + #!${pkgs.bash}/bin/bash + '' + config.activationContents); +in +with pkgs.lib; +{ + options = { + activation = mkOption { + default = {}; + }; + + activationContents = mkOption { + default = ""; + internal = true; + merge = concatStringsSep "\n"; + description = '' + Commands to run at activation + ''; + }; + }; + + config.activation.toplevel = script; +} diff --git a/pkgs/build-support/usernixos/bashrc.nix b/pkgs/build-support/usernixos/bashrc.nix new file mode 100644 index 000000000000..1860f4b2e89c --- /dev/null +++ b/pkgs/build-support/usernixos/bashrc.nix @@ -0,0 +1,59 @@ +# Generator for .bashrc +{pkgs, config, ...}: + +with pkgs.lib; + +let + bashrcFile = pkgs.writeScript "bashrc" config.bashrc.contents; + cfg = config.bashrc; +in +{ + options = { + environment.editor = mkOption { + default = "${pkgs.vim}/bin/vim"; + type = types.string; + description = '' + Editor + ''; + }; + + bashrc = { + enable = mkOption { + default = false; + type = types.bool; + description = '' + Enable of .bashrc generation on activation + ''; + }; + + destination = mkOption { + default = "~/.bashrc"; + type = types.string; + description = '' + The symlink that will point to the generated bashrc at activation time + ''; + }; + + contents = mkOption { + default = ""; + type = types.string; + merge = concatStringsSep "\n"; + description = '' + Enable of .bashrc generation on activation + ''; + }; + }; + }; + + config.bashrc.contents = '' + export EDITOR="${config.environment.editor}" + ''; + + config.activationContents = mkIf cfg.enable '' + if [ -e "${cfg.destination}" ]; then + echo Cannot set "${cfg.destination}", it exists + exit 1 + fi + ln -sf ${bashrcFile} "${cfg.destination}" + ''; +} diff --git a/pkgs/build-support/usernixos/eval-config.nix b/pkgs/build-support/usernixos/eval-config.nix new file mode 100644 index 000000000000..300ddd2444e5 --- /dev/null +++ b/pkgs/build-support/usernixos/eval-config.nix @@ -0,0 +1,31 @@ +{ system ? builtins.currentSystem +, pkgs ? null +, baseModules ? import ./module-list.nix +, extraArgs ? {} +, modules +}: + +let extraArgs_ = extraArgs; pkgs_ = pkgs; system_ = system; in + +rec { + + # These are the NixOS modules that constitute the system configuration. + configComponents = modules ++ baseModules; + + # Merge the option definitions in all modules, forming the full + # system configuration. It's not checked for undeclared options. + systemModule = + pkgs.lib.fixMergeModules configComponents extraArgs; + + optionDefinitions = systemModule.config; + optionDeclarations = systemModule.options; + inherit (systemModule) options; + + # These are the extra arguments passed to every module. In + # particular, Nixpkgs is passed through the "pkgs" argument. + extraArgs = extraArgs_ // { + inherit pkgs modules baseModules; + }; + + config = systemModule.config; +} diff --git a/pkgs/build-support/usernixos/module-list.nix b/pkgs/build-support/usernixos/module-list.nix new file mode 100644 index 000000000000..2aa5329940bd --- /dev/null +++ b/pkgs/build-support/usernixos/module-list.nix @@ -0,0 +1,4 @@ +[ + ./activation.nix + ./bashrc.nix +] diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 00b810a64394..1299081d5167 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -353,6 +353,16 @@ let inherit pkgs lib; }; + usernixos = let + configmodule = getConfig [ "usernixos" ] null; + eval = (import ../build-support/usernixos/eval-config.nix) { + inherit pkgs system; + modules = [ configmodule ]; + }; + in + assert configmodule != null; + eval.config.activation.toplevel; + platforms = import ./platforms.nix;