[commit: ghc] wip/nfs-locking: Simplify and refactor moduleFiles oracle. (3d9c2fd)
git at git.haskell.org
git at git.haskell.org
Fri Oct 27 00:22:53 UTC 2017
Repository : ssh://git@git.haskell.org/ghc
On branch : wip/nfs-locking
Link : http://ghc.haskell.org/trac/ghc/changeset/3d9c2fdaf006a7aada8454295469cc5d8aa23938/ghc
>---------------------------------------------------------------
commit 3d9c2fdaf006a7aada8454295469cc5d8aa23938
Author: Andrey Mokhov <andrey.mokhov at gmail.com>
Date: Thu Feb 25 23:15:18 2016 +0000
Simplify and refactor moduleFiles oracle.
See #210.
>---------------------------------------------------------------
3d9c2fdaf006a7aada8454295469cc5d8aa23938
src/Oracles/ModuleFiles.hs | 31 ++++++++++++++++++-------------
src/Rules/Dependencies.hs | 3 ++-
src/Rules/Documentation.hs | 3 ++-
src/Settings.hs | 16 +---------------
4 files changed, 23 insertions(+), 30 deletions(-)
diff --git a/src/Oracles/ModuleFiles.hs b/src/Oracles/ModuleFiles.hs
index cf33e20..4c74265 100644
--- a/src/Oracles/ModuleFiles.hs
+++ b/src/Oracles/ModuleFiles.hs
@@ -1,12 +1,12 @@
{-# LANGUAGE DeriveDataTypeable, GeneralizedNewtypeDeriving, ScopedTypeVariables #-}
module Oracles.ModuleFiles (
- moduleFiles, haskellModuleFiles, moduleFilesOracle, findModuleFiles
+ moduleFiles, haskellSources, moduleFilesOracle, findModuleFiles
) where
import Base
import Context
+import Expression
import Oracles.PackageData
-import Package
import Settings.Paths
newtype ModuleFilesKey = ModuleFilesKey ([FilePath], [String])
@@ -14,11 +14,12 @@ newtype ModuleFilesKey = ModuleFilesKey ([FilePath], [String])
moduleFiles :: Context -> Action [FilePath]
moduleFiles context @ Context {..} = do
- let path = contextPath context
+ let path = contextPath context
+ autogen = path -/- "build/autogen"
srcDirs <- fmap sort . pkgDataList $ SrcDirs path
modules <- fmap sort . pkgDataList $ Modules path
let dirs = [ pkgPath package -/- dir | dir <- srcDirs ]
- fmap catMaybes $ findModuleFiles dirs modules
+ catMaybes <$> findModuleFiles (autogen : dirs) modules
haskellModuleFiles :: Context -> Action ([FilePath], [String])
haskellModuleFiles context @ Context {..} = do
@@ -28,19 +29,23 @@ haskellModuleFiles context @ Context {..} = do
srcDirs <- fmap sort . pkgDataList $ SrcDirs path
modules <- fmap sort . pkgDataList $ Modules path
let dirs = [ pkgPath package -/- dir | dir <- srcDirs ]
- foundSrcDirs <- findModuleFiles dirs modules
- foundAutogen <- findModuleFiles [autogen] modules
- found <- sequence $ zipWith3 addSources modules foundSrcDirs foundAutogen
-
+ found <- findModuleFiles (autogen : dirs) modules
let missingMods = map fst . filter (isNothing . snd) $ zip modules found
otherFileToMod = replaceEq '/' '.' . dropExtension . dropPkgPath
(haskellFiles, otherFiles) = partition ("//*hs" ?==) $ catMaybes found
-
return (haskellFiles, missingMods ++ map otherFileToMod otherFiles)
- where
- addSources _ Nothing r = return r
- addSources _ l Nothing = return l
- addSources m (Just f1) (Just f2) = errorMultipleSources m f1 f2
+
+-- | Find all Haskell source files for the current context
+haskellSources :: Context -> Action [FilePath]
+haskellSources context = do
+ let buildPath = contextPath context -/- "build"
+ autogen = buildPath -/- "autogen"
+ (found, missingMods) <- haskellModuleFiles context
+ -- Generated source files live in buildPath and have extension "hs"...
+ let generated = [ buildPath -/- (replaceEq '.' '/' m) <.> "hs" | m <- missingMods ]
+ -- ...except that GHC/Prim.hs lives in autogen. TODO: fix the inconsistency?
+ fixGhcPrim = replaceEq (buildPath -/- "GHC/Prim.hs") (autogen -/- "GHC/Prim.hs")
+ return $ found ++ fixGhcPrim generated
-- | This is an important oracle whose role is to find and cache module source
-- files. More specifically, it takes a list of directories @dirs@ and a sorted
diff --git a/src/Rules/Dependencies.hs b/src/Rules/Dependencies.hs
index 16d2c0e..04cffc2 100644
--- a/src/Rules/Dependencies.hs
+++ b/src/Rules/Dependencies.hs
@@ -5,6 +5,7 @@ import Development.Shake.Util (parseMakefile)
import Base
import Context
import Expression
+import Oracles.ModuleFiles
import Oracles.PackageData
import Rules.Actions
import Settings
@@ -27,7 +28,7 @@ buildPackageDependencies rs context @ Context {..} =
build $ Target context (GccM stage) [srcFile] [out]
hDepFile %> \out -> do
- srcs <- interpretInContext context getPackageSources
+ srcs <- haskellSources context
need srcs
if srcs == []
then writeFileChanged out ""
diff --git a/src/Rules/Documentation.hs b/src/Rules/Documentation.hs
index 4e96571..b9407bc 100644
--- a/src/Rules/Documentation.hs
+++ b/src/Rules/Documentation.hs
@@ -4,6 +4,7 @@ import Base
import Context
import Expression
import GHC
+import Oracles.ModuleFiles
import Oracles.PackageData
import Rules.Actions
import Settings
@@ -21,7 +22,7 @@ buildPackageDocumentation context @ Context {..} =
haddockFile = pkgHaddockFile context
in when (stage == Stage1) $ do
haddockFile %> \file -> do
- srcs <- interpretInContext context getPackageSources
+ srcs <- haskellSources context
deps <- map PackageName <$> interpretInContext context (getPkgDataList DepNames)
let haddocks = [ pkgHaddockFile $ vanillaContext Stage1 depPkg
| Just depPkg <- map findKnownPackage deps
diff --git a/src/Settings.hs b/src/Settings.hs
index e134fbc..9f52026 100644
--- a/src/Settings.hs
+++ b/src/Settings.hs
@@ -4,12 +4,11 @@ module Settings (
module Settings.User,
module Settings.Ways,
getPkgData, getPkgDataList, getTopDirectory, isLibrary,
- getPackagePath, getContextDirectory, getContextPath, getPackageSources
+ getPackagePath, getContextDirectory, getContextPath
) where
import Base
import Expression
-import Oracles.ModuleFiles
import Oracles.PackageData
import Oracles.WindowsPath
import Settings.Packages
@@ -34,16 +33,3 @@ getPkgDataList key = lift . pkgDataList . key =<< getContextPath
getTopDirectory :: Expr FilePath
getTopDirectory = lift topDirectory
-
--- | Find all Haskell source files for the current target
-getPackageSources :: Expr [FilePath]
-getPackageSources = do
- context <- getContext
- let buildPath = contextPath context -/- "build"
- autogen = buildPath -/- "autogen"
- (found, missingMods) <- lift $ haskellModuleFiles context
- -- Generated source files live in buildPath and have extension "hs"...
- let generated = [ buildPath -/- (replaceEq '.' '/' m) <.> "hs" | m <- missingMods ]
- -- ...except that GHC/Prim.hs lives in autogen. TODO: fix the inconsistency?
- fixGhcPrim = replaceEq (buildPath -/- "GHC/Prim.hs") (autogen -/- "GHC/Prim.hs")
- return $ found ++ fixGhcPrim generated
More information about the ghc-commits
mailing list