summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--.gitlab-ci.yml16
-rwxr-xr-x.gitlab/ci.sh82
-rw-r--r--cabal.project-reinstall79
-rw-r--r--compiler/GHC/Driver/Session.hs5
-rw-r--r--compiler/Setup.hs138
-rw-r--r--compiler/ghc.cabal.in18
-rw-r--r--configure.ac5
-rw-r--r--driver/ghci/ghci-wrapper.cabal.in1
-rw-r--r--ghc/ghc-bin.cabal.in6
-rw-r--r--hadrian/cfg/system.config.in1
-rw-r--r--hadrian/hadrian.cabal2
-rw-r--r--hadrian/src/Builder.hs7
-rw-r--r--hadrian/src/Hadrian/Haskell/Cabal/Parse.hs4
-rw-r--r--hadrian/src/Oracles/TestSettings.hs8
-rw-r--r--hadrian/src/Rules.hs2
-rw-r--r--hadrian/src/Rules/CabalReinstall.hs112
-rw-r--r--hadrian/src/Rules/Generate.hs1
-rw-r--r--hadrian/src/Rules/Test.hs4
-rw-r--r--hadrian/src/Settings/Builders/Cabal.hs106
-rw-r--r--hadrian/src/Settings/Builders/Common.hs5
-rw-r--r--libraries/ghc-boot/Setup.hs120
-rw-r--r--libraries/ghc-boot/ghc-boot.cabal.in11
-rw-r--r--libraries/ghc-prim/ghc-prim.cabal2
-rw-r--r--testsuite/driver/testlib.py2
-rw-r--r--utils/genprimopcode/genprimopcode.cabal3
-rw-r--r--utils/hp2ps/hp2ps.cabal5
-rw-r--r--utils/hpc/hpc-bin.cabal5
-rw-r--r--utils/runghc/Main.hs2
-rw-r--r--utils/runghc/ghc.mk1
-rw-r--r--utils/runghc/runghc.cabal.in2
-rw-r--r--utils/touchy/touchy.cabal1
-rw-r--r--utils/unlit/unlit.cabal3
33 files changed, 691 insertions, 69 deletions
diff --git a/.gitignore b/.gitignore
index f0121e6936..7f0ff4081b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -242,3 +242,4 @@ ghc.nix/
# clangd
.clangd
+dist-newstyle/
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 1d2f3ac7d0..0a2d34db8d 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -956,6 +956,22 @@ nightly-x86_64-linux-deb10-llvm:
BUILD_FLAVOUR: perf-llvm
TEST_ENV: "x86_64-linux-deb10-llvm"
+####################################
+# Testing reinstallable ghc codepath
+####################################
+
+test-cabal-reinstall-x86_64-linux-deb10:
+ extends: .validate-linux-hadrian
+ stage: full-build
+ before_script:
+ - ./boot
+ - ./configure
+ - "cabal update --index=$HACKAGE_INDEX_STATE --project-file=cabal.project-reinstall"
+ variables:
+ REINSTALL_GHC: "yes"
+ BUILD_FLAVOUR: validate
+ TEST_ENV: "x86_64-linux-deb10-cabal-install"
+
#################################
# x86_64-linux-deb11
#################################
diff --git a/.gitlab/ci.sh b/.gitlab/ci.sh
index f727da77be..74cba5ea36 100755
--- a/.gitlab/ci.sh
+++ b/.gitlab/ci.sh
@@ -90,6 +90,8 @@ Environment variables determining build configuration of Make system:
Environment variables determining build configuration of Hadrian system:
BUILD_FLAVOUR Which flavour to build.
+ REINSTALL_GHC Build and test a reinstalled "stage3" ghc built using cabal-install
+ This tests the "reinstall" configuration
Environment variables determining bootstrap toolchain (Linux):
@@ -348,6 +350,7 @@ function setup_toolchain() {
--with-compiler=$GHC \
--index-state=$HACKAGE_INDEX_STATE \
--installdir=$toolchain/bin \
+ --ignore-project \
--overwrite-policy=always"
# Avoid symlinks on Windows
@@ -487,9 +490,14 @@ function build_hadrian() {
# N.B. First build Hadrian, unsetting MACOSX_DEPLOYMENT_TARGET which may warn
# if the bootstrap libraries were built with a different version expectation.
MACOSX_DEPLOYMENT_TARGET="" run_hadrian stage1:exe:ghc-bin
- run_hadrian binary-dist -V
- mv _build/bindist/ghc*.tar.xz "$BIN_DIST_NAME.tar.xz"
+ if [[ -n "${REINSTALL_GHC:-}" ]]; then
+ run_hadrian build-cabal -V
+ else
+ run_hadrian binary-dist -V
+ mv _build/bindist/ghc*.tar.xz "$BIN_DIST_NAME.tar.xz"
+ fi
+
}
function test_hadrian() {
@@ -514,32 +522,50 @@ function test_hadrian() {
fi
fi
- cd _build/bindist/ghc-*/
- case "$(uname)" in
- MSYS_*|MINGW*)
- mkdir -p "$TOP"/_build/install
- cp -a * "$TOP"/_build/install
- ;;
- *)
- read -r -a args <<< "${INSTALL_CONFIGURE_ARGS:-}"
- run ./configure --prefix="$TOP"/_build/install "${args[@]}"
- run "$MAKE" install
- ;;
- esac
- cd ../../../
-
- run_hadrian \
- test \
- --test-root-dirs=testsuite/tests/stage1 \
- --test-compiler=stage1 \
- "runtest.opts+=${RUNTEST_ARGS:-}"
-
- run_hadrian \
- test \
- --summary-junit=./junit.xml \
- --test-have-intree-files \
- --test-compiler="$TOP/_build/install/bin/ghc$exe" \
- "runtest.opts+=${RUNTEST_ARGS:-}"
+
+ if [[ -n "${REINSTALL_GHC:-}" ]]; then
+ run_hadrian \
+ test \
+ --test-root-dirs=testsuite/tests/stage1 \
+ --test-compiler=stage-cabal \
+ --test-root-dirs=testsuite/tests/perf \
+ --test-root-dirs=testsuite/tests/typecheck \
+ "runtest.opts+=${RUNTEST_ARGS:-}"
+ else
+ cd _build/bindist/ghc-*/
+ case "$(uname)" in
+ MSYS_*|MINGW*)
+ mkdir -p "$TOP"/_build/install
+ cp -a * "$TOP"/_build/install
+ ;;
+ *)
+ read -r -a args <<< "${INSTALL_CONFIGURE_ARGS:-}"
+ run ./configure --prefix="$TOP"/_build/install "${args[@]}"
+ run "$MAKE" install
+ ;;
+ esac
+ cd ../../../
+ test_compiler="$TOP/_build/install/bin/ghc$exe"
+
+
+ run_hadrian \
+ test \
+ --test-root-dirs=testsuite/tests/stage1 \
+ --test-compiler=stage1 \
+ "runtest.opts+=${RUNTEST_ARGS:-}"
+
+ shell ls
+ shell ls _build/stage-cabal/bin
+
+ run_hadrian \
+ test \
+ --summary-junit=./junit.xml \
+ --test-have-intree-files \
+ --test-compiler="${test_compiler}" \
+ "runtest.opts+=${RUNTEST_ARGS:-}" \
+
+ fi
+
}
function cabal_test() {
diff --git a/cabal.project-reinstall b/cabal.project-reinstall
new file mode 100644
index 0000000000..e026e70a5d
--- /dev/null
+++ b/cabal.project-reinstall
@@ -0,0 +1,79 @@
+packages: ./compiler
+ ./utils/genprimopcode/
+ ./utils/deriveConstants/
+ ./ghc/
+ -- ./libraries/array
+ -- ./libraries/base
+ ./libraries/binary
+ ./libraries/bytestring
+ ./libraries/Cabal/Cabal
+ ./libraries/Cabal/Cabal-syntax
+ ./libraries/containers/containers/
+ -- ./libraries/deepseq/
+ ./libraries/directory/
+ ./libraries/exceptions/
+ -- ./libraries/filepath/
+ -- ./libraries/ghc-bignum/
+ ./libraries/ghc-boot/
+ -- ./libraries/ghc-boot-th/
+ ./libraries/ghc-compact
+ ./libraries/ghc-heap
+ ./libraries/ghci
+ -- ./libraries/ghc-prim
+ ./libraries/haskeline
+ ./libraries/directory
+ ./libraries/hpc
+ -- ./libraries/integer-gmp
+ ./libraries/libiserv/
+ ./libraries/mtl/
+ ./libraries/parsec/
+ -- ./libraries/pretty/
+ ./libraries/process/
+ ./libraries/stm
+ -- ./libraries/template-haskell/
+ ./libraries/terminfo/
+ ./libraries/text
+ ./libraries/time
+ ./libraries/transformers/
+ ./libraries/unix/
+ ./libraries/Win32/
+ ./libraries/xhtml/
+ ./utils/ghc-pkg
+ ./utils/haddock
+ ./utils/hp2ps
+ ./utils/hpc
+ ./utils/hsc2hs
+ ./utils/runghc
+ ./utils/unlit
+ ./utils/iserv
+
+constraints: ghc +internal-interpreter +dynamic-system-linke +terminfo,
+ ghc-bin +internal-interpreter +threaded,
+ ghci +internal-interpreter,
+ haddock +in-ghc-tree,
+ any.array installed,
+ any.base installed,
+ any.deepseq installed,
+ any.filepath installed,
+ any.ghc-bignum installed,
+ any.ghc-boot-th installed,
+ any.integer-gmp installed,
+ any.pretty installed,
+ any.template-haskell installed
+
+allow-newer:
+ ghc-paths:Cabal,
+ *:base,
+ *:ghc-prim,
+ tree-diff:time
+
+benchmarks: False
+tests: False
+allow-boot-library-installs: False
+
+-- Workaround for https://github.com/haskell/cabal/issues/7297
+package *
+ library-vanilla: True
+ shared: True
+ executable-profiling: False
+ executable-dynamic: True
diff --git a/compiler/GHC/Driver/Session.hs b/compiler/GHC/Driver/Session.hs
index 91bf2adf39..34d34815ce 100644
--- a/compiler/GHC/Driver/Session.hs
+++ b/compiler/GHC/Driver/Session.hs
@@ -4429,6 +4429,7 @@ parseEnvFile envfile = mapM_ parseEntry . lines
where envdir = takeDirectory envfile
db = drop 11 str
["clear-package-db"] -> clearPkgDb
+ ["hide-package", pkg] -> hidePackage pkg
["global-package-db"] -> addPkgDbRef GlobalPkgDb
["user-package-db"] -> addPkgDbRef UserPkgDb
["package-id", pkgid] -> exposePackageId pkgid
@@ -4622,6 +4623,10 @@ compilerInfo dflags
(rawSettings dflags)
++ [("Project version", projectVersion dflags),
("Project Git commit id", cProjectGitCommitId),
+ ("Project Version Int", cProjectVersionInt),
+ ("Project Patch Level", cProjectPatchLevel),
+ ("Project Patch Level1", cProjectPatchLevel1),
+ ("Project Patch Level2", cProjectPatchLevel2),
("Booter version", cBooterVersion),
("Stage", cStage),
("Build platform", cBuildPlatformString),
diff --git a/compiler/Setup.hs b/compiler/Setup.hs
new file mode 100644
index 0000000000..e6d3d09d18
--- /dev/null
+++ b/compiler/Setup.hs
@@ -0,0 +1,138 @@
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE LambdaCase #-}
+module Main where
+
+import Distribution.Simple
+import Distribution.Simple.BuildPaths
+import Distribution.Types.LocalBuildInfo
+import Distribution.Verbosity
+import Distribution.Simple.Program
+import Distribution.Simple.Utils
+import Distribution.Simple.Setup
+
+import System.IO
+import System.Process
+import System.Directory
+import System.FilePath
+import Control.Monad
+import Data.Char
+import GHC.ResponseFile
+import System.Environment
+
+main :: IO ()
+main = defaultMainWithHooks ghcHooks
+ where
+ ghcHooks = simpleUserHooks
+ { postConf = \args cfg pd lbi -> do
+ let verbosity = fromFlagOrDefault minBound (configVerbosity cfg)
+ ghcAutogen verbosity lbi
+ postConf simpleUserHooks args cfg pd lbi
+ }
+
+-- Mapping from primop-*.hs-incl file to command
+primopIncls :: [(String,String)]
+primopIncls =
+ [ ("primop-data-decl.hs-incl" , "--data-decl")
+ , ("primop-tag.hs-incl" , "--primop-tag")
+ , ("primop-list.hs-incl" , "--primop-list")
+ , ("primop-has-side-effects.hs-incl" , "--has-side-effects")
+ , ("primop-out-of-line.hs-incl" , "--out-of-line")
+ , ("primop-commutable.hs-incl" , "--commutable")
+ , ("primop-code-size.hs-incl" , "--code-size")
+ , ("primop-can-fail.hs-incl" , "--can-fail")
+ , ("primop-strictness.hs-incl" , "--strictness")
+ , ("primop-fixity.hs-incl" , "--fixity")
+ , ("primop-primop-info.hs-incl" , "--primop-primop-info")
+ , ("primop-vector-uniques.hs-incl" , "--primop-vector-uniques")
+ , ("primop-vector-tys.hs-incl" , "--primop-vector-tys")
+ , ("primop-vector-tys-exports.hs-incl", "--primop-vector-tys-exports")
+ , ("primop-vector-tycons.hs-incl" , "--primop-vector-tycons")
+ , ("primop-docs.hs-incl" , "--wired-in-docs")
+ ]
+
+ghcAutogen :: Verbosity -> LocalBuildInfo -> IO ()
+ghcAutogen verbosity lbi@LocalBuildInfo{..} = do
+ -- Get compiler/ root directory from the cabal file
+ let Just compilerRoot = takeDirectory <$> pkgDescrFile
+
+ -- Require the necessary programs
+ (gcc ,withPrograms) <- requireProgram normal gccProgram withPrograms
+ (ghc ,withPrograms) <- requireProgram normal ghcProgram withPrograms
+
+ settings <- read <$> getProgramOutput normal ghc ["--info"]
+ -- We are reinstalling GHC
+ -- Write primop-*.hs-incl
+ let hsCppOpts = case lookup "Haskell CPP flags" settings of
+ Just fs -> unescapeArgs fs
+ Nothing -> []
+ primopsTxtPP = compilerRoot </> "GHC/Builtin/primops.txt.pp"
+ cppOpts = hsCppOpts ++ ["-P","-x","c"]
+ cppIncludes = map ("-I"++) [compilerRoot]
+ -- Preprocess primops.txt.pp
+ primopsStr <- getProgramOutput normal gcc (cppOpts ++ cppIncludes ++ [primopsTxtPP])
+ -- Call genprimopcode to generate *.hs-incl
+ forM_ primopIncls $ \(file,command) -> do
+ contents <- readProcess "genprimopcode" [command] primopsStr
+ rewriteFileEx verbosity (buildDir </> file) contents
+
+ -- Write GHC.Platform.Constants
+ let platformConstantsPath = autogenPackageModulesDir lbi </> "GHC/Platform/Constants.hs"
+ targetOS = case lookup "target os" settings of
+ Nothing -> error "no target os in settings"
+ Just os -> os
+ createDirectoryIfMissingVerbose verbosity True (takeDirectory platformConstantsPath)
+ withTempFile (takeDirectory platformConstantsPath) "Constants_tmp.hs" $ \tmp h -> do
+ hClose h
+ callProcess "deriveConstants" ["--gen-haskell-type","-o",tmp,"--target-os",targetOS]
+ renameFile tmp platformConstantsPath
+
+ -- Write GHC.Settings.Config
+ let configHsPath = autogenPackageModulesDir lbi </> "GHC/Settings/Config.hs"
+ configHs = generateConfigHs settings
+ createDirectoryIfMissingVerbose verbosity True (takeDirectory configHsPath)
+ rewriteFileEx verbosity configHsPath configHs
+
+getSetting :: [(String,String)] -> String -> String -> Either String String
+getSetting settings kh kr = go settings kr
+ where
+ go settings k = case lookup k settings of
+ Nothing -> Left (show k ++ " not found in settings: " ++ show settings)
+ Just v -> Right v
+
+generateConfigHs :: [(String,String)] -> String
+generateConfigHs settings = either error id $ do
+ let getSetting' = getSetting $ (("cStage","2"):) settings
+ buildPlatform <- getSetting' "cBuildPlatformString" "Host platform"
+ hostPlatform <- getSetting' "cHostPlatformString" "Target platform"
+ cProjectName <- getSetting' "cProjectName" "Project name"
+ cBooterVersion <- getSetting' "cBooterVersion" "Project version"
+ cStage <- getSetting' "cStage" "cStage"
+ return $ unlines
+ [ "module GHC.Settings.Config"
+ , " ( module GHC.Version"
+ , " , cBuildPlatformString"
+ , " , cHostPlatformString"
+ , " , cProjectName"
+ , " , cBooterVersion"
+ , " , cStage"
+ , " ) where"
+ , ""
+ , "import GHC.Prelude"
+ , ""
+ , "import GHC.Version"
+ , ""
+ , "cBuildPlatformString :: String"
+ , "cBuildPlatformString = " ++ show buildPlatform
+ , ""
+ , "cHostPlatformString :: String"
+ , "cHostPlatformString = " ++ show hostPlatform
+ , ""
+ , "cProjectName :: String"
+ , "cProjectName = " ++ show cProjectName
+ , ""
+ , "cBooterVersion :: String"
+ , "cBooterVersion = " ++ show cBooterVersion
+ , ""
+ , "cStage :: String"
+ , "cStage = show ("++ cStage ++ " :: Int)"
+ ]
diff --git a/compiler/ghc.cabal.in b/compiler/ghc.cabal.in
index 6bc23a69a8..4ff65c4e61 100644
--- a/compiler/ghc.cabal.in
+++ b/compiler/ghc.cabal.in
@@ -1,10 +1,10 @@
+Cabal-Version: 2.2
-- WARNING: ghc.cabal is automatically generated from ghc.cabal.in by
-- ./configure. Make sure you are editing ghc.cabal.in, not ghc.cabal.
-Cabal-Version: 1.22
Name: ghc
Version: @ProjectVersionMunged@
-License: BSD3
+License: BSD-3-Clause
License-File: LICENSE
Author: The GHC Team
Maintainer: glasgow-haskell-users@haskell.org
@@ -21,9 +21,11 @@ Description:
See <https://gitlab.haskell.org/ghc/ghc/-/wikis/commentary/compiler>
for more information.
Category: Development
-Build-Type: Simple
+Build-Type: Custom
extra-source-files:
+ GHC/Builtin/primops.txt.pp
+ GHC/Builtin/bytearray-ops.txt.pp
Unique.h
CodeGen.Platform.h
-- Shared with rts via hard-link at configure time. This is safer
@@ -33,6 +35,11 @@ extra-source-files:
ClosureTypes.h
FunTypes.h
MachRegs.h
+ ghc-llvm-version.h
+
+
+custom-setup
+ setup-depends: base >= 3 && < 5, Cabal >= 1.6 && <3.8, directory, process, filepath
Flag internal-interpreter
Description: Build with internal interpreter support.
@@ -60,6 +67,8 @@ Library
FunTypes.h
ghc-llvm-version.h
+ build-tool-depends: alex:alex >= 3.2.6, happy:happy >= 1.20.0, genprimopcode:genprimopcode, deriveConstants:deriveConstants
+
Build-Depends: base >= 4.11 && < 4.17,
deepseq >= 1.4 && < 1.5,
directory >= 1 && < 1.4,
@@ -765,6 +774,9 @@ Library
Language.Haskell.Syntax.Pat
Language.Haskell.Syntax.Type
+ autogen-modules: GHC.Platform.Constants
+ GHC.Settings.Config
+
reexported-modules:
GHC.Platform.ArchOS
, GHC.Platform.Host
diff --git a/configure.ac b/configure.ac
index cf3d586590..e8a95726a3 100644
--- a/configure.ac
+++ b/configure.ac
@@ -936,6 +936,10 @@ AC_PATH_PROG(GIT,git)
dnl ** check for makeinfo
AC_PATH_PROG(MAKEINFO,makeinfo)
+dnl ** check for cabal
+AC_PATH_PROG(CABAL,cabal)
+
+
dnl ** check for Python for testsuite driver
FIND_PYTHON
@@ -1409,6 +1413,7 @@ echo "\
xelatex : $XELATEX
makeinfo : $MAKEINFO
git : $GIT
+ cabal-install : $CABAL
Using LLVM tools
clang : $ClangCmd
diff --git a/driver/ghci/ghci-wrapper.cabal.in b/driver/ghci/ghci-wrapper.cabal.in
index 2616223ada..5a422aab9b 100644
--- a/driver/ghci/ghci-wrapper.cabal.in
+++ b/driver/ghci/ghci-wrapper.cabal.in
@@ -24,6 +24,5 @@ Executable ghci
buildable: False
Include-Dirs: ../utils
C-Sources:
- ghci.c
-- the following get copied from ../utils by hadrian
getLocation.c isMinTTY.c cwrapper.c
diff --git a/ghc/ghc-bin.cabal.in b/ghc/ghc-bin.cabal.in
index 139ef0196b..8a9178a183 100644
--- a/ghc/ghc-bin.cabal.in
+++ b/ghc/ghc-bin.cabal.in
@@ -14,8 +14,6 @@ Description:
This package contains the @ghc@ executable, the user facing front-end
to the Glasgow Haskell Compiler.
Category: Development
-Data-Dir: ..
-Data-Files: settings
Build-Type: Simple
Cabal-Version: >=1.10
@@ -46,8 +44,8 @@ Executable ghc
filepath >= 1 && < 1.5,
containers >= 0.5 && < 0.7,
transformers == 0.5.*,
- ghc-boot == @ProjectVersionMunged@,
- ghc == @ProjectVersionMunged@
+ ghc-boot == @ProjectVersionMunged@,
+ ghc == @ProjectVersionMunged@
if os(windows)
Build-Depends: Win32 >= 2.3 && < 2.13
diff --git a/hadrian/cfg/system.config.in b/hadrian/cfg/system.config.in
index 2f8ebe6713..f8669c7315 100644
--- a/hadrian/cfg/system.config.in
+++ b/hadrian/cfg/system.config.in
@@ -30,6 +30,7 @@ makeindex = @MAKEINDEX@
makeinfo = @MAKEINFO@
bourne-shell = @SH@
git = @GIT@
+cabal = @CABAL@
# Python 3 is required to run test driver.
# See: https://github.com/ghc/ghc/blob/master/testsuite/mk/boilerplate.mk#L220
diff --git a/hadrian/hadrian.cabal b/hadrian/hadrian.cabal
index 13ac5d1362..560402f1a0 100644
--- a/hadrian/hadrian.cabal
+++ b/hadrian/hadrian.cabal
@@ -67,6 +67,7 @@ executable hadrian
, Packages
, Rules
, Rules.BinaryDist
+ , Rules.CabalReinstall
, Rules.Clean
, Rules.Compile
, Rules.Dependencies
@@ -155,6 +156,7 @@ executable hadrian
-Wredundant-constraints
-fno-warn-name-shadowing
-rtsopts
+ -fno-ignore-asserts
if flag(threaded)
ghc-options:
diff --git a/hadrian/src/Builder.hs b/hadrian/src/Builder.hs
index 6da009bda1..0ff400288d 100644
--- a/hadrian/src/Builder.hs
+++ b/hadrian/src/Builder.hs
@@ -89,7 +89,11 @@ instance NFData GhcMode
-- This instructs package configuration functions (such as 'configurePackage')
-- to enable the @profiling@ Cabal flag when processing @rts.cabal@ and
-- building RTS with profiling information.
-data ConfigurationInfo = Setup | Flags deriving (Eq, Generic, Show)
+data ConfigurationInfo
+ = Setup
+ | Flags
+ | Install
+ deriving (Eq, Generic, Show)
instance Binary ConfigurationInfo
instance Hashable ConfigurationInfo
@@ -426,6 +430,7 @@ systemBuilderPath builder = case builder of
Xelatex -> fromKey "xelatex"
Makeindex -> fromKey "makeindex"
Win32Tarballs _ -> fromKey "python"
+ Cabal _ _ -> fromKey "cabal"
_ -> error $ "No entry for " ++ show builder ++ inCfg
where
inCfg = " in " ++ quote configFile ++ " file."
diff --git a/hadrian/src/Hadrian/Haskell/Cabal/Parse.hs b/hadrian/src/Hadrian/Haskell/Cabal/Parse.hs
index 4e3bd5be17..8fe518349d 100644
--- a/hadrian/src/Hadrian/Haskell/Cabal/Parse.hs
+++ b/hadrian/src/Hadrian/Haskell/Cabal/Parse.hs
@@ -1,4 +1,5 @@
{-# LANGUAGE CPP #-}
+{-# LANGUAGE MultiWayIf #-}
-----------------------------------------------------------------------------
-- |
-- Module : Hadrian.Haskell.Cabal.Parse
@@ -51,7 +52,10 @@ import Hadrian.Haskell.Cabal
import Hadrian.Haskell.Cabal.Type
import Hadrian.Oracles.Cabal
import Hadrian.Oracles.ArgsHash
+import Settings.Builders.Common (packageDatabaseArgs )
import Hadrian.Target
+import Oracles.Setting (setting, Setting(..))
+import Rules.Generate
import Base
import Builder
diff --git a/hadrian/src/Oracles/TestSettings.hs b/hadrian/src/Oracles/TestSettings.hs
index 42aea11a5b..dec7097d25 100644
--- a/hadrian/src/Oracles/TestSettings.hs
+++ b/hadrian/src/Oracles/TestSettings.hs
@@ -90,6 +90,10 @@ getBinaryDirectory "stage0" = takeDirectory <$> setting SystemGhc
getBinaryDirectory "stage1" = liftM2 (-/-) absoluteBuildRoot (pure "stage1-test/bin/")
getBinaryDirectory "stage2" = liftM2 (-/-) topDirectory (stageBinPath Stage1)
getBinaryDirectory "stage3" = liftM2 (-/-) topDirectory (stageBinPath Stage2)
+getBinaryDirectory "stage-cabal" = do
+ top <- topDirectory
+ root <- buildRoot
+ pure (top -/- root -/- "stage-cabal" -/- "bin")
getBinaryDirectory compiler = pure $ takeDirectory compiler
-- | Get the path to the given @--test-compiler@.
@@ -98,6 +102,10 @@ getCompilerPath "stage0" = setting SystemGhc
getCompilerPath "stage1" = liftM2 (-/-) absoluteBuildRoot (pure ("stage1-test/bin/ghc" <.> exe))
getCompilerPath "stage2" = liftM2 (-/-) topDirectory (fullPath Stage1 ghc)
getCompilerPath "stage3" = liftM2 (-/-) topDirectory (fullPath Stage2 ghc)
+getCompilerPath "stage-cabal" = do
+ top <- topDirectory
+ root <- buildRoot
+ pure (top -/- root -/- "stage-cabal" -/- "bin" -/- "ghc")
getCompilerPath compiler = pure compiler
isInTreeCompiler :: String -> Bool
diff --git a/hadrian/src/Rules.hs b/hadrian/src/Rules.hs
index 67646a8689..fc85d1d698 100644
--- a/hadrian/src/Rules.hs
+++ b/hadrian/src/Rules.hs
@@ -12,6 +12,7 @@ import qualified Oracles.Flavour
import qualified Oracles.ModuleFiles
import Packages
import qualified Rules.BinaryDist
+import qualified Rules.CabalReinstall
import qualified Rules.Compile
import qualified Rules.Dependencies
import qualified Rules.Documentation
@@ -136,6 +137,7 @@ buildRules = do
Rules.Library.libraryRules
Rules.Rts.rtsRules
packageRules
+ Rules.CabalReinstall.cabalBuildRules
oracleRules :: Rules ()
oracleRules = do
diff --git a/hadrian/src/Rules/CabalReinstall.hs b/hadrian/src/Rules/CabalReinstall.hs
new file mode 100644
index 0000000000..c34362171a
--- /dev/null
+++ b/hadrian/src/Rules/CabalReinstall.hs
@@ -0,0 +1,112 @@
+module Rules.CabalReinstall where
+
+import Context
+import Expression
+import Oracles.Flag
+import Packages
+import Settings
+import Target
+import Utilities
+import qualified System.Directory.Extra as IO
+import Data.Either
+import Rules.BinaryDist
+import Hadrian.Haskell.Cabal (pkgIdentifier)
+
+{-
+Note [Testing reinstallable GHC]
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
+To test the reinstallable GHC configuration, we install a GHC to <build root>/stage-cabal/bin
+along with appropriate wrapper scripts.
+
+The libdir of the reinstalled GHC points to the libdir of the stage 2 compiler (in <build root>/stage1)
+-}
+
+
+-- | We don't support reinstalling these
+cabalExcludedPackages :: [Package]
+cabalExcludedPackages = [array, base, deepseq, filepath, ghcBignum, ghcBootTh, ghcPrim, integerGmp, integerSimple, pretty, templateHaskell]
+
+findCabalPackageDb :: String -> FilePath
+findCabalPackageDb env = go $ map (\l -> (words l, l)) (lines env)
+ where
+ go [] = error $ "Couldn't find installed package db in " ++ show env
+ go (("package-db":_, l):_) = drop 11 l
+ go (_:xs) = go xs
+
+
+cabalBuildRules :: Rules ()
+cabalBuildRules = do
+ root <- buildRootRules
+ root -/- "stage-cabal" -/- "cabal-packages" %> \_ -> do
+ -- Always rerun to pass onto cabal's own recompilation logic
+ alwaysRerun
+ all_pkgs <- stagePackages Stage1
+ forM_ (filter (not . (`elem` cabalExcludedPackages)) all_pkgs) $ \pkg -> do
+ withVerbosity Diagnostic $
+ buildWithCmdOptions [] $
+ target (vanillaContext Stage2 pkg) (Cabal Install Stage2) [] []
+
+ phony "build-cabal" $ need [root -/- "stage-cabal" -/- "bin" -/- ".stamp"]
+
+ root -/- "stage-cabal" -/- "bin" -/- "*" %> \_ -> need [root -/- "stage-cabal" -/- "bin" -/- ".stamp"]
+
+ priority 2.0 $ root -/- "stage-cabal" -/- "bin" -/- ".stamp" %> \stamp -> do
+ -- We 'need' all binaries and libraries
+ all_pkgs <- stagePackages Stage1
+ (lib_targets, bin_targets) <- partitionEithers <$> mapM pkgTarget all_pkgs
+ cross <- flag CrossCompiling
+ iserv_targets <- if cross then pure [] else iservBins
+ need (lib_targets ++ (map (\(_, p) -> p) (bin_targets ++ iserv_targets)))
+
+ distDir <- Context.distDir Stage1
+ rtsDir <- pkgIdentifier rts
+
+ let ghcBuildDir = root -/- stageString Stage1
+ rtsIncludeDir = ghcBuildDir -/- "lib" -/- distDir -/- rtsDir
+ -/- "include"
+
+ libdir <- liftIO . IO.makeAbsolute =<< stageLibPath Stage1
+ work_dir <- liftIO $ IO.makeAbsolute $ root -/- "stage-cabal"
+ let outputDir = work_dir -/- "bin"
+ includeDir <- liftIO $ IO.makeAbsolute rtsIncludeDir
+
+ createDirectory outputDir
+
+ need [root -/- "stage-cabal" -/- "cabal-packages"]
+ env <- liftIO $ readFile $ root -/- "stage-cabal" -/- "cabal-packages"
+ let cabal_package_db = findCabalPackageDb env
+
+ forM_ (filter ((/= iserv) . fst) bin_targets) $ \(bin_pkg,_bin_path) -> do
+ let pgmName pkg
+ | pkg == ghc = "ghc"
+ | pkg == hpcBin = "hpc"
+ | otherwise = pkgName pkg
+ let cabal_bin_out = work_dir -/- "cabal-bin" -/- (pgmName bin_pkg)
+ needed_wrappers <- pkgToWrappers bin_pkg
+ forM_ needed_wrappers $ \wrapper_name -> do
+ let wrapper_prefix = unlines
+ ["#!/usr/bin/env sh"
+ ,"executablename="++show cabal_bin_out
+ ,"libdir="++show libdir
+ ,"bindir="++show outputDir
+ ,"exedir="++show outputDir
+ ,"includedir="++show includeDir
+ ,"export GHC_PACKAGE_PATH="++show cabal_package_db++":"
+ ]
+ output_file = outputDir -/- wrapper_name
+ wrapper_content <- wrapper wrapper_name
+ writeFile' output_file (wrapper_prefix ++ wrapper_content)
+ makeExecutable output_file
+ pure ()
+
+ -- Just symlink these for now
+ -- TODO: build these with cabal as well
+ forM_ iserv_targets $ \(_bin_pkg,bin_path') -> do
+ bin_path <- liftIO $ IO.makeAbsolute bin_path'
+ let orig_filename = takeFileName bin_path
+ output_file = outputDir -/- orig_filename
+ liftIO $ do
+ IO.removeFile output_file <|> pure ()
+ IO.createFileLink bin_path output_file
+ pure ()
+ writeFile' stamp "OK"
diff --git a/hadrian/src/Rules/Generate.hs b/hadrian/src/Rules/Generate.hs
index 32a9248eff..e19d058425 100644
--- a/hadrian/src/Rules/Generate.hs
+++ b/hadrian/src/Rules/Generate.hs
@@ -78,6 +78,7 @@ compilerDependencies = do
, "primop-vector-uniques.hs-incl"
, "primop-docs.hs-incl"
, "GHC/Platform/Constants.hs"
+ , "GHC/Settings/Config.hs"
]
generatedDependencies :: Expr [FilePath]
diff --git a/hadrian/src/Rules/Test.hs b/hadrian/src/Rules/Test.hs
index fea8a8f7b6..fe0aba04cc 100644
--- a/hadrian/src/Rules/Test.hs
+++ b/hadrian/src/Rules/Test.hs
@@ -153,7 +153,9 @@ testRules = do
let testGhc = testCompiler args
ghcPath <- getCompilerPath testGhc
whenJust (stageOf testGhc) $ \stg ->
- need . (:[]) =<< programPath (Context stg ghc vanilla)
+ need . (:[]) =<< programPath (Context stg ghc vanilla)
+ cwd <- liftIO $ IO.getCurrentDirectory
+ need [makeRelative cwd ghcPath]
need [root -/- ghcConfigProgPath]
cmd [FileStdout $ root -/- ghcConfigPath] (root -/- ghcConfigProgPath)
[ghcPath]
diff --git a/hadrian/src/Settings/Builders/Cabal.hs b/hadrian/src/Settings/Builders/Cabal.hs
index 19bc8c315e..1ef20147ae 100644
--- a/hadrian/src/Settings/Builders/Cabal.hs
+++ b/hadrian/src/Settings/Builders/Cabal.hs
@@ -9,31 +9,92 @@ import Flavour
import Packages
import Settings.Builders.Common
import qualified Settings.Builders.Common as S
+import Control.Exception (assert)
+import System.Directory
+import Settings.Program (programContext)
cabalBuilderArgs :: Args
-cabalBuilderArgs = builder (Cabal Setup) ? do
- verbosity <- expr getVerbosity
+cabalBuilderArgs = cabalSetupArgs <> cabalInstallArgs
+
+cabalInstallArgs :: Args
+cabalInstallArgs = builder (Cabal Install) ? do
+ pkg <- getPackage
+ root <- exprIO . makeAbsolute =<< getBuildRoot
+ let pgmName
+ | pkg == ghc = "ghc"
+ | pkg == hpcBin = "hpc"
+ | otherwise = pkgName pkg
+ assertNoBuildRootLeak $
+ mconcat [ arg $ "--store-dir=" ++ (root -/- "stage-cabal" -/- "cabal-store")
+ , arg "install"
+ , if isProgram pkg then arg $ "exe:" ++ pgmName else mconcat [arg "--lib", arg $ pkgName pkg]
+ , commonReinstallCabalArgs
+ ]
+
+-- | Checks that _build/stageN/lib/* doesn't leak into the arguments for
+-- reinstallable GHC. If this assert fails, then GHC probably isn't
+-- properly reinstallable.
+-- We allow "package.conf.d" however since we do need to read the package environment
+-- of the stage 2 compiler
+assertNoBuildRootLeak :: Args -> Args
+assertNoBuildRootLeak args = do
+ libPaths <- expr $ mapM stageLibPath [Stage0 ..]
+ xs <- args
+ pure $ assert (not $ any (\arg -> or [libPath `isInfixOf` arg && not ("package.conf.d" `isSuffixOf` arg)
+ | libPath <- libPaths]) xs)
+ xs
+
+commonReinstallCabalArgs :: Args
+commonReinstallCabalArgs = do
top <- expr topDirectory
- pkg <- getPackage
- path <- getContextPath
- stage <- getStage
- let prefix = "${pkgroot}" ++ (if windowsHost then "" else "/..")
- mconcat [ arg "configure"
- -- Don't strip libraries when cross compiling.
+ root <- getBuildRoot
+ threads <- shakeThreads <$> expr getShakeOptions
+ _pkg <- getPackage
+ compiler <- expr $ programPath =<< programContext Stage1 ghc
+ mconcat [ arg "--project-file"
+ , arg $ top -/- "cabal.project-reinstall"
+ , arg "--distdir"
+ , arg $ root -/- "stage-cabal" -/- "dist-newstyle"
+ , arg ("--ghc-option=-j" ++ show threads)
+ , arg $ "--install-method=copy"
+ , arg $ "--overwrite-policy=always"
+ , arg $ "--with-compiler=" ++ top -/- compiler
+ , arg $ "--installdir=" ++ (root -/- "stage-cabal" -/- "cabal-bin")
+ , arg $ "--package-env=" ++ (root -/- "stage-cabal" -/- "cabal-packages")
+ , arg "--enable-executable-dynamic"
+ , arg "--enable-library-vanilla"
+ ]
+
+cabalSetupArgs :: Args
+cabalSetupArgs = builder (Cabal Setup) ? do
+ top <- expr topDirectory
+ stage <- getStage
+ path <- getContextPath
+ mconcat [ arg "configure"
+ , arg "--distdir"
+ , arg $ top -/- path
+ , commonCabalArgs stage
+ , configureStageArgs
+ ]
+
+commonCabalArgs :: Stage -> Args
+commonCabalArgs stage = do
+ verbosity <- expr getVerbosity
+ pkg <- getPackage
+ let prefix = "${pkgroot}" ++ (if windowsHost then "" else "/..")
+ mconcat [ -- Don't strip libraries when cross compiling.
-- TODO: We need to set @--with-strip=(stripCmdPath :: Action FilePath)@,
-- and if it's @:@ disable stripping as well. As it is now, I believe
-- we might have issues with stripping on Windows, as I can't see a
-- consumer of 'stripCmdPath'.
-- TODO: See https://github.com/snowleopard/hadrian/issues/549.
- , flag CrossCompiling ? pure [ "--disable-executable-stripping"
+ flag CrossCompiling ? pure [ "--disable-executable-stripping"
, "--disable-library-stripping" ]
-- We don't want to strip the debug RTS
, S.package rts ? pure [ "--disable-executable-stripping"
, "--disable-library-stripping" ]
, arg "--cabal-file"
, arg $ pkgCabalFile pkg
- , arg "--distdir"
- , arg $ top -/- path
, arg "--ipid"
, arg "$pkg-$version"
, arg "--prefix"
@@ -55,7 +116,6 @@ cabalBuilderArgs = builder (Cabal Setup) ? do
, withBuilderArgs (GhcPkg Update stage)
, bootPackageDatabaseArgs
, libraryArgs
- , configureArgs
, bootPackageConstraints
, withStaged $ Cc CompileC
, notStage0 ? with (Ld stage)
@@ -97,9 +157,20 @@ libraryArgs = do
then "--enable-shared"
else "--disable-shared" ]
+-- | Configure args with stage/lib specific include directories and settings
+configureStageArgs :: Args
+configureStageArgs = do
+ let cFlags = getStagedSettingList ConfCcArgs
+ ldFlags = getStagedSettingList ConfGccLinkerArgs
+ mconcat [ configureArgs cFlags ldFlags
+ , notStage0 ? arg "--ghc-option=-ghcversion-file=rts/include/ghcversion.h"
+ ]
+
+
-- TODO: LD_OPTS?
-configureArgs :: Args
-configureArgs = do
+configureArgs :: Args -> Args -> Args
+configureArgs cFlags' ldFlags' = do
+
top <- expr topDirectory
pkg <- getPackage
let conf key expr = do
@@ -110,8 +181,11 @@ configureArgs = do
, getStagedSettingList ConfCcArgs
-- See https://github.com/snowleopard/hadrian/issues/523
, arg $ "-iquote"
- , arg $ top -/- pkgPath pkg ]
- ldFlags = ldArgs <> (getStagedSettingList ConfGccLinkerArgs)
+
+ , arg $ top -/- pkgPath pkg
+ , cFlags'
+ ]
+ ldFlags = ldArgs <> ldFlags'
cldFlags <- unwords <$> (cFlags <> ldFlags)
mconcat
[ conf "CFLAGS" cFlags
diff --git a/hadrian/src/Settings/Builders/Common.hs b/hadrian/src/Settings/Builders/Common.hs
index ad6f5c048a..54f4105529 100644
--- a/hadrian/src/Settings/Builders/Common.hs
+++ b/hadrian/src/Settings/Builders/Common.hs
@@ -5,7 +5,7 @@ module Settings.Builders.Common (
module Oracles.Setting,
module Settings,
module UserSettings,
- cIncludeArgs, ldArgs, cArgs, cWarnings,
+ cIncludeArgs, ldArgs, cArgs, cppArgs, cWarnings,
packageDatabaseArgs, bootPackageDatabaseArgs
) where
@@ -50,6 +50,9 @@ ldArgs = mempty
cArgs :: Args
cArgs = mempty
+cppArgs :: Args
+cppArgs = mempty
+
-- TODO: should be in a different file
cWarnings :: Args
cWarnings = mconcat
diff --git a/libraries/ghc-boot/Setup.hs b/libraries/ghc-boot/Setup.hs
new file mode 100644
index 0000000000..0995ee3f8f
--- /dev/null
+++ b/libraries/ghc-boot/Setup.hs
@@ -0,0 +1,120 @@
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE LambdaCase #-}
+module Main where
+
+import Distribution.Simple
+import Distribution.Simple.BuildPaths
+import Distribution.Types.LocalBuildInfo
+import Distribution.Verbosity
+import Distribution.Simple.Program
+import Distribution.Simple.Utils
+import Distribution.Simple.Setup
+
+import System.IO
+import System.Directory
+import System.FilePath
+import System.Environment
+import Control.Monad
+import Data.Char
+import GHC.ResponseFile
+
+main :: IO ()
+main = defaultMainWithHooks ghcHooks
+ where
+ ghcHooks = simpleUserHooks
+ { postConf = \args cfg pd lbi -> do
+ let verbosity = fromFlagOrDefault minBound (configVerbosity cfg)
+ ghcAutogen verbosity lbi
+ postConf simpleUserHooks args cfg pd lbi
+ }
+
+ghcAutogen :: Verbosity -> LocalBuildInfo -> IO ()
+ghcAutogen verbosity lbi@LocalBuildInfo{..} = do
+ -- Get compiler/ root directory from the cabal file
+ let Just compilerRoot = takeDirectory <$> pkgDescrFile
+
+ let platformHostFile = "GHC/Platform/Host.hs"
+ platformHostPath = autogenPackageModulesDir lbi </> platformHostFile
+ ghcVersionFile = "GHC/Version.hs"
+ ghcVersionPath = autogenPackageModulesDir lbi </> ghcVersionFile
+
+ -- Get compiler settings
+ settings <- lookupEnv "HADRIAN_SETTINGS" >>= \case
+ Just settings -> pure $ Left $ read settings
+ Nothing -> do
+ (ghc,withPrograms) <- requireProgram normal ghcProgram withPrograms
+ Right . read <$> getProgramOutput normal ghc ["--info"]
+
+ -- Write GHC.Platform.Host
+ createDirectoryIfMissingVerbose verbosity True (takeDirectory platformHostPath)
+ rewriteFileEx verbosity platformHostPath (generatePlatformHostHs settings)
+
+ -- Write GHC.Version
+ createDirectoryIfMissingVerbose verbosity True (takeDirectory ghcVersionPath)
+ rewriteFileEx verbosity ghcVersionPath (generateVersionHs settings)
+
+-- | Takes either a list of hadrian generated settings, or a list of settings from ghc --info,
+-- and keys in both lists, and looks up the value in the appropriate list
+getSetting :: Either [(String,String)] [(String,String)] -> String -> String -> Either String String
+getSetting settings kh kr = case settings of
+ Left settings -> go settings kh
+ Right settings -> go settings kr
+ where
+ go settings k = case lookup k settings of
+ Nothing -> Left (show k ++ " not found in settings: " ++ show settings)
+ Just v -> Right v
+
+generatePlatformHostHs :: Either [(String,String)] [(String,String)] -> String
+generatePlatformHostHs settings = either error id $ do
+ let getSetting' = getSetting settings
+ cHostPlatformArch <- getSetting' "hostPlatformArch" "target arch"
+ cHostPlatformOS <- getSetting' "hostPlatformOS" "target os"
+ return $ unlines
+ [ "module GHC.Platform.Host where"
+ , ""
+ , "import GHC.Platform.ArchOS"
+ , ""
+ , "hostPlatformArch :: Arch"
+ , "hostPlatformArch = " ++ cHostPlatformArch
+ , ""
+ , "hostPlatformOS :: OS"
+ , "hostPlatformOS = " ++ cHostPlatformOS
+ , ""
+ , "hostPlatformArchOS :: ArchOS"
+ , "hostPlatformArchOS = ArchOS hostPlatformArch hostPlatformOS"
+ ]
+
+generateVersionHs :: Either [(String,String)] [(String,String)] -> String
+generateVersionHs settings = either error id $ do
+ let getSetting' = getSetting settings
+ cProjectGitCommitId <- getSetting' "cProjectGitCommitId" "Project Git commit id"
+ cProjectVersion <- getSetting' "cProjectVersion" "Project version"
+ cProjectVersionInt <- getSetting' "cProjectVersionInt" "Project Version Int"
+
+ cProjectPatchLevel <- getSetting' "cProjectPatchLevel" "Project Patch Level"
+ cProjectPatchLevel1 <- getSetting' "cProjectPatchLevel1" "Project Patch Level1"
+ cProjectPatchLevel2 <- getSetting' "cProjectPatchLevel2" "Project Patch Level2"
+ return $ unlines
+ [ "module GHC.Version where"
+ , ""
+ , "import Prelude -- See Note [Why do we import Prelude here?]"
+ , ""
+ , "cProjectGitCommitId :: String"
+ , "cProjectGitCommitId = " ++ show cProjectGitCommitId
+ , ""
+ , "cProjectVersion :: String"
+ , "cProjectVersion = " ++ show cProjectVersion
+ , ""
+ , "cProjectVersionInt :: String"
+ , "cProjectVersionInt = " ++ show cProjectVersionInt
+ , ""
+ , "cProjectPatchLevel :: String"
+ , "cProjectPatchLevel = " ++ show cProjectPatchLevel
+ , ""
+ , "cProjectPatchLevel1 :: String"
+ , "cProjectPatchLevel1 = " ++ show cProjectPatchLevel1
+ , ""
+ , "cProjectPatchLevel2 :: String"
+ , "cProjectPatchLevel2 = " ++ show cProjectPatchLevel2
+ ]
diff --git a/libraries/ghc-boot/ghc-boot.cabal.in b/libraries/ghc-boot/ghc-boot.cabal.in
index fa86241b62..efac404501 100644
--- a/libraries/ghc-boot/ghc-boot.cabal.in
+++ b/libraries/ghc-boot/ghc-boot.cabal.in
@@ -24,9 +24,12 @@ description: This library is shared between GHC, ghc-pkg, and other boot
The package database format and this library are constructed in
such a way that while ghc-pkg depends on Cabal, the GHC library
and program do not have to depend on Cabal.
-build-type: Simple
+build-type: Custom
extra-source-files: changelog.md
+custom-setup
+ setup-depends: base >= 3 && < 5, Cabal >= 1.6 && <3.8, directory, filepath
+
source-repository head
type: git
location: https://gitlab.haskell.org/ghc/ghc.git
@@ -62,9 +65,9 @@ Library
, GHC.Lexeme
-- but done by Hadrian
- -- autogen-modules:
- -- GHC.Version
- -- GHC.Platform.Host
+ autogen-modules:
+ GHC.Version
+ GHC.Platform.Host
build-depends: base >= 4.7 && < 4.17,
binary == 0.8.*,
diff --git a/libraries/ghc-prim/ghc-prim.cabal b/libraries/ghc-prim/ghc-prim.cabal
index 1a0abfe262..dbe5d18667 100644
--- a/libraries/ghc-prim/ghc-prim.cabal
+++ b/libraries/ghc-prim/ghc-prim.cabal
@@ -20,7 +20,7 @@ source-repository head
subdir: libraries/ghc-prim
custom-setup
- setup-depends: base >= 4 && < 5, Cabal >= 1.23 && < 3.8
+ setup-depends: base >= 4 && < 5, process, filepath, directory, Cabal >= 1.23 && < 3.8
Library
default-language: Haskell2010
diff --git a/testsuite/driver/testlib.py b/testsuite/driver/testlib.py
index 8e286d32f8..bec08a490c 100644
--- a/testsuite/driver/testlib.py
+++ b/testsuite/driver/testlib.py
@@ -877,7 +877,7 @@ def normalise_win32_io_errors(name, opts):
def normalise_version_( *pkgs ):
def normalise_version__( str ):
- return re.sub('(' + '|'.join(map(re.escape,pkgs)) + ')-[0-9.]+',
+ return re.sub('(' + '|'.join(map(re.escape,pkgs)) + ')-[0-9.]+(-[0-9a-f]+)?',
'\\1-<VERSION>', str)
return normalise_version__
diff --git a/utils/genprimopcode/genprimopcode.cabal b/utils/genprimopcode/genprimopcode.cabal
index d6dc8b58ec..2dc581dc49 100644
--- a/utils/genprimopcode/genprimopcode.cabal
+++ b/utils/genprimopcode/genprimopcode.cabal
@@ -15,7 +15,7 @@ Description:
* an LaTeX document describing the primitive operations.
Category: Development
build-type: Simple
-cabal-version: >=1.10
+cabal-version: 2.0
Executable genprimopcode
Default-Language: Haskell2010
@@ -26,3 +26,4 @@ Executable genprimopcode
Syntax
Build-Depends: base >= 4 && < 5,
array
+ build-tool-depends: alex:alex >= 3.2.6, happy:happy >= 1.20.0
diff --git a/utils/hp2ps/hp2ps.cabal b/utils/hp2ps/hp2ps.cabal
index 1b48694564..482ea772b9 100644
--- a/utils/hp2ps/hp2ps.cabal
+++ b/utils/hp2ps/hp2ps.cabal
@@ -9,13 +9,16 @@ Synopsis: Heap Profile to PostScript converter
Description: XXX
Category: Development
build-type: Simple
+extra-source-files: AreaBelow.h AuxFile.h Axes.h Curves.h Defines.h Deviation.h
+ Dimensions.h Error.h HpFile.h Key.h Main.h Marks.h PsFile.h Reorder.h Scale.h
+ Shade.h TopTwenty.h TraceElement.h Utilities.h
Executable hp2ps
Default-Language: Haskell2010
Main-Is: Main.c
extra-libraries: m
C-Sources:
- AreaBelow.c Curves.c Error.c Main.c
+ AreaBelow.c Curves.c Error.c
Reorder.c TopTwenty.c AuxFile.c Deviation.c
HpFile.c Marks.c Scale.c TraceElement.c
Axes.c Dimensions.c Key.c PsFile.c Shade.c
diff --git a/utils/hpc/hpc-bin.cabal b/utils/hpc/hpc-bin.cabal
index 28cc2af49b..6e344de856 100644
--- a/utils/hpc/hpc-bin.cabal
+++ b/utils/hpc/hpc-bin.cabal
@@ -10,7 +10,7 @@ Synopsis: XXX
Description: XXX
Category: Development
build-type: Simple
-cabal-version: >=1.10
+cabal-version: 2.0
Executable hpc
Default-Language: Haskell2010
@@ -27,6 +27,8 @@ Executable hpc
HpcUtils
Paths_hpc_bin
+ autogen-modules: Paths_hpc_bin
+
Build-Depends: base >= 4 && < 5,
directory >= 1 && < 1.4,
filepath >= 1 && < 1.5,
@@ -34,3 +36,4 @@ Executable hpc
array >= 0.1 && < 0.6,
hpc >= 0.6.1 && < 0.7
+ build-tool-depends: happy:happy >= 1.20.0
diff --git a/utils/runghc/Main.hs b/utils/runghc/Main.hs
index 9ed650410d..5e447ed99f 100644
--- a/utils/runghc/Main.hs
+++ b/utils/runghc/Main.hs
@@ -110,7 +110,7 @@ parseRunGhcFlags = f mempty
printVersion :: IO ()
printVersion = do
- putStrLn ("runghc " ++ VERSION)
+ putStrLn ("runghc " ++ CURRENT_PACKAGE_VERSION )
printUsage :: IO ()
printUsage = do
diff --git a/utils/runghc/ghc.mk b/utils/runghc/ghc.mk
index 65a3ca88d6..76272d9d80 100644
--- a/utils/runghc/ghc.mk
+++ b/utils/runghc/ghc.mk
@@ -17,7 +17,6 @@ utils/runghc_dist-install_SHELL_WRAPPER = YES
utils/runghc_dist-install_INSTALL = YES
utils/runghc_dist-install_INSTALL_INPLACE = YES
utils/runghc_dist-install_INSTALL_SHELL_WRAPPER_NAME = runghc-$(ProjectVersion)
-utils/runghc_dist-install_EXTRA_HC_OPTS = -cpp -DVERSION="\"$(ProjectVersion)\""
# Be explicit about which version of ghc to call (#9054).
define utils/runghc_dist-install_INPLACE_SHELL_WRAPPER_EXTRA
diff --git a/utils/runghc/runghc.cabal.in b/utils/runghc/runghc.cabal.in
index ffe75756f7..3afeb425ee 100644
--- a/utils/runghc/runghc.cabal.in
+++ b/utils/runghc/runghc.cabal.in
@@ -32,4 +32,4 @@ Executable runghc
filepath
if !os(windows)
- build-depends: unix \ No newline at end of file
+ build-depends: unix
diff --git a/utils/touchy/touchy.cabal b/utils/touchy/touchy.cabal
index 21a774b1fa..5c28c664fc 100644
--- a/utils/touchy/touchy.cabal
+++ b/utils/touchy/touchy.cabal
@@ -13,4 +13,3 @@ build-type: Simple
Executable touchy
Default-Language: Haskell2010
Main-Is: touchy.c
- C-Sources: touchy.c
diff --git a/utils/unlit/unlit.cabal b/utils/unlit/unlit.cabal
index e49fd8558b..0707d5d95a 100644
--- a/utils/unlit/unlit.cabal
+++ b/utils/unlit/unlit.cabal
@@ -9,9 +9,10 @@ Synopsis: Literate program filter
Description: XXX
Category: Development
build-type: Simple
+extra-source-files: fs.h
Executable unlit
Default-Language: Haskell2010
Main-Is: unlit.c
- C-Sources: unlit.c, fs.c
+ C-Sources: fs.c
Includes: fs.h