|Version 1 (modified by megacz, 4 years ago) (diff)|
Source Tree Layout
An overview of the source tree may be found here.
Build System Basics
Detailed information about the build system may be found here; what follows is a quick overview, highlighting the areas where GHC's build system diverges substantially from the way make is used in most other projects.
Most projects keep the parts of their build machinery a files called Makefile found in many/most subdirectories of the source tree. GHC uses the filename ghc.mk instead; you'll find a file with this name in quite a number of subdirectories.
The following two paragraphs were copied verbatim from the old commentary and may be slightly innaccurate (please delete this message if not)
There are subdirectories of name mk/ at various levels that contain rules, targets, and so on specific to a project - or, in the case of the toplevel, the default rules for the whole system. Each mk/ directory contains a file boilerplate.mk that ties the various other makefiles together. Files called target.mk, paths.mk, and suffix.mk contain make targets, definitions of variables containing paths, and suffix rules, respectively.
One particularly nasty trick used in this hierarchy of makefiles is the way in which the variable $(TOP) is used. AFAIK, $(TOP) always points to a directory containing an mk/ subdirectory; however, it not necessarily points to the toplevel fptools/ directory. For example, within the GHC subtree, $(TOP) points to fptools/ghc/. However, some of the makefiles in fptools/ghc/mk/ will then temporarily redefine $(TOP) to point a level higher (i.e., to fptools/) while they are including the toplevel boilerplate. After that $(TOP) is redefined to whatever value it had before including makefiles from higher up in the hierarchy.
The Coding style guidelines may be found on the wiki.