1
1
mirror of https://github.com/nmattia/snack.git synced 2024-09-11 11:55:36 +03:00

Source nixpkgs from snack.nix

This commit is contained in:
Nicolas Mattia 2018-10-01 21:30:30 +03:00
parent c21ab0b58c
commit 20a242f592
10 changed files with 125 additions and 15 deletions

View File

@ -10,7 +10,7 @@
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeFamilies #-}
module Main where
module Main (main) where
import Control.Applicative
import Control.Monad
@ -66,7 +66,13 @@ mkPackageNix :: FilePath -> IO PackageNix
mkPackageNix = fmap PackageNix . canonicalizePath
-- | Like a FilePath, but Nix friendly
newtype SnackLib = SnackLib { unSnackLib :: FilePath }
newtype SnackNix = SnackNix { _unSnackNix :: FilePath }
mkSnackNix :: FilePath -> IO SnackNix
mkSnackNix = fmap SnackNix . canonicalizePath
-- | Like a FilePath, but Nix friendly
newtype SnackLib = SnackLib { _unSnackLib :: FilePath }
mkSnackLib :: FilePath -> IO SnackLib
mkSnackLib = fmap SnackLib . canonicalizePath
@ -87,6 +93,7 @@ type SnackConfigRaw = SnackConfig_ 'ConfigRaw
-- | Extra configuration for snack
data SnackConfig_ c = SnackConfig
{ snackLib :: Config c (Maybe FilePath) (Maybe SnackLib)
, snackNix :: Maybe (Config c FilePath SnackNix)
, snackNixCfg :: NixConfig
}
@ -107,6 +114,7 @@ type Options = Options_ 'ConfigReady
data Options_ c = Options
{ snackConfig :: SnackConfig_ c
-- , snackNix :: Maybe (Config c FilePath SnackNix)
, mode :: Mode_ c
, command :: Command
}
@ -125,6 +133,7 @@ prepareSnackConfig raw =
Nothing -> pure Nothing
Just fp -> Just <$> mkSnackLib fp
) <*>
(forM (snackNix raw) mkSnackNix) <*>
pure (snackNixCfg raw)
parseNixConfig :: Opts.Parser NixConfig
@ -152,6 +161,12 @@ parseSnackConfig = SnackConfig <$> Opts.optional
)
)
) <*>
Opts.optional (
Opts.strOption
(Opts.long "snack-nix"
<> Opts.short 'b'
<> Opts.metavar "PATH")
) <*>
parseNixConfig
parseMode :: Opts.Parser ModeRaw
@ -176,10 +191,16 @@ parseOptions :: Opts.Parser OptionsRaw
parseOptions =
Options <$>
parseSnackConfig <*>
-- Opts.optional (
-- Opts.strOption
-- (Opts.long "snack-nix"
-- <> Opts.short 'b'
-- <> Opts.metavar "PATH")
-- ) <*>
parseMode <*>
parseCommand
newtype ModuleName = ModuleName { unModuleName :: T.Text }
newtype ModuleName = ModuleName { _unModuleName :: T.Text }
deriving newtype (Ord, Eq, Aeson.FromJSONKey)
deriving stock Show
@ -215,12 +236,12 @@ instance FromJSON GhciBuild where
-- The kinds of builds: library, executable, or a mix of both (currently only
-- for HPack)
newtype LibraryBuild = LibraryBuild
{ unLibraryBuild :: Map.Map ModuleName NixPath }
{ _unLibraryBuild :: Map.Map ModuleName NixPath }
deriving newtype FromJSON
deriving stock Show
newtype ExecutableBuild = ExecutableBuild
{ exePath :: NixPath }
{ _exePath :: NixPath }
deriving stock Show
instance FromJSON ExecutableBuild where
@ -228,7 +249,7 @@ instance FromJSON ExecutableBuild where
ExecutableBuild <$> o .: "exe_path"
data MultiBuild = MultiBuild
{ librayBuild :: Maybe LibraryBuild
{ _librayBuild :: Maybe LibraryBuild
, executableBuilds :: Map.Map T.Text ExecutableBuild
}
deriving stock Show
@ -251,7 +272,7 @@ data NixArgType
newtype NixExpr = NixExpr { unNixExpr :: T.Text }
newtype NixPath = NixPath { unNixPath :: T.Text }
newtype NixPath = NixPath { _unNixPath :: T.Text }
deriving newtype FromJSON
deriving stock Show
@ -268,11 +289,7 @@ nixBuild snackCfg extraNixArgs nixExpr =
{ #{ intercalate "," funArgs } }:
let
spec = builtins.fromJSON specJson;
pkgsSrc = (builtins.fetchTarball
{ url = "https://github.com/${spec.owner}/${spec.repo}/archive/${spec.rev}.tar.gz";
sha256 = spec.sha256;
});
pkgs = import pkgsSrc {};
pkgs = import #{ pkgsSrc } {};
libDir = #{ libDir };
snack = (import libDir) { inherit pkgs; };
in #{ T.unpack $ unNixExpr $ nixExpr }
@ -280,6 +297,17 @@ nixBuild snackCfg extraNixArgs nixExpr =
"nix-build"
cliArgs
where
pkgsSrc :: String
pkgsSrc = case snackNix snackCfg of
Just (SnackNix fp) ->
[i|(import #{ fp }).pkgs|]
Nothing ->
[i|
(builtins.fetchTarball
{ url = "https://github.com/${spec.owner}/${spec.repo}/archive/${spec.rev}.tar.gz";
sha256 = spec.sha256;
})
|]
libDir :: String
libDir = case snackLib snackCfg of
Just (SnackLib fp) -> fp
@ -417,9 +445,6 @@ runStdin1 stin p args = do
[out] -> pure out
xs -> throwIO $ userError $ "unexpected output: " <> show xs
run_ :: S.FilePath -> [T.Text] -> Sh ()
run_ p args = void $ run p args
specJson :: T.Text
specJson = $(embedStringFile "spec.json")

View File

@ -0,0 +1 @@
hello

View File

@ -0,0 +1,24 @@
{}:
let
spec = builtins.fromJSON (builtins.readFile ../../../nix/nixpkgs/nixpkgs-src.json);
nixpkgs =
(builtins.fetchTarball
{ url = "https://github.com/${spec.owner}/${spec.repo}/archive/${spec.rev}.tar.gz";
sha256 = spec.sha256;
});
in
import nixpkgs
{ overlays =
[
(self: super:
{ haskellPackages = super.haskellPackages.extend
(super.haskell.lib.packageSourceOverrides
{ something-that-doesnt-exist =
self.lib.cleanSource ./extra-hs;
}
);
}
)
];
}

View File

@ -0,0 +1,4 @@
module Something where
foo :: String
foo = "hello"

View File

@ -0,0 +1,13 @@
name: something-that-doesnt-exist
version: 1.0.0.1
description: Foo Bar
license: MIT
author: Nicolas Mattia
maintainer: nicolas@nmattia.com
build-type: Simple
cabal-version: >=1.2
library
build-depends: base >= 3 && < 5
exposed-modules: Something
ghc-options: -Wall

View File

@ -0,0 +1,7 @@
{ main = "Foo";
src = ./src;
dependencies = [
"conduit"
"something-that-doesnt-exist"
];
}

View File

@ -0,0 +1,8 @@
name: snack-packages-test
dependencies:
- conduit
- something-that-doesnt-exist
executable:
main: Foo.hs
source-dirs: src

View File

@ -0,0 +1,3 @@
{
pkgs = ./nix;
}

View File

@ -0,0 +1,4 @@
import qualified Something
main :: IO ()
main = putStrLn Something.foo

21
tests/extended-config/test Executable file
View File

@ -0,0 +1,21 @@
#!/usr/bin/env bash
# vim: ft=sh sw=2 et
set -euo pipefail
test() {
$SNACK build
$SNACK run | diff golden -
TMP_FILE=$(mktemp)
capture_io "$TMP_FILE" main | $SNACK ghci
diff golden $TMP_FILE
rm $TMP_FILE
}
SNACK="snack -j4 -b snack.nix -s package.nix" test
SNACK="snack -j4 -b snack.nix" test
SNACK="snack -j4 -b snack.nix --package-yaml package.yaml" test