Refactoring: Target is now defined in Target.hs, old Targets.hs is dropped.
authorAndrey Mokhov <andrey.mokhov@gmail.com>
Tue, 14 Jul 2015 12:56:52 +0000 (13:56 +0100)
committerAndrey Mokhov <andrey.mokhov@gmail.com>
Tue, 14 Jul 2015 12:56:52 +0000 (13:56 +0100)
src/Expression.hs
src/Settings.hs
src/Settings/Default.hs [moved from src/Targets.hs with 69% similarity]
src/Settings/GhcCabal.hs
src/Settings/Packages.hs
src/Settings/TargetDirectory.hs
src/Settings/User.hs [moved from src/UserSettings.hs with 87% similarity]
src/Settings/Ways.hs
src/Target.hs [new file with mode: 0644]

index c219579..c18b0ac 100644 (file)
@@ -1,12 +1,10 @@
-{-# LANGUAGE DeriveGeneric #-}
 {-# LANGUAGE NoImplicitPrelude, FlexibleInstances #-}
 module Expression (
-    module Control.Monad.Reader,
+    module Target,
     module Data.Monoid,
+    module Control.Monad.Reader,
     Expr, DiffExpr, fromDiffExpr,
-    Predicate,
-    Settings, Ways, Packages,
-    Target (..), stageTarget, stagePackageTarget,
+    Predicate, Settings, Ways, Packages,
     append, appendM, remove, appendSub, appendSubD, filterSub, removeSub,
     interpret, interpretExpr,
     applyPredicate, (?), (??), stage, package, builder, file, way,
@@ -15,58 +13,12 @@ module Expression (
 
 import Base hiding (arg, args, Args, TargetDir)
 import Ways
+import Target
 import Oracles
 import Package
 import Data.Monoid
-import Development.Shake.Classes
-import GHC.Generics
 import Control.Monad.Reader
 
--- Target captures parameters relevant to the current build target: Stage and
--- Package being built, Builder that is to be invoked, file(s) that are to
--- be built and the Way they are to be built.
-data Target = Target
-     {
-        getStage   :: Stage,
-        getPackage :: Package,
-        getBuilder :: Builder,
-        getFile    :: FilePath, -- TODO: handle multple files?
-        getWay     :: Way
-     }
-     deriving (Eq, Generic)
-
--- Shows a target as "package:file@stage (builder, way)"
-instance Show Target where
-    show target = show (getPackage target)
-                  ++ ":" ++ show (getFile target)
-                  ++ "@" ++ show (getStage target)
-                  ++ " (" ++ show (getBuilder target)
-                  ++ ", " ++ show (getWay target) ++ ")"
-
-instance Binary Target
-instance NFData Target
-instance Hashable Target
-
-stageTarget :: Stage -> Target
-stageTarget stage = Target
-    {
-        getStage   = stage,
-        getPackage = error "stageTarget: Package not set",
-        getBuilder = error "stageTarget: Builder not set",
-        getFile    = error "stageTarget: File not set",
-        getWay     = error "stageTarget: Way not set"
-    }
-
-stagePackageTarget :: Stage -> Package -> Target
-stagePackageTarget stage package = Target
-    {
-        getStage   = stage,
-        getPackage = package,
-        getBuilder = error "stagePackageTarget: Builder not set",
-        getFile    = error "stagePackageTarget: File not set",
-        getWay     = error "stagePackageTarget: Way not set"
-    }
-
 -- Expr a is a computation that produces a value of type Action a and can read
 -- parameters of the current build Target.
 type Expr a = ReaderT Target Action a
index a021bc3..3f711a5 100644 (file)
@@ -5,7 +5,7 @@ module Settings (
 import Base hiding (arg, args)
 import Settings.GhcPkg
 import Settings.GhcCabal
-import UserSettings
+import Settings.User
 import Expression hiding (when, liftIO)
 
 settings :: Settings
similarity index 69%
rename from src/Targets.hs
rename to src/Settings/Default.hs
index 12635b2..77fd3fc 100644 (file)
@@ -1,13 +1,13 @@
-module Targets (
-    defaultTargetDirectory,
+module Settings.Default (
+    defaultTargetDirectory, defaultKnownPackages,
+
     array, base, binPackageDb, binary, bytestring, cabal, compiler, containers,
-    deepseq, directory, filepath, ghcPrim, haskeline, hoopl, hpc,
-    integerGmp, integerGmp2, integerSimple,
-    parallel, pretty, primitive, process, stm, templateHaskell,
-    terminfo, time, transformers, unix, win32, xhtml
+    deepseq, directory, filepath, ghcPrim, haskeline, hoopl, hpc, integerGmp,
+    integerGmp2, integerSimple, parallel, pretty, primitive, process, stm,
+    templateHaskell, terminfo, time, transformers, unix, win32, xhtml
     ) where
 
-import Base hiding (arg, args)
+import Base
 import Package
 
 -- Build results will be placed into a target directory with the following
@@ -21,6 +21,19 @@ defaultTargetDirectory stage package
     | stage   == Stage0   = "dist-boot"
     | otherwise           = "dist-install"
 
+-- These are all packages we know about. Build rules will be generated for
+-- all of them. However, not all of these packages will be built. For example,
+-- package 'win32' is built only on Windows.
+-- Settings/Packages.hs defines default conditions for building each package,
+-- which can be overridden in UserSettings.hs.
+defaultKnownPackages :: [Package]
+defaultKnownPackages =
+    [ array, base, binPackageDb, binary, bytestring, cabal, compiler
+    , containers, deepseq, directory, filepath, ghcPrim, haskeline
+    , hoopl, hpc, integerGmp, integerGmp2, integerSimple, parallel
+    , pretty, primitive, process, stm, templateHaskell, terminfo, time
+    , transformers, unix, win32, xhtml ]
+
 -- Package definitions
 array           = library  "array"
 base            = library  "base"
index 578c264..56da007 100644 (file)
@@ -8,14 +8,13 @@ import Oracles.Builder
 import Ways
 import Util
 import Package
-import Targets
 import Switches
 import Expression hiding (liftIO)
+import Settings.User
 import Settings.Ways
 import Settings.Util
 import Settings.Packages
 import Settings.TargetDirectory
-import UserSettings
 
 cabalSettings :: Settings
 cabalSettings = builder GhcCabal ? do
index 8d90e62..7eaa5d5 100644 (file)
@@ -4,10 +4,9 @@ module Settings.Packages (
 
 import Base
 import Package
-import Targets
 import Switches
 import Expression
-import UserSettings
+import Settings.User
 
 -- Combining default list of packages with user modifications
 packages :: Packages
@@ -33,17 +32,5 @@ packagesStage1 = mconcat
     , notWindowsHost ? append [unix]
     , buildHaddock   ? append [xhtml] ]
 
--- These are all packages we know about. Build rules will be generated for
--- all of them. However, not all of these packages will be built. For example,
--- package 'win32' is built only on Windows.
--- Settings/Packages.hs defines default conditions for building each package,
--- which can be overridden in UserSettings.hs.
 knownPackages :: [Package]
 knownPackages = defaultKnownPackages ++ userKnownPackages
-
-defaultKnownPackages :: [Package]
-defaultKnownPackages =
-    [ array, base, binPackageDb, binary, bytestring, cabal, compiler
-    , containers, deepseq, directory, filepath, ghcPrim, haskeline
-    , hoopl, hpc, integerLibrary, parallel, pretty, primitive, process
-    , stm, templateHaskell, terminfo, time, transformers, unix, win32, xhtml ]
index d8eb067..2b14a77 100644 (file)
@@ -4,7 +4,7 @@ module Settings.TargetDirectory (
 
 import Base
 import Package
-import UserSettings
+import Settings.User
 
 -- User can override the default target directory settings given below
 targetDirectory :: Stage -> Package -> FilePath
similarity index 87%
rename from src/UserSettings.hs
rename to src/Settings/User.hs
index d48d561..35e47bd 100644 (file)
@@ -1,4 +1,5 @@
-module UserSettings (
+module Settings.User (
+    module Settings.Default,
     userSettings, userPackages, userWays, userTargetDirectory,
     userKnownPackages, integerLibrary,
     buildHaddock, validating
@@ -6,7 +7,7 @@ module UserSettings (
 
 import Base hiding (arg, args, Args)
 import Package
-import Targets
+import Settings.Default
 import Expression
 
 -- No user-specific settings by default
@@ -26,7 +27,7 @@ userKnownPackages = []
 userWays :: Ways
 userWays = mempty
 
--- Control where build results go
+-- Control where build results go (see Settings.Default for an example)
 userTargetDirectory :: Stage -> Package -> FilePath
 userTargetDirectory = defaultTargetDirectory
 
index 8a35d5b..fd9422f 100644 (file)
@@ -6,7 +6,7 @@ import Base
 import Ways hiding (defaultWays)
 import Switches
 import Expression
-import UserSettings
+import Settings.User
 
 -- Combining default ways with user modifications
 ways :: Ways
diff --git a/src/Target.hs b/src/Target.hs
new file mode 100644 (file)
index 0000000..ba47421
--- /dev/null
@@ -0,0 +1,57 @@
+{-# LANGUAGE DeriveGeneric #-}
+module Target (
+    Target (..), stageTarget, stagePackageTarget
+    ) where
+
+import Base
+import Ways
+import Oracles
+import Package
+import GHC.Generics
+import Development.Shake.Classes
+
+-- Target captures parameters relevant to the current build target: Stage and
+-- Package being built, Builder that is to be invoked, file(s) that are to
+-- be built and the Way they are to be built.
+data Target = Target
+     {
+        getStage   :: Stage,
+        getPackage :: Package,
+        getBuilder :: Builder,
+        getFile    :: FilePath, -- TODO: handle multple files?
+        getWay     :: Way
+     }
+     deriving (Eq, Generic)
+
+-- Shows a target as "package:file@stage (builder, way)"
+instance Show Target where
+    show target = show (getPackage target)
+                  ++ ":" ++ show (getFile target)
+                  ++ "@" ++ show (getStage target)
+                  ++ " (" ++ show (getBuilder target)
+                  ++ ", " ++ show (getWay target) ++ ")"
+
+stageTarget :: Stage -> Target
+stageTarget stage = Target
+    {
+        getStage   = stage,
+        getPackage = error "stageTarget: Package not set",
+        getBuilder = error "stageTarget: Builder not set",
+        getFile    = error "stageTarget: File not set",
+        getWay     = error "stageTarget: Way not set"
+    }
+
+stagePackageTarget :: Stage -> Package -> Target
+stagePackageTarget stage package = Target
+    {
+        getStage   = stage,
+        getPackage = package,
+        getBuilder = error "stagePackageTarget: Builder not set",
+        getFile    = error "stagePackageTarget: File not set",
+        getWay     = error "stagePackageTarget: Way not set"
+    }
+
+-- Instances for storing Target in the Shake database
+instance Binary Target
+instance NFData Target
+instance Hashable Target