Hi Everyone!

I'm new here, trying to learn the GHC API. using 944 with cabal 3.8.1.0.

How do I correctly set a GHC Session's DynFlags (and/or other properties) to ensure local libraries imported by the main target are resolved properly at compile time?

What flags need to be set so that GHC is able to load/analyze/compile all relevant Libraries in a package?

This is my current code:

withPath :: FilePath -> IO ()
withPath target = do
  let targetDir = takeDirectory target
  let targetFile = takeFileName target
  listing <- listDirectory targetDir
  let imports = filter (\f -> takeExtension f == ".hs") listing
  print imports
  let moduleName = mkModuleName targetFile
  g <- defaultErrorHandler defaultFatalMessager defaultFlushOut
    $ runGhc (Just libdir) $ do
    initGhcMonad (Just libdir)
    dynflags <- getSessionDynFlags
    setSessionDynFlags $ dynflags { ghcLink          = LinkInMemory
                                  , ghcMode          = CompManager
                                  , backend          = Interpreter
                                  , mainModuleNameIs = moduleName
                                  , workingDirectory = Just targetDir
                                  , importPaths      = [targetDir] ++ importPaths dynflags
                                  }
   
    targets <- mapM (\t -> guessTarget t Nothing Nothing) imports
    setTargets targets
    setContext [ IIDecl $ simpleImportDecl (mkModuleName "Prelude") ]
    load LoadAllTargets
    liftIO . print . ppr =<< getTargets
    getModuleGraph
  putStrLn "Here we go!"
  print $ ppr $ mgModSummaries g
  putStrLn "☝️ "

However, when I run it (passing to example/app/Main.hs, in which directory are Lib.hs and Lib2.hs, the latter being imported into Main), I get:

$ cabal run cli -- example/app/Main.hs
Up to date
["Main.hs","Lib.hs","Lib2.hs"]
[main:Main.hs, main:Lib.hs, main:Lib2.hs]
Here we go!
[ModSummary {
   ms_hs_hash = 23f9c4415bad851a1e36db9d813f34be
   ms_mod = Lib,
   unit = main
   ms_textual_imps = [(, Prelude)]
   ms_srcimps = []
},
ModSummary {
   ms_hs_hash = e1eccc23af49f3498a5a9566e63abefd
   ms_mod = Lib2,
   unit = main
   ms_textual_imps = [(, Prelude)]
   ms_srcimps = []
},
ModSummary {
   ms_hs_hash = 5f6751d7f0d5547a1bdf39af84f8c07f
   ms_mod = Main,
   unit = main
   ms_textual_imps = [(, Prelude), (, Lib2)]
   ms_srcimps = []
}]
☝  

example/app/Main.hs:4:1: error:
   Could not find module ‘Lib2’
   Use -v (or `:set -v` in ghci) to see a list of the files searched for.
 |
4 | import qualified Lib2 as L2
 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^
cli: example/app/Main.hs:4:1: error:
   Could not find module `Lib2'
   Use -v (or `:set -v` in ghci) to see a list of the files searched for.

What do I need to do differently to make this work?

I have a local Cabal file I could use, but to know what I need out of it, I need to understand the minimum required info to get this to work. TIA!

Sincerely,

Bob

Sent with Proton Mail secure email.