ghc-make: Accelerated version of ghc --make

[ bsd3, development, program ] [ Propose Tags ] [ Report a vulnerability ]

The ghc-make program can be used as a drop-in replacement for ghc. This program targets two use cases:

  • If a flag such as -j4 is passed, the modules will be compiled in parallel. If the available parallelism is greater than a factor of 3, the build will probably run faster.

  • If there is no work to do (i.e. the compiled files are up-to-date), the build will run faster, sometimes significantly so.

See the readme for full details: https://github.com/ndmitchell/ghc-make#readme.


[Skip to Readme]

Downloads

Maintainer's Corner

Package maintainers

For package maintainers and hackage trustees

Candidates

  • No Candidates
Versions [RSS] 0.1, 0.2, 0.2.1, 0.3, 0.3.1, 0.3.2, 0.3.3
Change log CHANGES.txt
Dependencies base (>=4 && <5), process (>=1.0), shake (>=0.16), unordered-containers (>=0.2.1) [details]
Tested with ghc ==8.2.1, ghc ==8.0.2, ghc ==7.10.3, ghc ==7.8.4, ghc ==7.6.3, ghc ==7.4.2
License BSD-3-Clause
Copyright Neil Mitchell 2013-2017
Author Neil Mitchell <ndmitchell@gmail.com>
Maintainer Neil Mitchell <ndmitchell@gmail.com>
Category Development
Home page https://github.com/ndmitchell/ghc-make#readme
Bug tracker https://github.com/ndmitchell/ghc-make/issues
Source repo head: git clone https://github.com/ndmitchell/ghc-make.git
Uploaded by NeilMitchell at 2017-11-09T13:59:17Z
Distributions NixOS:0.3.3
Reverse Dependencies 1 direct, 0 indirect [details]
Executables ghc-make
Downloads 7396 total (6 in the last 30 days)
Rating (no votes yet) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Docs not available [build log]
Last success reported on 2017-11-09 [all 3 reports]

Readme for ghc-make-0.3.3

[back to package description]

ghc-make Hackage version Linux Build Status

An alternative to ghc --make which supports parallel compilation of modules and runs faster when nothing needs compiling.

How do I use it?

Install ghc-make (cabal update && cabal install ghc-make). Then replace your calls to ghc my -arguments with ghc-make my -arguments. Almost all arguments and flags supported by ghc are supported by ghc-make - it is intended as a drop-in replacement.

What should I see?

Imagine you have a script that runs ghc --make MyCode && ./MyCode and that running ghc --make when nothing needs compiling takes 5 seconds (I have projects that take as long as 23 seconds). If you switch to ghc-make MyCode && ./MyCode then when nothing needs compiling it will take almost no time (less than 0.2 seconds). If things need compiling it will take the compilation time plus the time with ghc --make when nothing needs compiling (in this example, 5 seconds extra). If the source changes on less than half the executions you will see a speedup.

The ghc-make program produces a handful of metadata files which are stored with the .ghc-make prefix. These files will be placed in the current directory, or the -hidir/-odir directory if specified.

How do I turn on parallel module compilation?

Pass -j4 to build using 4 cores. In my experience you usually need a parallel factor of 3x to match ghc --make on a single core, since ghc --make does a lot of caching that is unavailable to ghc-make.

To use ghc-make with Cabal, try cabal build --with-ghc=ghc-make --ghc-options=-j4. (This technique is due to the ghc-parmake project, which also does parallel ghc --make compiles.)

What GHC features are unsupported?

Anything not captured by ghc -M will not be tracked, including dependencies registered by Template Haskell and #include files.

Why is it faster?

When GHC does a compilation check it runs any preprocessors and parses the Haskell files, which can be slow. When ghc-make does a compilation check it reads a list of file names and modification times from a database and checks the times still match, and if they do, it does nothing.

Why is it slower?

When things have changed ghc-make also runs ghc-pkg list and ghc -M to get a list of dependencies. To produce that list, GHC has to run any preprocessors and parse the Haskell files. If GHC was able to produce the dependencies while building (as gcc is able to do) then ghc-make would never be noticeably slower.

How is it implemented?

This program uses the Shake library for dependency tracking and ghc --make for building.

To pass options to the underlying Shake build system prefix them with --shake, for example --shake--report=- will write a profile report to stdout and --shake--help will list the available Shake options.

Should GHC just use Shake directly?

Should large and important project use authors pet library? Yes, of course 😃. If ghc --make used Shake it is likely their builds with no recompilation would be just as fast as ghc-make, and they could take advantage of parallel compilation with no additional overhead. However, integrating Shake into such a large code base would be a lot of work - perhaps you should offer to help the GHC team?