[commit: ghc] wip/nfs-locking: Add user settings documentation (b56f4eb)

git at git.haskell.org git at git.haskell.org
Fri Oct 27 00:12:52 UTC 2017


Repository : ssh://git@git.haskell.org/ghc

On branch  : wip/nfs-locking
Link       : http://ghc.haskell.org/trac/ghc/changeset/b56f4eb4034f51dbb5364ff57752900c8d9f417b/ghc

>---------------------------------------------------------------

commit b56f4eb4034f51dbb5364ff57752900c8d9f417b
Author: Andrey Mokhov <andrey.mokhov at gmail.com>
Date:   Sat May 14 13:58:21 2016 +0100

    Add user settings documentation
    
    See #56, #245.


>---------------------------------------------------------------

b56f4eb4034f51dbb5364ff57752900c8d9f417b
 doc/user-settings.md | 124 +++++++++++++++++++++++++++++++++++++++++++++++++++
 src/Settings/User.hs |  20 ++++-----
 2 files changed, 134 insertions(+), 10 deletions(-)

diff --git a/doc/user-settings.md b/doc/user-settings.md
new file mode 100644
index 0000000..a7f1469
--- /dev/null
+++ b/doc/user-settings.md
@@ -0,0 +1,124 @@
+# User settings
+
+Users can customise Hadrian by specifying user build settings in file
+`src/Settings/User.hs`. Here we document currently supported settings.
+
+## Build directory
+
+Hadrian puts build results into `_build` directory by default, which is
+controlled by `buildRootPath`:
+```haskell
+-- | All build artefacts are stored in 'buildRootPath' directory.
+buildRootPath :: FilePath
+buildRootPath = "_build"
+```
+
+## Command line arguments
+
+One of the key features of Hadrian is that users can modify any build command by
+changing `userArgs`. The build system will detect the change and will rerun all
+affected build rules during the next build, without requiring a full rebuild.
+
+As an example, here is how to pass an extra argument `-O0` to all invocations of
+GHC when compiling package `cabal`:
+```haskell
+-- | Control user-specific command line arguments.
+userArgs :: Args
+userArgs = builder Ghc ? package cabal ? arg "-O0"
+```
+Builders such as `Ghc` are defined in `src/Builder.hs`, and all packages that
+are currently built as part of the GHC are defined in `src/GHC.hs` (also see
+`src/Package.hs`).
+
+It is possible to specify several custom command line arguments combining the
+list with `mconcat`:
+```haskell
+userArgs :: Args
+userArgs = mconcat 
+    [ builder Ghc ? package cabal ? arg "-O0"
+    , package rts ? input "//Evac\_thr.c" ? append [ "-DPARALLEL\_GC", "-Irts/sm" ]
+    , builder Ghc ? output "//Prelude.\*" ? remove ["-Wall", "-fwarn-tabs"] ]
+```
+The above example also demostrates the use of `append` for adding more than one
+argument and `remove` for removing arguments that Hadrian uses by default. It is
+possible to match any combination of the current `builder`, `stage`, `package`,
+`way`, `input` and `output` using predicates. File patterns such as
+`"//Prelude.\*"` can be used when matching input and output files where `//`
+matches an arbitrary number of path components and `\*` matches an entire path component, excluding any separators.
+
+## Packages
+
+To add or remove a package from a particular build stage, use `userPackages`. As
+an example, below we add package `base` to Stage0 and remove package `haskeline`
+from Stage1:
+```haskell
+-- | Control which packages get to be built.
+userPackages :: Packages
+userPackages = mconcat
+    [ stage0 ? append [base]
+    , stage1 ? remove [haskeline] ]
+```
+If you are working on a new GHC package you need to let Hadrian know about it
+by setting `userKnownPackages`:
+```haskell
+-- | Add new user-defined packages.
+userKnownPackages :: [Package]
+userKnownPackages = []
+```
+To control which integer library to use when builing GHC, set `integerLibrary`:
+```haskell
+-- | Choose the integer library: integerGmp or integerSimple.
+integerLibrary :: Package
+integerLibrary = integerGmp
+```
+
+## Build ways
+
+Libraries can be built in a number of ways, such as `vanilla`, `profiling` (with 
+profiling information enabled), and many others as defined in `src/Way.hs`. To
+control which ways particular packages are built, set `userLibraryWays` and
+`userRtsWays`. As an example, below we remove `dynamic` from the list of library
+ways and keep `rts` package ways unchanged:
+```haskell
+-- | Control which ways library packages are built.
+userLibraryWays :: Ways
+userLibraryWays = remove [dynamic]
+
+-- | Control which ways the 'rts' package is built.
+userRtsWays :: Ways
+userRtsWays = mempty
+```
+
+## Verbose command lines 
+
+By default Hadrian does not print full command lines during the build process
+and instead prints short human readable digests for each executed command. It is
+possible to suppress this behaviour completely or partially using
+`verboseCommands` setting:
+```haskell
+-- | Set to True to print full command lines during the build process. Note,
+-- this is a Predicate, hence you can enable verbose output for a chosen package
+-- only, e.g.: verboseCommands = package ghcPrim
+verboseCommands :: Predicate
+verboseCommands = return False
+```
+For example, to print the full command lines used to compile GHC executables,
+set `verboseCommands` to:
+```haskell
+verboseCommands :: Predicate
+verboseCommands = input "ghc/Main.hs"
+```
+Below are a few other examples:
+```haskell
+-- Print command lines for all Ghc Link invocations:
+verboseCommands = builder (Ghc Link)
+
+-- Print command lines when compiling files in package compiler using Gcc:
+verboseCommands = builder (Gcc Compile) &&^ package compiler 
+
+-- Use patterns when matching files:
+verboseCommands = file "//rts/sm/*" &&^ way threaded
+
+-- Show all commands:
+verboseCommands = return True
+```
\ No newline at end of file
diff --git a/src/Settings/User.hs b/src/Settings/User.hs
index 0893579..cc48684 100644
--- a/src/Settings/User.hs
+++ b/src/Settings/User.hs
@@ -16,31 +16,31 @@ import Settings.Default
 buildRootPath :: FilePath
 buildRootPath = "_build"
 
--- Control user-specific settings
+-- | Control user-specific command line arguments.
 userArgs :: Args
 userArgs = builder Ghc ? remove ["-Wall", "-fwarn-tabs"]
 
--- Control which packages get to be built
+-- | Control which packages get to be built.
 userPackages :: Packages
 userPackages = mempty
 
--- Add new user-defined packages
+-- | Add new user-defined packages.
 userKnownPackages :: [Package]
 userKnownPackages = []
 
--- | Control which ways library packages are built
+-- | Choose the integer library: integerGmp or integerSimple.
+integerLibrary :: Package
+integerLibrary = integerGmp
+
+-- | Control which ways library packages are built.
 -- FIXME: skip dynamic since it's currently broken #4
 userLibraryWays :: Ways
 userLibraryWays = remove [dynamic]
 
--- | Control which ways the 'rts' package is built
+-- | Control which ways the 'rts' package is built.
 userRtsWays :: Ways
 userRtsWays = mempty
 
--- | Choose the integer library: integerGmp or integerSimple
-integerLibrary :: Package
-integerLibrary = integerGmp
-
 -- | User-defined flags. Note the following type semantics:
 -- * Bool: a plain Boolean flag whose value is known at compile time
 -- * Action Bool: a flag whose value can depend on the build environment
@@ -79,7 +79,7 @@ buildHaddock = return cmdBuildHaddock
 
 -- | Set to True to print full command lines during the build process. Note,
 -- this is a Predicate, hence you can enable verbose output for a chosen package
--- only, e.g.: verboseCommands = package ghcPrim
+-- only, e.g.: verboseCommands = package ghcPrim.
 verboseCommands :: Predicate
 verboseCommands = return False
 



More information about the ghc-commits mailing list