seeing home module dependencies

Sam Halliday sam.halliday at gmail.com
Tue Aug 27 14:11:09 UTC 2019


Hello all,

I am writing a tool that uses the ghc api. It works great when I invoke
it on user library code but not for test (and executable) components.

Consider a very simple user project with this layout

  lib/Foo.hs
  lib/Bar.hs
  test/FooTest.hs
  test/TestUtils.hs

Let's say that Foo imports from Bar and FooTest imports from TestUtils.

To start my tool, which for all intents and purposes is just loading a
file into ghc, I obtain the ghc flags from cabal's v2-repl (this is the
hie-bios hack). I've been sure to make sure that I grab the flags
associated to the relevant component. I feel that I need to justify why
I'm doing it this way instead of cabal envfiles: they do not include
language extensions and other things of that nature, and don't separate
library/test/etc.


Let's say the user has compiled the project, with tests enabled.

The flags for the library might look something like

  ...
  -this-unit-id example-1.0-inplace -hide-all-packages
  -Wmissing-home-modules -no-user-package-db
  -package-db -/home/me/.cabal/store/ghc-8.6.5/package.db
  -package-db -/home/me/example/dist-newstyle/packagedb/ghc-8.6.5
  --package-db /home/me/example/dist-newstyle/build/x86_64-linux/ghc-8.6.5/example-1.0/noopt/package.conf.inplace
  -package-id transformers-0.5.6.2
  ...

which all makes sense. If I use these flags then loading Foo.hs will
fail because it cannot find Bar.

  These modules are needed for compilation but not
  listed in your .cabal file's other-modules:
  Bar

Of course I could suppress this by ignoring warnings, but I want to see
those modules.... so I have a workaround! I hacked it by changing the
-this-unit-id to a -package-id and it all works great because the
compiler already has the interface files for Bar in the packagedb. My
tool doesn't write any object files, so I think this is safe.


However, when I come to running my tool on test directories, there is no
-this-unit-id from v2-repl. I know what the package-id is (from Cabal's
plan.json) but it doesn't exist in my packagedb, so I can't re-use my
hack.

  These modules are needed for compilation but not
  listed in your .cabal file's other-modules:
  TestUtils

And I'm back where I started.

So my question is: which flags do I need to provide to the ghc api so
that a module can see the interfaces of other modules in the same
component? I'm guessing my -this-unit-id hack is horrible and I
shouldn't be doing that. What is the correct thing to do?


-- 
Best regards,
Sam
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 194 bytes
Desc: not available
URL: <http://mail.haskell.org/pipermail/ghc-devs/attachments/20190827/23aec0c6/attachment.sig>


More information about the ghc-devs mailing list