{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE DataKinds #-} {-# LANGUAGE TypeApplications #-} module Derivation where import Control.Monad.IO.Class (liftIO) import Data.Text (Text) import Nix.Derivation (Derivation(..), DerivationOutput(..)) import System.Nix.StorePath (StorePath, storePathToText) import System.Nix.Store.Remote (MonadStore, addToStore, addTextToStore) import System.Nix.Hash (HashAlgorithm(SHA256)) import qualified Data.Map import qualified Data.Set import qualified Data.Text import qualified Data.Text.Lazy import qualified Data.Text.Lazy.Builder import qualified Data.Vector import qualified System.Nix.Derivation import qualified System.Nix.StorePath import qualified System.Directory drvSample :: StorePath -> StorePath -> StorePath -> Derivation StorePath Text drvSample builder' buildScript out = Derivation { outputs = Data.Map.fromList [ ("out", DerivationOutput out "sha256" "test") ] , inputDrvs = Data.Map.fromList [ (builder', Data.Set.fromList [ "out" ]) ] , inputSrcs = Data.Set.fromList [ buildScript ] , platform = "x86_64-linux" , builder = storePathToText builder' , args = Data.Vector.fromList ["-e", storePathToText buildScript ] , env = Data.Map.fromList [("testEnv", "true")] } withBash :: (StorePath -> MonadStore a) -> MonadStore a withBash action = do mfp <- liftIO $ System.Directory.findExecutable "bash" case mfp of Nothing -> error "No bash executable found" Just fp -> do let Right n = System.Nix.StorePath.makeStorePathName "bash" pth <- addToStore @'SHA256 n fp False (pure True) False action pth withBuildScript :: (StorePath -> MonadStore a) -> MonadStore a withBuildScript action = do pth <- addTextToStore "buildScript" (Data.Text.concat [ "declare -xp", "export > $out" ]) mempty False action pth withDerivation :: (StorePath -> Derivation StorePath Text -> MonadStore a) -> MonadStore a withDerivation action = withBuildScript $ \buildScript -> withBash $ \bash -> do outputPath <- addTextToStore "wannabe-output" "" mempty False let d = drvSample bash buildScript outputPath pth <- addTextToStore "hnix-store-derivation" (Data.Text.Lazy.toStrict $ Data.Text.Lazy.Builder.toLazyText $ System.Nix.Derivation.buildDerivation d ) mempty False liftIO $ print d action pth d