Go to the first, previous, next, last section, table of contents.

Re-directing the compilation output(s)

When compiling a Haskell module, GHC may produce several files of output (usually two).

One file is usually an interface file. If compiling `bar/Foo.hs', the interface file would normally be `bar/Foo.hi'. The interface output may be directed to another file `bar2/Wurble.iface' with the option `-ohi bar2/Wurble.iface'.

To avoid generating an interface file at all, use a `-nohi' option.

The compiler does not overwrite an existing `.hi' interface file if the new one is byte-for-byte the same as the old one; this is friendly to `make'. When an interface does change, it is often enlightening to be informed. The `-hi-diffs' option will make `ghc' run `diff' on the old and new `.hi' files.

GHC's non-interface output normally goes into a `.hc', `.o', etc., file, depending on the last-run compilation phase. The option `-o foo' re-directs the output of that last-run phase to file `foo'.

Note: this "feature" can be counterintuitive: `ghc -C -o foo.o foo.hs' will put the intermediate C code in the file `foo.o', name notwithstanding!

EXOTICA: But the `-o' option isn't much use if you have several input files... Non-interface output files are normally put in the same directory as their corresponding input file came from. You may specify that they be put in another directory using the `-odir <dir>' (the "Oh, dear" option). For example:

% ghc -c parse/Foo.hs parse/Bar.hs gurgle/Bumble.hs -odir `arch`

The output files, `Foo.o', `Bar.o', and `Bumble.o' would be put into a subdirectory named after the architecture of the executing machine (`sun4', `mips', etc). The directory must already exist; it won't be created.

Note that the `-odir' option does not affect where the interface files are put. In the above example, they would still be put in `parse/Foo.hi', `parse/Bar.hi', and `gurgle/Bumble.hi'.

MORE EXOTICA: The `-osuf <suffix>' will change the `.o' file suffix for object files to whatever you specify. (We use this in compiling the prelude.)

Similarly, the `-hisuf <suffix>' will change the `.hi' file suffix for non-system interface files. This can be useful when you are trying to compile a program several ways, all in the same directory. The suffix given is used for all interfaces files written, and for all non-system interface files that your read.

The `-hisuf'/`-osuf' game is useful if you want to compile a program with both GHC and HBC (say) in the same directory. Let HBC use the standard `.hi'/`.o' suffixes; add `-hisuf _g.hi -osuf _g.o' to your `make' rule for GHC compiling...

FURTHER EXOTICA: If you are doing a normal `.hs'-to-`.o' compilation but would like to hang onto the intermediate `.hc' C file, just throw in a `-keep-hc-file-too' option. If you would like to look at the assembler output, toss in a `-keep-s-file-too', too.

SAVING GHC STDERR OUTPUT: Sometimes, you may cause GHC to be rather chatty on standard error; with `-fshow-import-specs', for example. You can instruct GHC to append this output to a particular log file with a `-odump <blah>' option.

TEMPORARY FILES: If you have trouble because of running out of space in `/tmp/' (or wherever your installation thinks temporary files should go), you may use the `-tmpdir <dir>' option to specify an alternate directory. For example, `-tmpdir .' says to put temporary files in the current working directory.

BETTER IDEA FOR TEMPORARY FILES: Use your `TMPDIR' environment variable. Set it to the name of the directory where temporary files should be put. GCC and other programs will honour the `TMPDIR' variable as well.

EVEN BETTER IDEA: Configure GHC with `--with-tmpdir=<mumble>' when you build it, and never worry about `TMPDIR' again.


Go to the first, previous, next, last section, table of contents.