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.
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