From 0370472e390d23539367cea47d98a0a730abf9eb Mon Sep 17 00:00:00 2001 From: Oleg Grenrus Date: Wed, 1 Jun 2016 12:09:19 +0300 Subject: [PATCH] Print dependencies version in --version --- Setup.hs | 53 +++++++++++++++++++++++++- src/Options/Applicative/Complicated.hs | 4 +- src/main/Main.hs | 2 + stack.cabal | 2 +- 4 files changed, 57 insertions(+), 4 deletions(-) diff --git a/Setup.hs b/Setup.hs index 9a994af677..d8bf58d917 100644 --- a/Setup.hs +++ b/Setup.hs @@ -1,2 +1,51 @@ -import Distribution.Simple -main = defaultMain +module Main (main) where + +import Data.List ( nub, sortBy ) +import Data.Ord ( comparing ) +import Data.Version ( showVersion ) +import Distribution.Package ( PackageName(PackageName), PackageId, InstalledPackageId, packageVersion, packageName ) +import Distribution.PackageDescription ( PackageDescription(), TestSuite(..), Executable(..) ) +import Distribution.Simple ( defaultMainWithHooks, UserHooks(..), simpleUserHooks ) +import Distribution.Simple.Utils ( rewriteFile, createDirectoryIfMissingVerbose ) +import Distribution.Simple.BuildPaths ( autogenModulesDir ) +import Distribution.Simple.Setup ( BuildFlags(buildVerbosity), fromFlag ) +import Distribution.Simple.LocalBuildInfo ( withLibLBI, withTestLBI, withExeLBI, LocalBuildInfo(), ComponentLocalBuildInfo(componentPackageDeps) ) +import Distribution.Verbosity ( Verbosity ) +import System.FilePath ( () ) + +main :: IO () +main = defaultMainWithHooks simpleUserHooks + { buildHook = \pkg lbi hooks flags -> do + generateBuildModule (fromFlag (buildVerbosity flags)) pkg lbi + buildHook simpleUserHooks pkg lbi hooks flags + } + +generateBuildModule :: Verbosity -> PackageDescription -> LocalBuildInfo -> IO () +generateBuildModule verbosity pkg lbi = do + let dir = autogenModulesDir lbi + createDirectoryIfMissingVerbose verbosity True dir + withLibLBI pkg lbi $ \_ libcfg -> do + withTestLBI pkg lbi $ \suite clbi -> + rewriteFile (dir "Build_" ++ testName suite ++ ".hs") $ unlines + [ "module Build_" ++ testName suite ++ " where" + , "" + , "autogen_dir :: String" + , "autogen_dir = " ++ show dir + , "" + , "deps :: [String]" + , "deps = " ++ (show $ formatdeps (testDeps libcfg clbi)) + ] + withExeLBI pkg lbi $ \exe clbi -> + rewriteFile (dir "Build_" ++ exeName exe ++ ".hs") $ unlines + [ "module Build_" ++ exeName exe ++ " where" + , "" + , "deps :: [String]" + , "deps = " ++ (show $ formatdeps (testDeps libcfg clbi)) + ] + where + formatdeps = map formatone . sortBy (comparing unPackageName') . map snd + formatone p = unPackageName' p ++ "-" ++ showVersion (packageVersion p) + unPackageName' p = case packageName p of PackageName n -> n + +testDeps :: ComponentLocalBuildInfo -> ComponentLocalBuildInfo -> [(InstalledPackageId, PackageId)] +testDeps xs ys = nub $ componentPackageDeps xs ++ componentPackageDeps ys diff --git a/src/Options/Applicative/Complicated.hs b/src/Options/Applicative/Complicated.hs index 31ea150acc..eef3d82c2a 100644 --- a/src/Options/Applicative/Complicated.hs +++ b/src/Options/Applicative/Complicated.hs @@ -30,6 +30,8 @@ complicatedOptions -> Maybe String -- ^ version string -> String + -- ^ dependencies list + -> String -- ^ hpack numeric version, as string -> String -- ^ header @@ -43,7 +45,7 @@ complicatedOptions -> EitherT b (Writer (Mod CommandFields (b,a))) () -- ^ commands (use 'addCommand') -> IO (a,b) -complicatedOptions numericVersion versionString numericHpackVersion h pd commonParser mOnFailure commandParser = +complicatedOptions numericVersion versionString depsString numericHpackVersion h pd commonParser mOnFailure commandParser = do args <- getArgs (a,(b,c)) <- case execParserPure (prefs noBacktrack) parser args of Failure _ | null args -> withArgs ["--help"] (execParser parser) diff --git a/src/main/Main.hs b/src/main/Main.hs index 3a582f4d2d..eb7ac0e38f 100644 --- a/src/main/Main.hs +++ b/src/main/Main.hs @@ -11,6 +11,7 @@ module Main (main) where +import qualified Build_stack import Control.Exception import qualified Control.Exception.Lifted as EL import Control.Monad hiding (mapM, forM) @@ -181,6 +182,7 @@ commandLineHandler commandLineHandler progName isInterpreter = complicatedOptions Meta.version (Just versionString') + ("Compiled with:\n" ++ unlines (map ("- " ++) Build_stack.deps)) VERSION_hpack "stack - The Haskell Tool Stack" "" diff --git a/stack.cabal b/stack.cabal index fecc19fe18..a0fb31101f 100644 --- a/stack.cabal +++ b/stack.cabal @@ -11,7 +11,7 @@ license-file: LICENSE author: Commercial Haskell SIG maintainer: manny@fpcomplete.com category: Development -build-type: Simple +build-type: Custom cabal-version: >=1.10 homepage: http://haskellstack.org extra-source-files: CONTRIBUTING.md