Remove the git clone step, preparing for the merge
[hadrian.git] / README.md
1 Hadrian
2 =======
3
4 [![Linux & OS X status](https://img.shields.io/travis/snowleopard/hadrian/master.svg?label=Linux%20%26%20OS%20X)](https://travis-ci.org/snowleopard/hadrian) [![Windows status](https://img.shields.io/appveyor/ci/snowleopard/hadrian/master.svg?label=Windows)](https://ci.appveyor.com/project/snowleopard/hadrian) [![OS X status](https://img.shields.io/circleci/project/github/snowleopard/hadrian.svg?label=OS%20X)](https://circleci.com/gh/snowleopard/hadrian)
5
6 Hadrian is a new build system for the [Glasgow Haskell Compiler][ghc]. It is based
7 on [Shake][shake] and we hope that it will soon replace the current
8 [Make-based build system][make]. If you are curious about the rationale behind the
9 project and the architecture of the build system you can find more details in
10 this [Haskell Symposium 2016 paper][paper] and this [Haskell eXchange 2016 talk][talk].
11
12 The new build system can work side-by-side with the existing build system. Note, there is
13 some interaction between them: they put (some) build results in the same directories,
14 e.g. the resulting GHC is `inplace/bin/ghc-stage2`.
15
16 Your first build
17 ----------------
18
19 Beware, the build system is in the alpha development phase. Things are shaky and sometimes
20 break; there are numerous [known issues][issues]. Not afraid? Then put on the helmet and
21 run the following command from root of the GHC tree:
22
23 ```
24 hadrian/build.sh -j
25 ```
26
27 or on Windows:
28
29 ```
30 hadrian/build.bat -j
31 ```
32
33 Here flag `-j` enables parallelism and is optional. We will further refer to the build script
34 simply as `build`. Note that Hadrian runs the `boot` and `configure` scripts automatically when
35 needed. Use `--skip-configure` to suppress this behaviour (see the overview of command line
36 flags below).
37
38 Notes:
39
40 * If the default build script doesn't work, you might want to give a try to another one, e.g. based
41 on Cabal sandboxes (`build.cabal.*`), Stack (`build.stack.*`) or the global package database
42 (`build.global-db.*`). Also see [instructions for building GHC on Windows using Stack][windows-build]. 
43
44 * Hadrian is written in Haskell and depends on the following packages:
45 `ansi-terminal extra mtl quickcheck shake`.
46
47 * If you have never built GHC before, start with the [preparation guide][ghc-preparation].
48
49 Using the build system
50 ----------------------
51 Once your first build is successful, simply run `build` to rebuild. Build results
52 are placed into `_build` and `inplace` directories.
53
54 #### Command line flags
55
56 In addition to standard Shake flags (try `--help`), the build system
57 currently supports several others:
58 * `--flavour=FLAVOUR`: choose a build flavour. The following settings are currently supported:
59 `default`, `quick`, `quickest`, `perf`, `prof`, `devel1` and `devel2`. As an example, the
60 `quickest` flavour adds `-O0` flag to all GHC invocations and builds libraries only in the
61 `vanilla` way, which speeds up builds by 3-4x. Build flavours are documented
62 [here](https://github.com/snowleopard/hadrian/blob/master/doc/flavours.md).
63
64 * `--freeze1`: freeze Stage1 GHC, i.e. do not rebuild it even if some of its source files
65 are out-of-date. This allows to significantly reduce the rebuild time when you are working
66 on a feature that affects both Stage1 and Stage2 compilers, but may lead to incorrect
67 build results. To unfreeze Stage1 GHC simply drop the `--freeze1` flag and Hadrian will
68 rebuild all out-of-date files.
69
70 * `--haddock`: build Haddock documentation.
71
72 * `--integer-simple`: build GHC using the `integer-simple` integer library (instead
73 of `integer-gmp`).
74
75 * `--progress-colour=MODE`: choose whether to use colours when printing build progress
76 info. There are three settings: `never` (do not use colours), `auto` (attempt to detect
77 whether the console supports colours; this is the default setting), and `always` (use
78 colours).
79
80 * `--progress-info=STYLE`: choose how build progress info is printed. There are four
81 settings: `none`, `brief` (one line per build command; this is the default setting),
82 `normal` (typically a box per build command), and `unicorn` (when `normal` just won't do).
83
84 * `--skip-configure`: use this flag to suppress the default behaviour of Hadrian that
85 runs the `boot` and `configure` scripts automatically when needed, so that you don't have
86 to remember to run them manually. With `--skip-configure` you will need to manually run:
87     ```bash
88     ./boot
89     ./configure # On Windows run ./configure --enable-tarballs-autodownload
90     ```
91     as you normally do when using `make`. Beware, by default Hadrian may do network I/O on
92 Windows to download necessary tarballs, which may sometimes be undesirable; `--skip-configure`
93 is your friend in such cases.
94
95 * `--split-objects`: generate split objects, which are switched off by default. Due to
96 a GHC [bug][ghc-split-objs-bug], you need a full clean rebuild when using this flag.
97
98 * `--verbose`: run Hadrian in verbose mode. In particular this prints diagnostic messages
99 by Shake oracles.
100
101 #### User settings
102
103 The Make-based build system uses `mk/build.mk` to specify user build settings. We
104 use `hadrian/UserSettings.hs` for the same purpose, see [documentation](doc/user-settings.md).
105
106 #### Clean and full rebuild
107
108 * `build clean` removes all build artefacts.
109
110 * `build -B` forces Shake to rerun all rules, even if the previous build results are
111 are still up-to-date.
112
113 #### Documentation
114
115 To build GHC documentation, run `build docs --haddock`. The `docs` is the documentation
116 target, and the `--haddock` flag enables building Haddock. This is a temporary solution
117 and [we plan](https://github.com/snowleopard/hadrian/issues/414) to simplify this command
118 to `build docs`.
119
120 #### Source distribution
121
122 To build a GHC source distribution tarball, run Hadrian with the `sdist-ghc` target.
123
124 #### Installation
125
126 To build and install GHC artifacts, run the `install` target.
127
128 By default, GHC will be installed to the specified _prefix_ path on your system,
129 relative to the root of the file system. For example on UNIX, GHC will be installed
130 to `/usr/local/bin`. By setting the command line flag `--install-destdir=[DESTDIR]`,
131 you can install GHC to path `DESTDIR/<prefix>` instead. Make sure you use correct
132 absolute path as `DESTDIR` on Windows, e.g. `C:/path`, which installs GHC
133 into `C:/path/usr/local`.
134
135 #### Testing
136
137 * `build validate` runs GHC tests by simply executing `make fast` in `testsuite/tests`
138 directory. This can be used instead of `sh validate --fast --no-clean` in the existing
139 build system. Note: this will rebuild Stage2 GHC, `ghc-pkg` and `hpc` if they are out of date.
140
141 * `build test` runs GHC tests by calling the `testsuite/driver/runtests.py` python
142 script with appropriate flags. The current implementation is limited and cannot
143 replace the `validate` script (see [#187][validation-issue]).
144
145 * `build selftest` runs tests of the build system. Current test coverage is close to
146 zero (see [#197][test-issue]).
147
148 Current limitations
149 -------------------
150 The new build system still lacks many important features:
151 * Validation is not implemented: [#187][validation-issue].
152 * Dynamic linking on Windows is not supported [#343][dynamic-windows-issue].
153 * There is no support for binary distribution: [#219][bin-dist-issue].
154
155 Check out [milestones] to see when we hope to resolve the above limitations.
156
157 How to contribute
158 -----------------
159
160 The best way to contribute is to try the new build system, report the issues
161 you found, and attempt to fix them. Please note: the codebase is very unstable
162 at present and we expect a lot of further refactoring. If you would like to
163 work on a particular issue, please let everyone know by adding a comment about
164 this. The issues that are currently on the critical path and therefore require
165 particular attention are listed in [#239](https://github.com/snowleopard/hadrian/issues/239).
166 Also have a look at [projects](https://github.com/snowleopard/hadrian/projects)
167 where open issues and pull requests are grouped into categories.
168
169 Acknowledgements
170 ----------------
171
172 I started this project as part of my 6-month research visit to Microsoft
173 Research Cambridge, which was funded by Newcastle University, EPSRC, and
174 Microsoft Research. I would like to thank Simon Peyton Jones, Neil Mitchell
175 and Simon Marlow for kick-starting the project and for their guidance.
176 Zhen Zhang has done fantastic work on Hadrian as part of his Summer of
177 Haskell 2017 [project](https://summer.haskell.org/ideas.html#hadrian-ghc),
178 solving a few heavy and long-overdue issues. Last but not least, big thanks
179 to all other project [contributors][contributors], who helped me endure and
180 enjoy the project.
181
182 [ghc]: https://en.wikipedia.org/wiki/Glasgow_Haskell_Compiler
183 [shake]: https://github.com/ndmitchell/shake
184 [make]: https://ghc.haskell.org/trac/ghc/wiki/Building/Architecture
185 [paper]: https://www.staff.ncl.ac.uk/andrey.mokhov/Hadrian.pdf
186 [talk]: https://skillsmatter.com/skillscasts/8722-meet-hadrian-a-new-build-system-for-ghc
187 [issues]: https://github.com/snowleopard/hadrian/issues
188 [ghc-preparation]: https://ghc.haskell.org/trac/ghc/wiki/Building/Preparation
189 [ghc-windows-quick-build]: https://ghc.haskell.org/trac/ghc/wiki/Building/Preparation/Windows#AQuickBuild
190 [windows-build]: https://github.com/snowleopard/hadrian/blob/master/doc/windows.md
191 [ghc-split-objs-bug]: https://ghc.haskell.org/trac/ghc/ticket/11315
192 [test-issue]: https://github.com/snowleopard/hadrian/issues/197
193 [validation-issue]: https://github.com/snowleopard/hadrian/issues/187
194 [dynamic-windows-issue]: https://github.com/snowleopard/hadrian/issues/343
195 [bin-dist-issue]: https://github.com/snowleopard/hadrian/issues/219
196 [milestones]: https://github.com/snowleopard/hadrian/milestones
197 [contributors]: https://github.com/snowleopard/hadrian/graphs/contributors