1
0
Fork 0
nixos-config/overlays/writeHaskellScript.nix

81 lines
3.1 KiB
Nix
Raw Normal View History

2020-05-27 13:20:08 +00:00
self: super: {
haskellList = list: ''["${builtins.concatStringsSep ''", "'' list}"]'';
2020-06-05 22:42:41 +00:00
writeHaskellScript = { name ? "haskell-script", bins ? [ ], imports ? [ ] }:
2020-05-27 13:20:08 +00:00
code:
self.writers.makeBinWriter {
compileScript = ''
cp $contentPath ${name}.hs
2020-06-05 22:42:41 +00:00
${self.scriptGhc}/bin/ghc ${name}.hs -threaded -Wall -Wno-unused-top-binds -Wno-missing-signatures -Wno-type-defaults -Wno-unused-imports -Werror
2020-05-27 13:20:08 +00:00
mv ${name} $out
${self.binutils-unwrapped}/bin/strip --strip-unneeded "$out"
'';
} "/bin/${name}" ''
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ExtendedDefaultRules #-}
{-# LANGUAGE MultiWayIf #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE ViewPatterns #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE TupleSections #-}
2020-10-19 13:32:40 +00:00
{-# LANGUAGE PartialTypeSignatures #-}
2020-05-27 13:20:08 +00:00
import Shh
import Relude
import Say
import qualified Relude.Unsafe as Unsafe
import qualified Data.ByteString.Lazy as LBS
import qualified Data.ByteString as BS
import qualified Data.Text as Text
2020-12-16 18:26:20 +00:00
import System.Environment (getArgs, setEnv)
2020-05-27 13:20:08 +00:00
import Control.Exception (bracket, try)
import Data.String.Interpolate (i)
import Control.Concurrent.Async
${builtins.concatStringsSep "\n" (map (x: "import ${x}") imports)}
-- Load binaries from Nix packages. The dependencies will be captured
-- in the closure.
loadFromBins (${
self.haskellList
(builtins.map toString (bins ++ [ self.coreutils self.nix ]))
} :: [String])
getNivPath :: Text -> Text -> IO Text
getNivPath sources channel = do
2020-12-07 02:41:46 +00:00
let expression = [i|(import #{sources}/nix/sources.nix)."#{channel}"|] :: String
2020-05-27 13:20:08 +00:00
nix_build ["-Q", "-E", expression, "--no-out-link"] &> devNull
escaped <- nix_instantiate ["--eval" :: String, "-E", [i|toString #{expression}|]] |> captureTrim
pure . Text.dropAround ('"' ==) . decodeUtf8 . trim $ escaped
2020-12-07 03:12:07 +00:00
aNixPath :: Text -> Text -> Text -> IO [String]
aNixPath homeManagerChannel nixpkgsChannel path = concat <$> mapM getNivAssign
[("home-manager", homeManagerChannel),
("nixpkgs", nixpkgsChannel),
("nixos-unstable", "nixos-unstable")]
2020-05-27 13:20:08 +00:00
where
tag name str = ["-I", [i|#{name :: Text}=#{str :: Text}|]] :: [String]
2020-12-07 02:05:57 +00:00
getNivAssign (name, repo) = tag name <$> getNivPath path repo
2020-05-27 13:20:08 +00:00
2020-12-07 03:12:07 +00:00
myNixPath :: Text -> IO [String]
myNixPath = aNixPath "${self.home-manager-channel}" "${self.nixpkgs-channel}"
2020-10-12 00:33:25 +00:00
buildSystemParams :: [String]
buildSystemParams = ["<nixpkgs/nixos>", "-A", "system"]
2020-10-01 00:32:51 +00:00
remoteBuildParams :: [String]
2020-10-07 12:30:19 +00:00
remoteBuildParams = ["--builders", "@/etc/nix/machines", "--max-jobs", "1"]
2020-10-01 00:32:51 +00:00
2020-05-27 13:20:08 +00:00
main :: IO ()
${code}
'';
get-niv-path = self.writeHaskellScript { name = "get-niv-path"; } ''
main = do
[sources, channel] <- fmap toText <$> getArgs
path <- getNivPath sources channel
say path
'';
}