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"
You can build different EXE files based on the same project using compiler defines. You can even define your own defines. But per compile-run you can only build one binary (DLL, EXE) per project - one or the other, but not both. Save this answer.
To build your program and create teh executable file choose Build My Project.exe from the Build menu - "My Project" represents teh name you chose for your project and the extension ".exe" is used to designate that the file being created will be an executable file.
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.*
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With