# The GHC Commentary - Mindboggling Makefiles

The size and structure of GHC's makefiles makes it quite easy to scream out loud - in pain - during the process of tracking down problems in the make system or when attempting to alter it. GHC's Building Guide has valuable information on the makefile architecture.

#### A maze of twisty little passages, all alike

The `fptools/` toplevel and the various project directories contain not only a `Makefile` each, but 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.

Last modified: Wed Aug 22 16:46:33 GMT Daylight Time 2001