Discovery of source dependencies without --make
lars at hupel.info
Tue Nov 25 09:36:53 UTC 2014
(cross-posted from [haskell-cafe])
I've got a problem in our – admittedly complex – build process. We're
running an automated grading system for student-submitted homework
exercises. The compilation proceeds in stages:
1) Compile a library file, marked as trustworthy
2) Compile student submissions using Safe Haskell, able to access a
whitelisted set of packages and the previously compiled library files
3) Compile the test suite
4) Link everything together into an executable
The invocation is similar to this:
ghc -c -outputdir "$OUT" -XTrustworthy Library.hs
ghc -c -outputdir "$OUT" -i"$OUT" -XSafe "$SUBMISSION"
ghc -c -outputdir "$OUT" -i"$OUT" Test_Suite.hs
ghc -outputdir "$OUT" -i"$OUT" -o "$OUT/runner"
The second stage works well under the assumption that there's just one
single submitted file. If there's more than one, I need to specify them
in topological order wrt their module dependencies. Consider two simple
> module A where
> import B
> import Library
> module B where
Invoking GHC with "A.hs" "B.hs" will fail:
Failed to load interface for ‘B’
My naive attempt at solving that problem was to just insert "--make"
into the compiler flags. No luck, because according to [1, §4.7.3],
"--make" will only look at source files and will ignore the "Library.hi"
file from the previous compilation stage. If I give the path to
"Library.hs" as well, GHC insists on recompiling it with changed flags
("-XSafe" instead of "-XTrustworthy").
Reading a bit further, I discovered the '-M' flag, however, not only
does it output Makefile-formatted output, it also ignores .hi files.
Is there any way to get the dependency discovery of '--make' without the
I know I could probably make it work if I made a package out of the
first build stage, but I really want to avoid that in order to not
increase the build complexity even further.
More information about the Glasgow-haskell-users