Producing multiple executables from single project

2020-05-22 06:51发布

问题:

With the following project structure:

src/FirstExecutable.hs
src/SecondExecutable.hs
my-amazing-project.cabal

and the following cabal setup:

name:               my-amazing-project
version:            0.1.0.0
build-type:         Simple
cabal-version:      >=1.8

executable first-executable
  hs-source-dirs:   src
  main-is:          FirstExecutable.hs
  ghc-options:      -O2 -threaded -with-rtsopts=-N
  build-depends:    base == 4.5.*

executable second-executable
  hs-source-dirs:   src
  main-is:          SecondExecutable.hs
  ghc-options:      -O2 -threaded -with-rtsopts=-N
  build-depends:    base == 4.5.*

Running cabal install fails with the following output:

Installing executable(s) in
/Users/mojojojo/Library/Haskell/ghc-7.4.2/lib/my-amazing-project-0.1.0.0/bin
cabal: dist/build/second-executable/second-executable: does not exist
Failed to install my-amazing-project-0.1.0.0
cabal: Error: some packages failed to install:
my-amazing-project-0.1.0.0 failed during the final install step. The exception
was:
ExitFailure 1

What am I doing wrong or is this a Cabal bug?


The contents of the executable modules are as follows:

module FirstExecutable where

main = putStrLn "Running FirstExecutable"

and

module SecondExecutable where

main = putStrLn "Running SecondExecutable"

回答1:

cabal expects the module of the executable to be Main. You should skip the module line or use module Main where.

Ok here is the possible reason. The executable of a haskell program is not produced when the module is not Main when you actually compile the program. The main function of the Main module is used when the executable is run. A possible workaround for ghc is -main-is flag. So you can have something like

name:               my-amazing-project
version:            0.1.0.0
build-type:         Simple
cabal-version:      >=1.8

executable first-executable
  hs-source-dirs:   src
  main-is:          FirstExecutable.hs
  ghc-options:      -O2 -threaded -with-rtsopts=-N -main-is FirstExecutable
  build-depends:    base == 4.5.*

executable second-executable
  hs-source-dirs:   src
  main-is:          SecondExecutable.hs
  ghc-options:      -O2 -threaded -with-rtsopts=-N -main-is SecondExecutable
  build-depends:    base == 4.5.*


标签: haskell cabal