Don't generate in-tree directories by ghc-cabal
authorAndrey Mokhov <andrey.mokhov@gmail.com>
Sat, 26 Nov 2016 23:38:35 +0000 (23:38 +0000)
committerAndrey Mokhov <andrey.mokhov@gmail.com>
Sat, 26 Nov 2016 23:38:35 +0000 (23:38 +0000)
See #113

14 files changed:
src/Oracles/ModuleFiles.hs
src/Oracles/PackageData.hs
src/Rules/Data.hs
src/Rules/Register.hs
src/Settings/Builders/Common.hs
src/Settings/Builders/Ghc.hs
src/Settings/Builders/GhcCabal.hs
src/Settings/Builders/GhcPkg.hs
src/Settings/Builders/Hsc2Hs.hs
src/Settings/Packages/GhcCabal.hs
src/Settings/Packages/Rts.hs
src/Settings/Packages/Touchy.hs
src/Settings/Packages/Unlit.hs
src/Settings/Path.hs

index 70a7a9f..bf34790 100644 (file)
@@ -117,10 +117,11 @@ contextFiles context@Context {..} = do
 moduleFilesOracle :: Rules ()
 moduleFilesOracle = void $ do
     void . addOracle $ \(ModuleFilesKey (stage, package)) -> do
-        let path = buildPath $ vanillaContext stage package
+        let context = vanillaContext stage package
+            path    = buildPath context
         srcDirs <-             pkgDataList $ SrcDirs path
         modules <- fmap sort . pkgDataList $ Modules path
-        let dirs = (path -/- "autogen") : map (pkgPath package -/-) srcDirs
+        let dirs = autogenPath context : map (pkgPath package -/-) srcDirs
             modDirFiles = groupSort $ map decodeModule modules
         result <- concatForM dirs $ \dir -> do
             todo <- filterM (doesDirectoryExist . (dir -/-) . fst) modDirFiles
index 3589559..7225687 100644 (file)
@@ -37,10 +37,8 @@ newtype PackageDataKey = PackageDataKey (FilePath, String)
     deriving (Binary, Eq, Hashable, NFData, Show, Typeable)
 
 askPackageData :: FilePath -> String -> Action String
-askPackageData path key = do
-    let fullKey = replaceSeparators '_' $ path ++ "_" ++ key
-        file    = path -/- "package-data.mk"
-    fromMaybe "" <$> askOracle (PackageDataKey (file, fullKey))
+askPackageData path key = fromMaybe "" <$>
+    askOracle (PackageDataKey (path -/- "package-data.mk", key))
 
 -- | For each @PackageData path@ the file 'path/package-data.mk' contains a line
 -- of the form 'path_VERSION = 1.2.3.4'. @pkgData (PackageData path)@ is an
index ab8ac97..e16f03b 100644 (file)
@@ -6,6 +6,7 @@ import Expression
 import GHC
 import Oracles.Config.Setting
 import Oracles.Dependencies
+import Oracles.Path
 import Rules.Generate
 import Rules.Libffi
 import Settings.Path
@@ -19,10 +20,8 @@ buildPackageData context@Context {..} = do
     let cabalFile = pkgCabalFile package
         configure = pkgPath package -/- "configure"
         dataFile  = pkgDataFile context
-        oldPath   = pkgPath package -/- stageDirectory stage -- TODO: remove, #113
-        inTreeMk  = oldPath -/- takeFileName dataFile -- TODO: remove, #113
 
-    inTreeMk %> \mk -> do
+    dataFile %> \mk -> do
         -- Make sure all generated dependencies are in place before proceeding.
         orderOnly =<< interpretInContext context generatedDependencies
 
@@ -34,24 +33,6 @@ buildPackageData context@Context {..} = do
 
         need [cabalFile]
         build $ Target context GhcCabal [cabalFile] [mk]
-
-    -- TODO: Get rid of this, see #113.
-    dataFile %> \mk -> do
-        -- TODO: This is a hack. Add a proper support for autogen directory
-        -- structure of the new Cabal (probably only after #113).
-        let oldBuild
-                | isLibrary package   = oldPath -/- "build"
-                | package == ghc      = oldPath -/- "build/ghc"
-                | package == hpcBin   = oldPath -/- "build/hpc"
-                | package == iservBin = oldPath -/- "build/iserv"
-                | otherwise           = oldPath -/- "build" -/- pkgNameString package
-        copyFile inTreeMk mk
-        autogenFiles <- getDirectoryFiles oldBuild ["autogen/*"]
-        forM_ autogenFiles $ \file' -> do
-            let file = unifyPath file'
-            copyFile (oldBuild -/- file) (buildPath context -/- file)
-        let haddockPrologue = "haddock-prologue.txt"
-        copyFile (oldPath -/- haddockPrologue) (buildPath context -/- haddockPrologue)
         postProcessPackageData context mk
 
     -- TODO: PROGNAME was $(CrossCompilePrefix)hp2ps.
@@ -71,9 +52,8 @@ generatePackageData context@Context {..} file = do
     asmSrcs <- packageAsmSources package
     cSrcs   <- packageCSources   package
     cmmSrcs <- packageCmmSources package
-    let prefix = fixKey (buildPath context) ++ "_"
-        pkgKey = if isLibrary package then "COMPONENT_ID = " else "PROGNAME = "
-    writeFileChanged file . unlines . map (prefix ++) $
+    let pkgKey = if isLibrary package then "COMPONENT_ID = " else "PROGNAME = "
+    writeFileChanged file . unlines $
         [ pkgKey ++ pkgNameString package                                   ] ++
         [ "S_SRCS = "   ++ unwords asmSrcs                                  ] ++
         [ "C_SRCS = "   ++ unwords cSrcs                                    ] ++
@@ -113,26 +93,15 @@ packageCmmSources pkg
         return $ sources ++ [ rtsBuildPath -/- "cmm/AutoApply.cmm" ]
 
 -- Prepare a given 'packaga-data.mk' file for parsing by readConfigFile:
--- 1) Drop lines containing '$'
--- For example, get rid of
--- libraries/Win32_dist-install_CMM_SRCS  := $(addprefix cbits/,$(notdir ...
+-- 1) Drop lines containing '$'. For example, get rid of
+-- @libraries/Win32_dist-install_CMM_SRCS  := $(addprefix cbits/,$(notdir ...@
 -- Reason: we don't need them and we can't parse them.
--- 2) Replace '/' and '\' with '_' before '='
--- For example libraries/deepseq/dist-install_VERSION = 1.4.0.0
--- is replaced by libraries_deepseq_dist-install_VERSION = 1.4.0.0
+-- 2) Drop path prefixes to individual settings.
+-- For example, @libraries/deepseq/dist-install_VERSION = 1.4.0.0@
+-- is replaced by @VERSION = 1.4.0.0@.
 -- Reason: Shake's built-in makefile parser doesn't recognise slashes
 postProcessPackageData :: Context -> FilePath -> Action ()
-postProcessPackageData Context {..} file = fixFile file fixPackageData
-  where
-    fixPackageData = unlines . map processLine . filter (not . null) . filter ('$' `notElem`) . lines
-    processLine line = fixKey fixedPrefix ++ suffix
-      where
-        (prefix, suffix) = break (== '=') line
-        -- Change package/path/targetDir to takeDirectory file
-        -- This is a temporary hack until we get rid of ghc-cabal
-        fixedPrefix = takeDirectory file ++ drop len prefix
-        len         = length (pkgPath package -/- stageDirectory stage)
-
--- TODO: Remove, see #113.
-fixKey :: String -> String
-fixKey = replaceSeparators '_'
+postProcessPackageData context@Context {..} file = do
+    top <- topDirectory
+    let len = length (pkgPath package) + length (top -/- buildPath context) + 2
+    fixFile file $ unlines . map (drop len) . filter ('$' `notElem`) . lines
index 17bacd2..f912b20 100644 (file)
@@ -4,6 +4,7 @@ import Base
 import Context
 import Expression
 import GHC
+import Oracles.Path
 import Rules.Libffi
 import Settings.Packages.Rts
 import Settings.Path
@@ -22,17 +23,12 @@ registerPackage rs context@Context {..} = when (stage <= Stage1) $ do
         need [pkgDataFile context]
 
         -- Post-process inplace-pkg-config. TODO: remove, see #113, #148.
-        let path         = buildPath context
-            oldPath      = pkgPath package -/- stageDirectory stage
-            pkgConfig    = oldPath -/- "inplace-pkg-config"
-            oldBuildPath = oldPath -/- "build"
-            fixPkgConf   = unlines
-                         . map
-                         ( replace oldBuildPath path
-                         . replace (replaceSeparators '\\' oldBuildPath) path )
-                         . lines
-
-        fixFile pkgConfig fixPkgConf
+        top <- topDirectory
+        let path      = buildPath context
+            pkgConfig = path -/- "inplace-pkg-config"
+            oldPath   = top -/- path </> "build"
+
+        fixFile pkgConfig $ unlines . map (replace oldPath path) . lines
 
         buildWithResources rs $ Target context (GhcPkg stage) [pkgConfig] [conf]
 
index 0645a0a..271851e 100644 (file)
@@ -35,7 +35,6 @@ cIncludeArgs = do
     mconcat [ arg "-Iincludes"
             , arg $ "-I" ++ generatedPath
             , arg $ "-I" ++ path
-            , arg $ "-I" ++ path -/- "autogen"
             , append [ "-I" ++ pkgPath pkg -/- dir | dir <- incDirs ]
             , append [ "-I" ++       unifyPath dir | dir <- depDirs ] ]
 
index e12e35c..fe2112e 100644 (file)
@@ -111,13 +111,14 @@ includeGhcArgs :: Args
 includeGhcArgs = do
     pkg     <- getPackage
     path    <- getBuildPath
+    context <- getContext
     srcDirs <- getPkgDataList SrcDirs
     mconcat [ arg "-i"
             , arg $ "-i" ++ path
-            , arg $ "-i" ++ path -/- "autogen"
+            , arg $ "-i" ++ autogenPath context
             , append [ "-i" ++ pkgPath pkg -/- dir | dir <- srcDirs ]
             , cIncludeArgs
             , arg $      "-I" ++ generatedPath
             , arg $ "-optc-I" ++ generatedPath
             , arg "-optP-include"
-            , arg $ "-optP" ++ path -/- "autogen/cabal_macros.h" ]
+            , arg $ "-optP" ++ autogenPath context -/- "cabal_macros.h" ]
index 2366de5..263c82a 100644 (file)
@@ -10,9 +10,11 @@ import Util
 ghcCabalBuilderArgs :: Args
 ghcCabalBuilderArgs = builder GhcCabal ? do
     verbosity <- lift $ getVerbosity
+    top       <- getTopDirectory
+    context   <- getContext
     mconcat [ arg "configure"
             , arg =<< getPackagePath
-            , arg =<< getContextDirectory
+            , arg $ top -/- buildPath context
             , dll0Args
             , withStaged $ Ghc CompileHs
             , withStaged GhcPkg
index 880dd5d..b17f36a 100644 (file)
@@ -11,14 +11,12 @@ initPredicate = orM $ map (output . packageDbDirectory) [Stage0 ..]
 initArgs :: Args
 initArgs = initPredicate ? mconcat [ arg "init", arg =<< getOutput ]
 
--- TODO: Move inplace-pkg-config to buildRootPath, see #113.
 updateArgs :: Args
 updateArgs = notM initPredicate ? do
-    pkg <- getPackage
-    dir <- getContextDirectory
+    path      <- getBuildPath
     verbosity <- lift $ getVerbosity
     mconcat [ arg "update"
             , arg "--force"
             , verbosity < Chatty ? arg "-v0"
             , bootPackageDatabaseArgs
-            , arg $ pkgPath pkg -/- dir -/- "inplace-pkg-config" ]
+            , arg $ path -/- "inplace-pkg-config" ]
index f2cdb27..ba98654 100644 (file)
@@ -40,7 +40,7 @@ hsc2hsBuilderArgs = builder Hsc2Hs ? do
 
 getCFlags :: Expr [String]
 getCFlags = fromDiffExpr $ do
-    path      <- getBuildPath
+    context   <- getContext
     cppArgs   <- getPkgDataList CppArgs
     depCcArgs <- getPkgDataList DepCcArgs
     mconcat [ cArgs
@@ -51,7 +51,7 @@ getCFlags = fromDiffExpr $ do
             , append cppArgs
             , append depCcArgs
             , cWarnings
-            , arg "-include", arg $ path -/- "autogen/cabal_macros.h" ]
+            , arg "-include", arg $ autogenPath context -/- "cabal_macros.h" ]
 
 getLFlags :: Expr [String]
 getLFlags = fromDiffExpr $ do
index c7b8f37..b91bbd6 100644 (file)
@@ -4,7 +4,7 @@ import Base
 import GHC
 import Oracles.Config.Setting
 import Predicate
-import Settings
+import Settings.Path
 
 ghcCabalPackageArgs :: Args
 ghcCabalPackageArgs = package ghcCabal ?
@@ -23,7 +23,7 @@ ghcCabalBootArgs = stage0 ? do
                  , pretty, process, time ]
         , notM windowsHost ? append [unix]
         , windowsHost ? append [win32] ]
-    path <- getBuildPath
+    context <- getContext
     mconcat
         [ append [ "-package " ++ pkgNameString pkg | pkg <- cabalDeps ]
         , arg "--make"
@@ -31,7 +31,7 @@ ghcCabalBootArgs = stage0 ? do
         , arg "-DBOOTSTRAPPING"
         , arg "-DMIN_VERSION_binary_0_8_0"
         , arg "-DGENERICS"
-        , removePair "-optP-include" $ "-optP" ++ path -/- "autogen/cabal_macros.h"
+        , removePair "-optP-include" $ "-optP" ++ autogenPath context -/- "cabal_macros.h"
         , arg "-optP-include"
         , arg $ "-optP" ++ pkgPath ghcCabal -/- "cabal_macros_boot.h"
         , arg "-ilibraries/Cabal/Cabal"
index 68e3524..4c3cc99 100644 (file)
@@ -97,7 +97,7 @@ rtsPackageArgs = package rts ? do
         , builder Ghc ? arg "-Irts"
 
         , builder (GhcPkg Stage1) ? mconcat
-          [ remove ["rts/stage1/inplace-pkg-config"] -- TODO: fix, see #113
+          [ remove [path -/- "inplace-pkg-config"]
           , arg rtsConf ]
 
         , builder HsCpp ? append
index 2a6fc01..eb7b5ea 100644 (file)
@@ -8,7 +8,7 @@ import Settings
 touchyPackageArgs :: Args
 touchyPackageArgs = package touchy ? do
     path <- getBuildPath
-    let cabalMacros = path -/- "autogen/cabal_macros.h"
+    let cabalMacros = path -/- "build/autogen/cabal_macros.h"
     builder Ghc ? mconcat [ arg "-no-hs-main"
                           , remove ["-hide-all-packages"]
                           , removePair "-optP-include" $ "-optP" ++ cabalMacros ]
index 88686af..8b5d8a5 100644 (file)
@@ -8,7 +8,7 @@ import Settings
 unlitPackageArgs :: Args
 unlitPackageArgs = package unlit ? do
     path <- getBuildPath
-    let cabalMacros = path -/- "autogen/cabal_macros.h"
+    let cabalMacros = path -/- "build/autogen/cabal_macros.h"
     builder Ghc ? mconcat [ arg "-no-hs-main"
                           , remove ["-hide-all-packages"]
                           , removePair "-optP-include" $ "-optP" ++ cabalMacros ]
index 6b2e67d..0a22077 100644 (file)
@@ -1,9 +1,10 @@
 module Settings.Path (
     stageDirectory, buildPath, pkgDataFile, pkgHaddockFile, pkgLibraryFile,
     pkgLibraryFile0, pkgGhciLibraryFile, gmpBuildPath, gmpObjects, gmpLibraryH,
-    gmpBuildInfoPath, generatedPath, libffiBuildPath, shakeFilesPath, pkgConfFile,
-    packageDbDirectory, packageDbStamp, bootPackageConstraints, packageDependencies,
-    objectPath, programInplacePath, programInplaceLibPath, installPath
+    gmpBuildInfoPath, generatedPath, libffiBuildPath, shakeFilesPath,
+    pkgConfFile, packageDbDirectory, packageDbStamp, bootPackageConstraints,
+    packageDependencies, objectPath, programInplacePath, programInplaceLibPath,
+    installPath, autogenPath
     ) where
 
 import Base
@@ -48,6 +49,17 @@ programInplaceLibPath = "inplace/lib/bin"
 buildPath :: Context -> FilePath
 buildPath Context {..} = buildRootPath -/- stageDirectory stage -/- pkgPath package
 
+-- | Path to the autogen directory generated by @ghc-cabal@ of a given 'Context'.
+autogenPath :: Context -> FilePath
+autogenPath context@Context {..}
+    | isLibrary package   = autogen "build"
+    | package == ghc      = autogen "build/ghc"
+    | package == hpcBin   = autogen "build/hpc"
+    | package == iservBin = autogen "build/iserv"
+    | otherwise           = autogen $ "build" -/- pkgNameString package
+  where
+    autogen dir = buildPath context -/- dir -/- "autogen"
+
 -- | Path to the @package-data.mk@ of a given 'Context'.
 pkgDataFile :: Context -> FilePath
 pkgDataFile context = buildPath context -/- "package-data.mk"