This looks like a bug. -hidir documentation says
> Redirects all generated interface files into ⟨dir⟩, instead of the default. > Please also note that when doing incremental compilation (by ghc --make or ghc -c), this directory is where GHC looks into to find interface files. And documentation for -i doesn't mention looking for interface files. So by doing % ghc -dynamic-too -c lib/Lib.hs -odir odir -hidir hidir_Lib % ghc -dynamic-too -c Main.hs -odir odir -hidir hidir_Main -ihidir_Lib 1 % ghc odir/Lib.o odir/Main.o -o Demo % ./Demo True everything compiles, TH is run, and demo works. The result files are % find . . ./Demo ./Main.hs ./hidir_Main ./hidir_Main/Main.dyn_hi ./hidir_Main/Main.hi ./odir ./odir/Main.dyn_o ./odir/Main.o ./odir/Lib.dyn_o ./odir/Lib.o ./hidir_Lib ./hidir_Lib/Lib.dyn_hi ./hidir_Lib/Lib.hi ./lib ./lib/Lib.hs --- The confusing error is caused by Lib module in libiserv: https://hackage.haskell.org/package/libiserv which GHC picks! If we rename your Lib module to Library, the error is way better: Could not find module ‘Library’ I also tried using same -hidir when compiling both modules, then GHC still cannot find the Library interface, even the documentation says it should. Please open a GHC issue at https://gitlab.haskell.org/ghc/ghc/-/issues - Oleg On 22.10.2021 19.16, Domínguez, Facundo wrote: > Dear devs, > > I'm confused about the meaning of -hidir and -i. Here's my experiment > with both ghc-9.2.0 and ghc-8.10.4. > > > $ find > > ./Main.hs > > ./lib/Lib.hs > > > > $ ghc -dynamic-too -c lib/Lib.hs -odir odir -hidir hidir_Lib > > > > $ ghc -dynamic-too -c Main.hs -odir odir -ihidir_Lib -hidir hidir_Main > > > > Main.hs:3:1: error: > > Bad interface file: hidir_Main/Lib.hi > > hidir_Main/Lib.hi: openBinaryFile: does not exist (No such > file or directory) > > | > > 3 | import Lib > > | ^^^^^^^^^^ > > If I only use -hidir, it still fails with another error > > > $ ghc -dynamic-too -c Main.hs -odir odir -hidir hidir_Lib > > > > Main.hs:7:29: error: Variable not in scope: f > > | > > 7 | main = print $(runIO (print f) >> [| True |]) > > | ^ > > If I use both -i and -hidir pointing to the same folder, then it works! > > > $ ghc -dynamic-too -c Main.hs -odir odir -ihidir_Lib -hidir hidir_Lib > > Now, is this behavior a bug or a feature? And if it is a bug, what is > the expected behavior? > > Programs copied below. > > Thank you! > Facundo > > > $ cat lib/Lib.hs > > module Lib where > > > > f :: Int > > f = 1 > > > > $ cat Main.hs > > {-# LANGUAGE TemplateHaskell #-} > > > > import Lib > > import Language.Haskell.TH <http://language.haskell.th/> > > > > main :: IO () > > main = print $(runIO (print f) >> [| True |]) > > _______________________________________________ > ghc-devs mailing list > ghc-devs@haskell.org > http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs
_______________________________________________ ghc-devs mailing list ghc-devs@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs