@@ -7,23 +7,23 @@ import Control.Exception ( bracket )
7import Control.Lens
7import Control.Lens
8import Data.Maybe ( fromMaybe )
8import Data.Maybe ( fromMaybe )
9import qualified Data.Set as Set
9import qualified Data.Set as Set
10+import qualified Distribution.Compat.ReadP as P
10import Distribution.Compiler
11import Distribution.Compiler
11import Distribution.Nixpkgs.Fetch
12import Distribution.Nixpkgs.Fetch
12import Distribution.Nixpkgs.Haskell
13import Distribution.Nixpkgs.Haskell
13import Distribution.Nixpkgs.Haskell.FromCabal
14import Distribution.Nixpkgs.Haskell.FromCabal
15+import Distribution.Nixpkgs.Haskell.PackageSourceSpec
14import Distribution.Nixpkgs.Meta
16import Distribution.Nixpkgs.Meta
15import Distribution.PackageDescription ( FlagName(..), FlagAssignment )
17import Distribution.PackageDescription ( FlagName(..), FlagAssignment )
16import Distribution.Simple.Utils ( lowercase )
18import Distribution.Simple.Utils ( lowercase )
17import Distribution.System
19import Distribution.System
18−import Distribution.Text ( display, simpleParse )
20+import Distribution.Text
19import Language.Nix
21import Language.Nix
20import Options.Applicative
22import Options.Applicative
21import Paths_cabal2nix ( version )
23import Paths_cabal2nix ( version )
22import System.IO ( hFlush, stdout, stderr )
24import System.IO ( hFlush, stdout, stderr )
23import qualified Text.PrettyPrint.ANSI.Leijen as P2 hiding ( (<$>), (<>) )
25import qualified Text.PrettyPrint.ANSI.Leijen as P2 hiding ( (<$>), (<>) )
24import Text.PrettyPrint.HughesPJClass ( Doc, Pretty(..), text, vcat, hcat, semi )
26import Text.PrettyPrint.HughesPJClass ( Doc, Pretty(..), text, vcat, hcat, semi )
25−-- import Text.Show.Pretty
26−import Distribution.Nixpkgs.Haskell.PackageSourceSpec
28data Options = Options
28data Options = Options
29 { optSha256 :: Maybe String
29 { optSha256 :: Maybe String
@@ -41,7 +41,8 @@ data Options = Options
41 , optHackageDb :: Maybe FilePath
41 , optHackageDb :: Maybe FilePath
42 , optNixShellOutput :: Bool
42 , optNixShellOutput :: Bool
43 , optFlags :: [String]
43 , optFlags :: [String]
44− , optCompilerId :: Maybe String
44+ , optCompiler :: CompilerId
45+ , optSystem :: Platform
45 , optUrl :: String
46 , optUrl :: String
47 deriving (Show)
48 deriving (Show)
@@ -63,9 +64,21 @@ options = Options
63 <*> optional (strOption $ long "hackage-db" <> metavar "PATH" <> help "path to the local hackage db in tar format")
64 <*> optional (strOption $ long "hackage-db" <> metavar "PATH" <> help "path to the local hackage db in tar format")
64 <*> switch (long "shell" <> help "generate output suitable for nix-shell")
65 <*> switch (long "shell" <> help "generate output suitable for nix-shell")
65 <*> many (strOption $ short 'f' <> long "flag" <> help "Cabal flag (may be specified multiple times)")
66 <*> many (strOption $ short 'f' <> long "flag" <> help "Cabal flag (may be specified multiple times)")
66− <*> optional (strOption $ long "compiler-id" <> help "Compiler identifier to use when evaluating cabal file")
67+ <*> option (readP parse) (long "compiler" <> help "compiler to use when evaluating the Cabal file" <> value buildCompilerId <> showDefaultWith display)
68+ <*> option (readP parsePlatform) (long "system" <> help "target system to use when evaluating the Cabal file" <> value buildPlatform <> showDefaultWith display)
67 <*> strArgument (metavar "URI")
69 <*> strArgument (metavar "URI")
71+readP :: P.ReadP a a -> ReadM a
72+readP p = eitherReader $ \s -> case [ r' | (r',"") <- P.readP_to_S p s ] of
74+ _ -> Left ("invalid value " ++ show s)
76+parsePlatform :: P.ReadP r Platform
77+parsePlatform = do arch <- P.choice [P.string "i686" >> return I386, P.string "x86_64" >> return X86_64]
79+ os <- P.choice [P.string "linux" >> return Linux, P.string "darwin" >> return OSX]
80+ return (Platform arch os)
69pinfo :: ParserInfo Options
82pinfo :: ParserInfo Options
70pinfo = info
83pinfo = info
@@ -100,14 +113,11 @@ main = bracket (return ()) (\() -> hFlush stdout >> hFlush stderr) $ \() -> do
100 pkg <- getPackage optHackageDb $ Source optUrl (fromMaybe "" optRevision) (maybe UnknownHash Guess optSha256)
113 pkg <- getPackage optHackageDb $ Source optUrl (fromMaybe "" optRevision) (maybe UnknownHash Guess optSha256)
103− compilerId :: CompilerId
104− compilerId = fromMaybe buildCompilerId (optCompilerId >>= simpleParse)
106 deriv :: Derivation
116 deriv :: Derivation
107 deriv = fromGenericPackageDescription (const True)
117 deriv = fromGenericPackageDescription (const True)
108 (\i -> Just (binding # (i, path # [i])))
118 (\i -> Just (binding # (i, path # [i])))
109− buildPlatform
119+ optSystem
110− (unknownCompilerInfo compilerId NoAbiTag)
120+ (unknownCompilerInfo optCompiler NoAbiTag)
111 (readFlagList optFlags)
121 (readFlagList optFlags)
113 (pkgCabal pkg)
123 (pkgCabal pkg)