mirror of
https://github.com/nmattia/snack.git
synced 2024-09-17 14:47:12 +03:00
Source nixpkgs from snack.nix
This commit is contained in:
parent
c21ab0b58c
commit
20a242f592
55
bin/Snack.hs
55
bin/Snack.hs
@ -10,7 +10,7 @@
|
|||||||
{-# LANGUAGE DataKinds #-}
|
{-# LANGUAGE DataKinds #-}
|
||||||
{-# LANGUAGE TypeFamilies #-}
|
{-# LANGUAGE TypeFamilies #-}
|
||||||
|
|
||||||
module Main where
|
module Main (main) where
|
||||||
|
|
||||||
import Control.Applicative
|
import Control.Applicative
|
||||||
import Control.Monad
|
import Control.Monad
|
||||||
@ -66,7 +66,13 @@ mkPackageNix :: FilePath -> IO PackageNix
|
|||||||
mkPackageNix = fmap PackageNix . canonicalizePath
|
mkPackageNix = fmap PackageNix . canonicalizePath
|
||||||
|
|
||||||
-- | Like a FilePath, but Nix friendly
|
-- | 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 :: FilePath -> IO SnackLib
|
||||||
mkSnackLib = fmap SnackLib . canonicalizePath
|
mkSnackLib = fmap SnackLib . canonicalizePath
|
||||||
@ -87,6 +93,7 @@ type SnackConfigRaw = SnackConfig_ 'ConfigRaw
|
|||||||
-- | Extra configuration for snack
|
-- | Extra configuration for snack
|
||||||
data SnackConfig_ c = SnackConfig
|
data SnackConfig_ c = SnackConfig
|
||||||
{ snackLib :: Config c (Maybe FilePath) (Maybe SnackLib)
|
{ snackLib :: Config c (Maybe FilePath) (Maybe SnackLib)
|
||||||
|
, snackNix :: Maybe (Config c FilePath SnackNix)
|
||||||
, snackNixCfg :: NixConfig
|
, snackNixCfg :: NixConfig
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -107,6 +114,7 @@ type Options = Options_ 'ConfigReady
|
|||||||
|
|
||||||
data Options_ c = Options
|
data Options_ c = Options
|
||||||
{ snackConfig :: SnackConfig_ c
|
{ snackConfig :: SnackConfig_ c
|
||||||
|
-- , snackNix :: Maybe (Config c FilePath SnackNix)
|
||||||
, mode :: Mode_ c
|
, mode :: Mode_ c
|
||||||
, command :: Command
|
, command :: Command
|
||||||
}
|
}
|
||||||
@ -125,6 +133,7 @@ prepareSnackConfig raw =
|
|||||||
Nothing -> pure Nothing
|
Nothing -> pure Nothing
|
||||||
Just fp -> Just <$> mkSnackLib fp
|
Just fp -> Just <$> mkSnackLib fp
|
||||||
) <*>
|
) <*>
|
||||||
|
(forM (snackNix raw) mkSnackNix) <*>
|
||||||
pure (snackNixCfg raw)
|
pure (snackNixCfg raw)
|
||||||
|
|
||||||
parseNixConfig :: Opts.Parser NixConfig
|
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
|
parseNixConfig
|
||||||
|
|
||||||
parseMode :: Opts.Parser ModeRaw
|
parseMode :: Opts.Parser ModeRaw
|
||||||
@ -176,10 +191,16 @@ parseOptions :: Opts.Parser OptionsRaw
|
|||||||
parseOptions =
|
parseOptions =
|
||||||
Options <$>
|
Options <$>
|
||||||
parseSnackConfig <*>
|
parseSnackConfig <*>
|
||||||
|
-- Opts.optional (
|
||||||
|
-- Opts.strOption
|
||||||
|
-- (Opts.long "snack-nix"
|
||||||
|
-- <> Opts.short 'b'
|
||||||
|
-- <> Opts.metavar "PATH")
|
||||||
|
-- ) <*>
|
||||||
parseMode <*>
|
parseMode <*>
|
||||||
parseCommand
|
parseCommand
|
||||||
|
|
||||||
newtype ModuleName = ModuleName { unModuleName :: T.Text }
|
newtype ModuleName = ModuleName { _unModuleName :: T.Text }
|
||||||
deriving newtype (Ord, Eq, Aeson.FromJSONKey)
|
deriving newtype (Ord, Eq, Aeson.FromJSONKey)
|
||||||
deriving stock Show
|
deriving stock Show
|
||||||
|
|
||||||
@ -215,12 +236,12 @@ instance FromJSON GhciBuild where
|
|||||||
-- The kinds of builds: library, executable, or a mix of both (currently only
|
-- The kinds of builds: library, executable, or a mix of both (currently only
|
||||||
-- for HPack)
|
-- for HPack)
|
||||||
newtype LibraryBuild = LibraryBuild
|
newtype LibraryBuild = LibraryBuild
|
||||||
{ unLibraryBuild :: Map.Map ModuleName NixPath }
|
{ _unLibraryBuild :: Map.Map ModuleName NixPath }
|
||||||
deriving newtype FromJSON
|
deriving newtype FromJSON
|
||||||
deriving stock Show
|
deriving stock Show
|
||||||
|
|
||||||
newtype ExecutableBuild = ExecutableBuild
|
newtype ExecutableBuild = ExecutableBuild
|
||||||
{ exePath :: NixPath }
|
{ _exePath :: NixPath }
|
||||||
deriving stock Show
|
deriving stock Show
|
||||||
|
|
||||||
instance FromJSON ExecutableBuild where
|
instance FromJSON ExecutableBuild where
|
||||||
@ -228,7 +249,7 @@ instance FromJSON ExecutableBuild where
|
|||||||
ExecutableBuild <$> o .: "exe_path"
|
ExecutableBuild <$> o .: "exe_path"
|
||||||
|
|
||||||
data MultiBuild = MultiBuild
|
data MultiBuild = MultiBuild
|
||||||
{ librayBuild :: Maybe LibraryBuild
|
{ _librayBuild :: Maybe LibraryBuild
|
||||||
, executableBuilds :: Map.Map T.Text ExecutableBuild
|
, executableBuilds :: Map.Map T.Text ExecutableBuild
|
||||||
}
|
}
|
||||||
deriving stock Show
|
deriving stock Show
|
||||||
@ -251,7 +272,7 @@ data NixArgType
|
|||||||
|
|
||||||
newtype NixExpr = NixExpr { unNixExpr :: T.Text }
|
newtype NixExpr = NixExpr { unNixExpr :: T.Text }
|
||||||
|
|
||||||
newtype NixPath = NixPath { unNixPath :: T.Text }
|
newtype NixPath = NixPath { _unNixPath :: T.Text }
|
||||||
deriving newtype FromJSON
|
deriving newtype FromJSON
|
||||||
deriving stock Show
|
deriving stock Show
|
||||||
|
|
||||||
@ -268,11 +289,7 @@ nixBuild snackCfg extraNixArgs nixExpr =
|
|||||||
{ #{ intercalate "," funArgs } }:
|
{ #{ intercalate "," funArgs } }:
|
||||||
let
|
let
|
||||||
spec = builtins.fromJSON specJson;
|
spec = builtins.fromJSON specJson;
|
||||||
pkgsSrc = (builtins.fetchTarball
|
pkgs = import #{ pkgsSrc } {};
|
||||||
{ url = "https://github.com/${spec.owner}/${spec.repo}/archive/${spec.rev}.tar.gz";
|
|
||||||
sha256 = spec.sha256;
|
|
||||||
});
|
|
||||||
pkgs = import pkgsSrc {};
|
|
||||||
libDir = #{ libDir };
|
libDir = #{ libDir };
|
||||||
snack = (import libDir) { inherit pkgs; };
|
snack = (import libDir) { inherit pkgs; };
|
||||||
in #{ T.unpack $ unNixExpr $ nixExpr }
|
in #{ T.unpack $ unNixExpr $ nixExpr }
|
||||||
@ -280,6 +297,17 @@ nixBuild snackCfg extraNixArgs nixExpr =
|
|||||||
"nix-build"
|
"nix-build"
|
||||||
cliArgs
|
cliArgs
|
||||||
where
|
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 :: String
|
||||||
libDir = case snackLib snackCfg of
|
libDir = case snackLib snackCfg of
|
||||||
Just (SnackLib fp) -> fp
|
Just (SnackLib fp) -> fp
|
||||||
@ -417,9 +445,6 @@ runStdin1 stin p args = do
|
|||||||
[out] -> pure out
|
[out] -> pure out
|
||||||
xs -> throwIO $ userError $ "unexpected output: " <> show xs
|
xs -> throwIO $ userError $ "unexpected output: " <> show xs
|
||||||
|
|
||||||
run_ :: S.FilePath -> [T.Text] -> Sh ()
|
|
||||||
run_ p args = void $ run p args
|
|
||||||
|
|
||||||
specJson :: T.Text
|
specJson :: T.Text
|
||||||
specJson = $(embedStringFile "spec.json")
|
specJson = $(embedStringFile "spec.json")
|
||||||
|
|
||||||
|
1
tests/extended-config/golden
Normal file
1
tests/extended-config/golden
Normal file
@ -0,0 +1 @@
|
|||||||
|
hello
|
24
tests/extended-config/nix/default.nix
Normal file
24
tests/extended-config/nix/default.nix
Normal 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;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
)
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
4
tests/extended-config/nix/extra-hs/Something.hs
Normal file
4
tests/extended-config/nix/extra-hs/Something.hs
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
module Something where
|
||||||
|
|
||||||
|
foo :: String
|
||||||
|
foo = "hello"
|
@ -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
|
7
tests/extended-config/package.nix
Normal file
7
tests/extended-config/package.nix
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
{ main = "Foo";
|
||||||
|
src = ./src;
|
||||||
|
dependencies = [
|
||||||
|
"conduit"
|
||||||
|
"something-that-doesnt-exist"
|
||||||
|
];
|
||||||
|
}
|
8
tests/extended-config/package.yaml
Normal file
8
tests/extended-config/package.yaml
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
name: snack-packages-test
|
||||||
|
dependencies:
|
||||||
|
- conduit
|
||||||
|
- something-that-doesnt-exist
|
||||||
|
|
||||||
|
executable:
|
||||||
|
main: Foo.hs
|
||||||
|
source-dirs: src
|
3
tests/extended-config/snack.nix
Normal file
3
tests/extended-config/snack.nix
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
pkgs = ./nix;
|
||||||
|
}
|
4
tests/extended-config/src/Foo.hs
Normal file
4
tests/extended-config/src/Foo.hs
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
import qualified Something
|
||||||
|
|
||||||
|
main :: IO ()
|
||||||
|
main = putStrLn Something.foo
|
21
tests/extended-config/test
Executable file
21
tests/extended-config/test
Executable 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
|
Loading…
Reference in New Issue
Block a user