Home > Blockchain >  cabal fails to build simple project
cabal fails to build simple project

Time:10-09

I have a simple existing Haskell project that compiles fine with ghc:

$ ghc src/*.hs
[1 of 3] Compiling Address          ( src/Address.hs, src/Address.o )
[2 of 3] Compiling Person           ( src/Person.hs, src/Person.o )
[3 of 3] Compiling Main             ( src/Main.hs, src/Main.o )
Linking src/Main ...

I try to set up a cabal build but can't seem to succeed

$ cabal init --source-dir=src --main-is=src/Main.hs
$ cabal build
Resolving dependencies...
...<omitted for brevity>...
src/Main.hs:1:1: error:
    Could not find module ‘Person’
    Use -v (or `:set -v` in ghci) to see a list of the files searched for.
  |
1 | import Person
  | ^^^^^^^^^^^^^

src/Main.hs:2:1: error:
    Could not find module ‘Address’
    Use -v (or `:set -v` in ghci) to see a list of the files searched for.
  |
2 | import Address
  | ^^^^^^^^^^^^^^

What am I missing?

CodePudding user response:

Your cabal file is the problem. From your description it sounds like you have a file with the lines:

    main-is:          src/Main.hs
    hs-source-dirs:   .

I don't know how this manifests into the issue you post (and I have reproduced) but the normal form is to use the directory field to list the directory and the main-is field for just the file name:

    main-is:          Main.hs
    hs-source-dirs:   src

This works. Also, both these are not conforming to cabal norms. Consider placing the modules under src and the executable Main under a directory named app or my-projects-binary-name if you want to look a little more like a directory structure that many devs have in mind.

CodePudding user response:

It seems that using --application-dir=src instead of --source-dir=src works:

$ cabal init --main-is=Main.hs --application-dir=src
  • Not sure if this is a bug or just confusing flag names (?)
  • Anyway, it looks like no manual editing of the auto-generated cabal file is needed.
  • Related