[Haskell-cafe] Compiling with NHC98

Glynn Clements glynn at gclements.plus.com
Sun May 8 07:00:20 EDT 2005

Daniel Carrera wrote:

> > I haven't used NHC so I can't guarantee this will work, but try doing
> > something like this:
> > 
> >     $ nhc98 -c RC4.hs
> >     $ nhc98 -c prng.hs
> >     $ nhc98 RC4.o prng.o -o prng
> Yay! It does. And I just put it in a makefile:
> ---<daniel's makefile>----
> COMPILER=nhc98
> RC4.o:
>          $(COMPILER) -c RC4.hs
> prng.o:
>          $(COMPILER) -c prng.hs
> prng: RC4.o  prng.o
>          $(COMPILER) RC4.o prng.o -o prng
> ---<daniel's makefile>----

This can fail with a parallel make, which may try to compile RC4.hs
and prng.hs concurrently. It can also fail if you rebuild after
modifying any of the files, as it won't realise that it needs to
re-compile. To handle that, you need to be more precise about the
dependencies, i.e.:

	RC4.o RC4.hi: RC4.hs
		$(HC) -c RC4.hs
	prng.o prng.hi: prng.hs RC4.hi
		$(HC) -c prng.hs

	prng: RC4.o  prng.o
		$(HC) RC4.o prng.o -o prng

With most make programs (e.g. GNU make), you can use pattern rules to
avoid repeating the commands, e.g.:

	# how to compile any .hs file to produce .o and .hi files
	%.o %.hi: %.hs
		$(HC) -c $<

	# how to build the prng program
	prng: RC4.o prng.o
		$(HC) -o $@ $+

	# note that prng.o depends upon RC4.hi
	prng.o: RC4.hi

Glynn Clements <glynn at gclements.plus.com>

More information about the Haskell-Cafe mailing list