diff options
-rw-r--r-- | Makefile | 12 | ||||
-rw-r--r-- | krebs/3modules/setuid.nix | 6 | ||||
-rw-r--r-- | krebs/4lib/types.nix | 13 | ||||
-rw-r--r-- | krebs/5pkgs/builders.nix | 113 | ||||
-rw-r--r-- | tv/2configs/xserver/default.nix | 4 | ||||
-rw-r--r-- | tv/5pkgs/xmonad-tv.nix | 25 |
6 files changed, 141 insertions, 32 deletions
@@ -48,6 +48,14 @@ $(if $(target_user),,$(error unbound variable: target_user)) $(if $(target_port),,$(error unbound variable: target_port)) $(if $(target_path),,$(error unbound variable: target_path)) +build = \ + nix-build \ + --no-out-link \ + --show-trace \ + -I nixos-config=$(nixos-config) \ + -I stockholm=$(stockholm) \ + -E "let build = import <stockholm>; in $(1)" + evaluate = \ nix-instantiate \ --eval \ @@ -74,6 +82,10 @@ deploy: env STOCKHOLM_VERSION="$$STOCKHOLM_VERSION" \ nixos-rebuild switch --show-trace -I $(target_path) +# usage: make build.pkgs.get +build build.:;@$(call build,$${expr-eval}) +build.%:;@$(call build,$@) + # usage: make LOGNAME=shared system=wolf eval.config.krebs.build.host.name eval eval.:;@$(call evaluate,$${expr-eval}) eval.%:;@$(call evaluate,$@) diff --git a/krebs/3modules/setuid.nix b/krebs/3modules/setuid.nix index cfb8382e8..65a4abe1c 100644 --- a/krebs/3modules/setuid.nix +++ b/krebs/3modules/setuid.nix @@ -20,6 +20,10 @@ let type = types.filename; default = config._module.args.name; }; + envp = mkOption { + type = types.attrsOf types.str; + default = {}; + }; filename = mkOption { type = mkOptionType { # TODO unyuck string and merge with toC @@ -57,7 +61,7 @@ let }; config.activate = let src = pkgs.execve config.name { - inherit (config) filename; + inherit (config) envp filename; }; dst = "${wrapperDir}/${config.name}"; in '' diff --git a/krebs/4lib/types.nix b/krebs/4lib/types.nix index 56d1d55c3..66191d0b3 100644 --- a/krebs/4lib/types.nix +++ b/krebs/4lib/types.nix @@ -286,6 +286,19 @@ types // rec { }; }; + haskell.conid = mkOptionType { + name = "Haskell constructor identifier"; + check = x: + isString x && match "[[:upper:]][[:lower:]_[:upper:]0-9']*" x != null; + merge = mergeOneOption; + }; + + haskell.modid = mkOptionType { + name = "Haskell module identifier"; + check = x: isString x && all haskell.conid.check (splitString "." x); + merge = mergeOneOption; + }; + # RFC952, B. Lexical grammar, <hname> hostname = mkOptionType { name = "hostname"; diff --git a/krebs/5pkgs/builders.nix b/krebs/5pkgs/builders.nix index 39b91d144..f60bbc9d0 100644 --- a/krebs/5pkgs/builders.nix +++ b/krebs/5pkgs/builders.nix @@ -1,4 +1,4 @@ -{ config, lib, pkgs, ... }: +{ config, pkgs, ... }: with config.krebs.lib; rec { execve = name: { filename, argv ? null, envp ? {}, destination ? "" }: let @@ -28,6 +28,21 @@ rec { execveBin = name: cfg: execve name (cfg // { destination = "/bin/${name}"; }); + writeBash = name: text: pkgs.writeScript name '' + #! ${pkgs.bash}/bin/bash + ${text} + ''; + + writeBashBin = name: text: pkgs.writeTextFile { + executable = true; + destination = "/bin/${name}"; + name = name; + text = '' + #! ${pkgs.bash}/bin/bash + ${text} + ''; + }; + writeC = name: { destination ? "" }: src: pkgs.runCommand name {} '' PATH=${makeBinPath (with pkgs; [ binutils @@ -66,50 +81,112 @@ rec { mv "$textPath" $out ''; - writeHaskellBin = + writeHaskell = k: let k' = parseDrvName k; name = k'.name; version = if k'.version != "" then k'.version else "0"; in - { build-depends ? ["base"] ++ depends - , depends ? [] + { base-depends ? ["base"] + , executables ? {} , ghc-options ? ["-Wall" "-O3" "-threaded" "-rtsopts"] , haskellPackages ? pkgs.haskellPackages + , library ? null , license ? "WTFPL" }: - main-text: let + isExecutable = executables != {}; + isLibrary = library != null; + cabal-file = pkgs.writeText "${name}-${version}.cabal" '' build-type: Simple cabal-version: >= 1.2 name: ${name} version: ${version} - - executable ${name} - build-depends: ${concatStringsSep "," build-depends} - ghc-options: ${toString ghc-options} - main-is: ${main-file.name} + ${concatStringsSep "\n" (mapAttrsToList exe-section executables)} + ${optionalString isLibrary (lib-section library)} ''; - main-file = pkgs.writeText "${name}-${version}.hs" main-text; + + exe-install = + exe-name: + { file ? pkgs.writeText "${name}-${exe-name}.hs" text + , relpath ? "${exe-name}.hs" + , text + , ... }: + if types.filename.check exe-name + then "install -D ${file} $out/${relpath}" + else throw "argument ‘exe-name’ is not a ${types.filename.name}"; + + exe-section = + exe-name: + { build-depends ? base-depends ++ extra-depends + , extra-depends ? [] + , file ? pkgs.writeText "${name}-${exe-name}.hs" text + , relpath ? "${exe-name}.hs" + , text + , ... }: '' + executable ${exe-name} + build-depends: ${concatStringsSep "," build-depends} + ghc-options: ${toString ghc-options} + main-is: ${relpath} + ''; + + get-depends = + { build-depends ? base-depends ++ extra-depends + , extra-depends ? [] + , ... + }: + build-depends; + + lib-install = + { exposed-modules + , ... }: + concatStringsSep "\n" (mapAttrsToList mod-install exposed-modules); + + lib-section = + { build-depends ? base-depends ++ extra-depends + , extra-depends ? [] + , exposed-modules + , ... }: '' + library + build-depends: ${concatStringsSep "," build-depends} + ghc-options: ${toString ghc-options} + exposed-modules: ${concatStringsSep "," (attrNames exposed-modules)} + ''; + + mod-install = + mod-name: + { file ? pkgs.writeText "${name}-${mod-name}.hs" text + , relpath ? "${replaceStrings ["."] ["/"] mod-name}.hs" + , text + , ... }: + if types.haskell.modid.check mod-name + then "install -D ${file} $out/${relpath}" + else throw "argument ‘mod-name’ is not a ${types.haskell.modid.name}"; in - haskellPackages.mkDerivation rec { - inherit license version; - executableHaskellDepends = attrVals build-depends haskellPackages; - isExecutable = true; - isLibrary = false; + haskellPackages.mkDerivation { + inherit isExecutable isLibrary license version; + executableHaskellDepends = + attrVals + (concatMap get-depends (attrValues executables)) + haskellPackages; + libraryHaskellDepends = + attrVals + (optionals isLibrary (get-depends library)) + haskellPackages; pname = name; src = pkgs.runCommand "${name}-${version}-src" {} '' install -D ${cabal-file} $out/${cabal-file.name} - install -D ${main-file} $out/${main-file.name} + ${optionalString isLibrary (lib-install library)} + ${concatStringsSep "\n" (mapAttrsToList exe-install executables)} ''; }; writeNixFromCabal = trace (toString [ "The function `writeNixFromCabal` has been deprecated in favour of" - "`writeHaskellBin'." + "`writeHaskell`." ]) (name: path: pkgs.runCommand name {} '' ${pkgs.cabal2nix}/bin/cabal2nix ${path} > $out diff --git a/tv/2configs/xserver/default.nix b/tv/2configs/xserver/default.nix index 965c3bbe1..c41c0a81e 100644 --- a/tv/2configs/xserver/default.nix +++ b/tv/2configs/xserver/default.nix @@ -74,8 +74,8 @@ in { }; serviceConfig = { SyslogIdentifier = "xmonad"; - ExecStart = "${pkgs.xmonad-tv}/bin/xmonad-tv"; - ExecStop = "${pkgs.xmonad-tv}/bin/xmonad-tv --shutdown"; + ExecStart = "${pkgs.xmonad-tv}/bin/xmonad"; + ExecStop = "${pkgs.xmonad-tv}/bin/xmonad --shutdown"; User = user.name; WorkingDirectory = user.home; }; diff --git a/tv/5pkgs/xmonad-tv.nix b/tv/5pkgs/xmonad-tv.nix index 74e43dc79..04e7e8359 100644 --- a/tv/5pkgs/xmonad-tv.nix +++ b/tv/5pkgs/xmonad-tv.nix @@ -1,14 +1,15 @@ { pkgs, ... }: -pkgs.writeHaskellBin "xmonad-tv" { - depends = [ - "containers" - "unix" - "X11" - "xmonad" - "xmonad-contrib" - "xmonad-stockholm" - ]; -} '' +pkgs.writeHaskell "xmonad-tv" { + executables.xmonad = { + extra-depends = [ + "containers" + "unix" + "X11" + "xmonad" + "xmonad-contrib" + "xmonad-stockholm" + ]; + text = '' {-# LANGUAGE DeriveDataTypeable #-} -- for XS {-# LANGUAGE FlexibleContexts #-} -- for xmonad' {-# LANGUAGE LambdaCase #-} @@ -299,4 +300,6 @@ wGSConfig = def allWorkspaceNames :: W.StackSet i l a sid sd -> X [i] allWorkspaceNames ws = return $ map W.tag (W.hidden ws) ++ [W.tag $ W.workspace $ W.current ws] -'' + ''; + }; +} |