The C pre-processor `cpp' is run over your Haskell code only if the
`-cpp' option is given. Unless you are
building a large system with significant doses of conditional
compilation, you really shouldn't need it.

`-D<foo>':

Define macro `<foo>' in the usual way. NB: does not affect
`-D' macros passed to the C compiler when compiling via C! For
those, use the `-optc-Dfoo' hack...

`-U<foo>':

Undefine macro `<foo>' in the usual way.

`-I<dir>':

Specify a directory in which to look for `#include' files, in
the usual UNIX/C way.

The `ghc' driver pre-defines several macros:

`__HASKELL1__':

If defined to n, that means GHC supports the
Haskell language defined in the Haskell report version 1.n.
Currently 2.
NB: This macro is set both when pre-processing Haskell source and
when pre-processing generated C (`.hc') files.
If you give the `-fhaskell-1.3' flag,
then `__HASKELL1__' is set to 3. Obviously.

`__GLASGOW_HASKELL__':

For version n of the GHC system, this will be `#define'd to
100 * n. So, for version 0.26, it is 26.
This macro is only set when pre-processing Haskell source.
(Not when pre-processing generated C.)
With any luck, `__GLASGOW_HASKELL__' will be undefined in all other
implementations that support C-style pre-processing.
(For reference: the comparable symbols for other systems are:
`__YALE_HASKELL__' for Yale Haskell, `__HBC__' for Chalmers
HBC, and `__GOFER__' for Gofer [I think].)

`__CONCURRENT_HASKELL__':

Only defined when `-concurrent' is in use!
This symbol is
defined when pre-processing Haskell (input) and pre-processing C (GHC
output).

`__PARALLEL_HASKELL__':

Only defined when `-parallel' is in use! This symbol is defined when
pre-processing Haskell (input) and pre-processing C (GHC output).