haskellcabalhappyalex

Using alex/happy with Cabal


I'm writing a compiler for a class I'm taking. The class isn't specifically Haskell but I'm using Haskell to write my compiler and interpreter. I have a cabal package setup to hopefully make it easy for my prof to run/compile.

I have happy and alex in the build-tools field for both executables but Cabal ignores that and then complains that it cannot find the modules that Happy and Alex should be generating.

If I manually run:

alex LimpScanner.x
happy LimpParser.y

then cabal runs perfectly.

I thought I had cabal automatically running them earlier but perhaps I remember imperfectly.

Contents of limp.cabal:

Name:                limp
Version:             0.1
Synopsis:            LIMP Compiler (Compiler Construction course project)
Homepage:            http://www.cs.rit.edu/~eca7215/limp/
License:             AllRightsReserved
License-file:        LICENSE
Author:              Edward Amsden
Maintainer:          eca7215@cs.rit.edu
Category:            Language
Build-type:          Simple
Cabal-version:       >=1.2

Executable limp
  -- .hs or .lhs file containing the Main module.
  Main-is: Limp.hs

  hs-source-dirs: src     
  
  -- Packages needed in order to build this package.
  Build-depends: base, array, haskell98     
  
  -- Modules not exported by this package.
  -- Other-modules:       
  
  -- Extra tools (e.g. alex, hsc2hs, ...) needed to build the source.
  Build-tools:         alex, happy
Executable limpi
  Main-is: LimpInterpreter.hs
  hs-source-dirs: src
  Build-depends: base, array, haskell98
  Build-tools: alex, happy

Directory layout:

limp/
├── Setup.hs
├── limp.cabal
└── src/
    ├── Limp.hs
    ├── LimpInterpreter.hs
    ├── LimpParser.ly
    ├── LimpScanner.x
    └── LimpToken.hs

Solution

  • Apparently what I was missing was actually the Other-modules: field. Once this was added, cabal happily (pardon the pun) built my interpreter.