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