Создание нескольких исполняемых файлов из одного проекта

Со следующей структурой проекта:

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

и следующую настройку каббала:

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.*

Запуск cabal install завершается неудачей со следующим выходом:

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

Что я делаю неправильно или это ошибка в Cabal?


Содержимое исполняемых модулей выглядит следующим образом:

module FirstExecutable where

main = putStrLn "Running FirstExecutable"

и

module SecondExecutable where

main = putStrLn "Running SecondExecutable"

Ответы

Ответ 1

cabal ожидает, что модуль исполняемого файла будет Main. Вы должны пропустить модульную строку или использовать module Main where.

Хорошо, вот возможная причина. Исполняемый файл программы haskell не создается, когда модуль не Main, когда вы действительно компилируете программу. Функция Main модуля Main используется при запуске исполняемого файла. Возможным обходным решением для ghc является флаг -main-is. Таким образом, вы можете иметь что-то вроде

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.*