Add getFile and getWay to Environment.
authorAndrey Mokhov <andrey.mokhov@gmail.com>
Tue, 16 Jun 2015 06:48:23 +0000 (07:48 +0100)
committerAndrey Mokhov <andrey.mokhov@gmail.com>
Tue, 16 Jun 2015 06:48:23 +0000 (07:48 +0100)
doc/meeting-16-June-2015.txt
src/Expression.hs
src/Targets.hs
src/UserSettings.hs

index a407bb9..bd2b94f 100644 (file)
@@ -11,7 +11,9 @@ what we expose to users?). Can be made into a conditional expression
 similar to userWays, userPackages and userSettings, but is it worth it?\r
 \r
 * knownPackages (Targets.hs) -- fix by adding knownUserPackages? A nasty\r
-import cycle is then created between Targets.hs and UserSettings.hs\r
+import cycle is then created between Targets.hs and UserSettings.hs. Possible\r
+solution: add file Settings/Targets.hs which will actually put two things\r
+together similar to what's done with userWays, userPackages and userSettings.\r
 \r
 * integerLibraryImpl (Switches.hs) -- fix by having three integer library\r
 packages in Targets.hs and choosing which one to build in userPackages, e.g.:\r
@@ -25,10 +27,15 @@ there should only be one place for user to look: UserSettings.hs.
 \r
 ================================================\r
 \r
-2. When predicates are moved from configuration files to UserSettings we\r
-no longer track their state in oracles. This may lead to inconsistent\r
-state of the build system. A more general problem: how do we accurately\r
-track changes in the build systems, specifically in UserSettings.hs?\r
+2. When predicates (e.g. buildHaddock) are moved from configuration files to\r
+UserSettings we no longer track their state in oracles. This may lead to an\r
+inconsistent state of the build system. This is a special case of a more general\r
+problem: how do we accurately track changes in the build system, specifically\r
+in UserSettings.hs? Although in general this is a hard problem, this special\r
+case may be easier to solve: just channel everything exported from\r
+UserSettings.hs through oracles? Another alternative which was discussed\r
+previously: pass the final lists of arguments through oracles. Care must\r
+be taken though as final command lines can be as large as 5Mb!\r
 \r
 ================================================\r
 \r
@@ -40,15 +47,15 @@ complete build though.)
 \r
 4. I'd like interpret/interpretDiff to be total functions. It should be\r
 possible to check at compile which questions a given environment can\r
-answer and raise an error if an expression needs to know more.\r
+answer and raise a *compile* error if the expression needs to know more.\r
 \r
 For example, consider an environment envS that can only answer 'getStage'\r
 question, and environment envSP that can answer questions 'getStage' and\r
 'getPackage'. Now consider two expressions\r
 \r
-exprS = stage0 ? foo\r
+exprS = stage0 ? arg "foo"\r
 \r
-exprSP = stage0 ? package base ? bar\r
+exprSP = stage0 ? package base ? arg "bar"\r
 \r
 Now I'd like the following to produce a compile error:\r
 \r
@@ -61,23 +68,41 @@ interpret envSP exprS
 interpret envSP exprSP\r
 \r
 I played with some possible solutions using type classes, but they all\r
-seem clumsy/heavy.\r
+seem clumsy/heavy, e.g. carrying (GetStage env, GetPackage env) constraints\r
+with any expression similar to exprSP.\r
 \r
-Hence, for now I have:\r
+Right now I have:\r
 \r
 data Environment = Environment\r
      {\r
         getStage   :: Stage,\r
+        getPackage :: Package,\r
         getBuilder :: Builder,\r
-        getPackage :: Package\r
+        getFile    :: FilePath,\r
+        getWay     :: Way\r
      }\r
 \r
 defaultEnvironment :: Environment\r
 defaultEnvironment = Environment\r
     {\r
         getStage   = error "Stage not set in the environment",\r
+        getPackage = error "Package not set in the environment",\r
         getBuilder = error "Builder not set in the environment",\r
-        getPackage = error "Package not set in the environment"\r
-    } \r
+        getFile    = error "File not set in the environment",\r
+        getWay     = error "Way not set in the environment"\r
+    }\r
+\r
+which is annoying and leads to many partial functions all over the build\r
+system. Haskell should be above that!\r
+\r
+Any ideas? Having\r
+\r
+(GetStage env, GetPackage env, GetBuilder env, ...) => DiffExpr env\r
+\r
+all over the build system seems unsatisfactory.\r
+\r
+Note, environment is (always?) built in the following order: getStage,\r
+getPackage, getBuilder, getFile, getWay. Hence, it may be OK to have only\r
+6 combinations of getters in a type constraint, not 2^5, e.g.: empty,\r
+GetStage env, (GetStage env, GetPackage env), etc.\r
 \r
-which leads to a lot of partial functions all over the build system.
\ No newline at end of file
index a0c3bf0..9232aed 100644 (file)
@@ -8,7 +8,7 @@ module Expression (
     Environment (..), defaultEnvironment,
     append, appendM, remove, appendSub, appendSubD, filterSub, removeSub,
     interpret, interpretDiff,
-    applyPredicate, (?), (??), stage, builder, package,
+    applyPredicate, (?), (??), stage, package, builder, file, way,
     configKeyValue, configKeyValues
     ) where
 
@@ -22,9 +22,10 @@ import Control.Monad.Reader
 data Environment = Environment
      {
         getStage   :: Stage,
+        getPackage :: Package,
         getBuilder :: Builder,
-        getPackage :: Package
-        -- getWay  :: Way, and maybe something else will be useful later
+        getFile    :: FilePath,
+        getWay     :: Way
      }
 
 -- TODO: all readers are currently partial functions. Can use type classes to
@@ -33,8 +34,10 @@ defaultEnvironment :: Environment
 defaultEnvironment = Environment
     {
         getStage   = error "Stage not set in the environment",
+        getPackage = error "Package not set in the environment",
         getBuilder = error "Builder not set in the environment",
-        getPackage = error "Package not set in the environment"
+        getFile    = error "File not set in the environment",
+        getWay     = error "Way not set in the environment"
     }
 
 type Expr a = ReaderT Environment Action a
@@ -128,11 +131,17 @@ p ?? (t, f) = p ? t <> (liftM not p) ? f
 stage :: Stage -> Predicate
 stage s = liftM (s ==) (asks getStage)
 
+package :: Package -> Predicate
+package p = liftM (p ==) (asks getPackage)
+
 builder :: Builder -> Predicate
 builder b = liftM (b ==) (asks getBuilder)
 
-package :: Package -> Predicate
-package p = liftM (p ==) (asks getPackage)
+file :: FilePattern -> Predicate
+file f = liftM (f ?==) (asks getFile)
+
+way :: Way -> Predicate
+way w = liftM (w ==) (asks getWay)
 
 configKeyValue :: String -> String -> Predicate
 configKeyValue key value = liftM (value ==) (lift $ askConfig key)
index 2c61152..4bbb963 100644 (file)
@@ -2,6 +2,7 @@ module Targets (
     targetDirectory,
     knownPackages,
     customPackageSettings,
+    integerLibraryName,
     array, base, binPackageDb, binary, bytestring, cabal, compiler, containers,
     deepseq, directory, filepath, ghcPrim, haskeline, hoopl, hpc,
     integerLibrary, parallel, pretty, primitive, process, stm, templateHaskell,
index 378db1c..3cbf136 100644 (file)
@@ -1,6 +1,5 @@
 module UserSettings (
     userSettings, userPackages, userWays,
-
     buildHaddock, validating
     ) where
 
@@ -36,9 +35,24 @@ validating = return False
 -- Examples:
 userSettings' :: Settings
 userSettings' = mconcat
-    [ package compiler     ? stage0 ? arg "foo"
-    , builder (Ghc Stage0) ? remove ["-O2"]
-    , builder GhcCabal     ? removeSub "--configure-option=CFLAGS" ["-Werror"] ]
+    [ package base           ?
+      builder GhcCabal       ? arg ("--flags=" ++ integerLibraryName)
+
+    , package integerLibrary ? appendCcArgs ["-Ilibraries/integer-gmp2/gmp"]
+
+    , windowsHost            ?
+      package integerLibrary ?
+      builder GhcCabal       ? arg "--configure-option=--with-intree-gmp"
+
+    , package compiler       ?
+      stage0                 ?
+      way profiling          ?
+      file "pattern.*"       ? args ["foo", "bar"]
+
+    , builder (Ghc Stage0)   ? remove ["-O2"]
+
+    , builder GhcCabal       ? removeSub "--configure-option=CFLAGS" ["-Werror"]
+    ]
 
 userPackages' :: Packages
 userPackages' = mconcat