Skip to content
This repository has been archived by the owner on Aug 2, 2020. It is now read-only.

Preliminary bindist #558

Merged
merged 4 commits into from
Apr 3, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 12 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,18 @@ are currently not supported.

#### Source distribution

To build a GHC source distribution tarball, run `build sdist-ghc`.
To build a GHC source distribution tarball, run `build source-dist`.

#### Binary distribution

To build a GHC binary distribution, run `build binary-dist`. The resulting
tarball contains just enough to support the

``` sh
$ ./configure [--prefix=PATH] && make install
```

workflow, for now.

#### Testing

Expand Down
1 change: 1 addition & 0 deletions cfg/system.config.in
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

alex = @AlexCmd@
ar = @ArCmd@
autoreconf = autoreconf
cc = @CC@
happy = @HappyCmd@
hs-cpp = @HaskellCPPCmd@
Expand Down
1 change: 1 addition & 0 deletions hadrian.cabal
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ executable hadrian
, Oracles.Setting
, Oracles.ModuleFiles
, Rules
, Rules.BinaryDist
, Rules.Clean
, Rules.Compile
, Rules.Configure
Expand Down
4 changes: 4 additions & 0 deletions src/Builder.hs
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@ instance NFData HaddockMode
-- @GhcPkg Stage1@ is the one built in Stage0.
data Builder = Alex
| Ar ArMode Stage
| Autoreconf FilePath
| DeriveConstants
| Cc CcMode Stage
| Configure FilePath
Expand Down Expand Up @@ -173,6 +174,7 @@ instance H.Builder Builder where

runtimeDependencies :: Builder -> Action [FilePath]
runtimeDependencies = \case
Autoreconf dir -> return [dir -/- "configure.ac"]
Configure dir -> return [dir -/- "configure"]

Ghc _ Stage0 -> return []
Expand Down Expand Up @@ -231,6 +233,7 @@ instance H.Builder Builder where

Ar Unpack _ -> cmd echo [Cwd output] [path] buildArgs

Autoreconf dir -> cmd echo [Cwd dir] [path] buildArgs
Configure dir -> do
-- Inject /bin/bash into `libtool`, instead of /bin/sh,
-- otherwise Windows breaks. TODO: Figure out why.
Expand Down Expand Up @@ -282,6 +285,7 @@ systemBuilderPath builder = case builder of
Alex -> fromKey "alex"
Ar _ Stage0 -> fromKey "system-ar"
Ar _ _ -> fromKey "ar"
Autoreconf _ -> fromKey "autoreconf"
Cc _ Stage0 -> fromKey "system-cc"
Cc _ _ -> fromKey "cc"
-- We can't ask configure for the path to configure!
Expand Down
1 change: 1 addition & 0 deletions src/Builder.hs-boot
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ data HaddockMode = BuildPackage | BuildIndex

data Builder = Alex
| Ar ArMode Stage
| Autoreconf FilePath
| DeriveConstants
| Cc CcMode Stage
| Configure FilePath
Expand Down
6 changes: 4 additions & 2 deletions src/Rules.hs
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,16 @@ import qualified Hadrian.Oracles.TextFile
import Expression
import GHC
import qualified Oracles.ModuleFiles
import qualified Rules.BinaryDist
import qualified Rules.Compile
import qualified Rules.PackageData
import qualified Rules.Configure
import qualified Rules.Dependencies
import qualified Rules.Documentation
import qualified Rules.Generate
import qualified Rules.Configure
import qualified Rules.Gmp
import qualified Rules.Libffi
import qualified Rules.Library
import qualified Rules.PackageData
import qualified Rules.Program
import qualified Rules.Register
import Settings
Expand Down Expand Up @@ -122,6 +123,7 @@ packageRules = do

buildRules :: Rules ()
buildRules = do
Rules.BinaryDist.bindistRules
Rules.Configure.configureRules
Rules.Generate.copyRules
Rules.Generate.generateRules
Expand Down
121 changes: 121 additions & 0 deletions src/Rules/BinaryDist.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
module Rules.BinaryDist where

import Expression
import GHC
import Oracles.Setting
import Settings
import Target
import Utilities

bindistRules :: Rules ()
bindistRules = do
root <- buildRootRules
phony "binary-dist" $ do
-- We 'need' all binaries and libraries
targets <- mapM pkgTarget =<< stagePackages Stage1
need targets

version <- setting ProjectVersion
targetPlatform <- setting TargetPlatformFull

let ghcBuildDir = root -/- stageString Stage1
bindistFilesDir = root -/- "bindist" -/- ghcVersionPretty
ghcVersionPretty = "ghc-" ++ version ++ "-" ++ targetPlatform

-- we create the bindist directory at <root>/bindist/ghc-X.Y.Z-platform/
-- and populate it with a stage2 build
createDirectory bindistFilesDir
copyDirectory (ghcBuildDir -/- "bin") bindistFilesDir
copyDirectory (ghcBuildDir -/- "lib") bindistFilesDir
{- SHOULD WE SHIP DOCS?
need ["docs"]
copyDirectory (root -/- "docs") bindistFilesDir
-}

-- we then 'need' all the files necessary to configure and install
-- (as in, './configure [...] && make install') this build on some
-- other machine.
need $ map (bindistFilesDir -/-)
(["configure", "Makefile"] ++ bindistInstallFiles)

-- finally, we create the archive, at
-- <root>/bindist/ghc-X.Y.Z-platform.tar.xz
command [Cwd $ root -/- "bindist"] "tar"
[ "-c", "--xz", "-f"
, ghcVersionPretty <.> "tar.xz"
, ghcVersionPretty
]

-- prepare binary distribution configure script
-- (generated under <ghc root>/distrib/configure by 'autoreconf')
root -/- "bindist" -/- "ghc-*" -/- "configure" %> \configurePath -> do
ghcRoot <- topDirectory
copyFile (ghcRoot -/- "aclocal.m4") (ghcRoot -/- "distrib" -/- "aclocal.m4")
buildWithCmdOptions [] $
target (vanillaContext Stage1 ghc) (Autoreconf $ ghcRoot -/- "distrib") [] []
-- we clean after ourselves, moving the configure script we generated in
-- our bindist dir
removeFile (ghcRoot -/- "distrib" -/- "aclocal.m4")
moveFile (ghcRoot -/- "distrib" -/- "configure") configurePath

-- generate the Makefile that enables the "make install" part
root -/- "bindist" -/- "ghc-*" -/- "Makefile" %> \makefilePath ->
writeFile' makefilePath bindistMakefile

-- copy over the various configure-related files needed for a working
-- './configure [...] && make install' workflow
-- (see the list of files needed in the 'binary-dist' rule above, before
-- creating the archive).
forM_ bindistInstallFiles $ \file ->
root -/- "bindist" -/- "ghc-*" -/- file %> \dest -> do
ghcRoot <- topDirectory
copyFile (ghcRoot -/- fixup file) dest

where fixup f
| f `elem` ["INSTALL", "README"] = "distrib" -/- f
| otherwise = f

-- | A list of files that allow us to support a simple
-- @./configure [--prefix=PATH] && make install@ workflow.
--
-- NOTE: the list surely is incomplete
bindistInstallFiles :: [FilePath]
bindistInstallFiles =
[ "config.sub", "config.guess", "install-sh"
, "mk" -/- "config.mk.in", "mk" -/- "install.mk.in"
, "settings.in", "README", "INSTALL"
]

-- | Auxiliary function that gives us a 'Filepath' we can 'need' for
-- all libraries and programs that are needed for a complete build.
--
-- For libraries, it returns the path to the .conf file in the package db.
-- For executables, it returns the path to the compiled executable.
pkgTarget :: Package -> Action FilePath
pkgTarget pkg
| isLibrary pkg = pkgConfFile (Context Stage1 pkg $ read "v")
| otherwise = programPath =<< programContext Stage1 pkg

-- TODO: augment this makefile to match the various parameters that
-- the current bindist scripts support.
-- | A trivial makefile that only takes @$prefix@ into account,
-- and not e.g @$datadir@ (for docs) and other variables, yet.
bindistMakefile :: String
bindistMakefile = unlines
[ "MAKEFLAGS += --no-builtin-rules"
, ".SUFFIXES:"
, ""
, "include mk/install.mk"
, ""
, ".PHONY: default"
, "default:"
, "\t@echo 'Run \"make install\" to install'"
, "\t@false"
, ""
, ".PHONY: install"
, "install:"
, "\tmkdir -p $(prefix)"
, "\tcp settings lib/settings"
, "\tcp -R bin $(prefix)/"
, "\tcp -R lib $(prefix)/"
]
2 changes: 1 addition & 1 deletion src/Rules/SourceDist.hs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import Rules.Clean

sourceDistRules :: Rules ()
sourceDistRules = do
"sdist-ghc" ~> do
"source-dist" ~> do
-- We clean the source tree first.
-- See https://github.com/snowleopard/hadrian/issues/384.
-- TODO: Do we still need to clean the tree?
Expand Down