Создание нескольких исполняемых файлов из одного проекта
Со следующей структурой проекта:
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.*