2013-01-09 4 views
16

Mit der folgenden Projektstruktur Producing:mehrere ausführbare Dateien aus einem Projekt

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

und die folgende Kabale 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.* 

cabal install schlägt fehl, mit der folgenden Ausgabe:

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 

Was mache ich falsch oder ist das ein Cabal Bug?


Die Inhalte der ausführbaren Module sind wie folgt:

module FirstExecutable where 

main = putStrLn "Running FirstExecutable" 

und

module SecondExecutable where 

main = putStrLn "Running SecondExecutable" 
+0

Es funktioniert für mich. – Satvik

+0

@Satvik Ich habe gerade die Lösung gefunden. Wenn Sie es –

+2

posten, sollten Sie 'module ..' nicht in der ausführbaren Datei verwenden. oder du kannst 'module Main' verwenden – Satvik

Antwort

19

kabale das Modul der ausführbaren Datei erwartet Main zu sein. Sie sollten die Modulzeile überspringen oder module Main where verwenden.

Ok hier ist der mögliche Grund. Die ausführbare Datei eines Haskell-Programms wird nicht erzeugt, wenn das Modul nicht Main ist, wenn Sie das Programm tatsächlich kompilieren. Die main-Funktion des Moduls Main wird verwendet, wenn die ausführbare Datei ausgeführt wird. Eine mögliche Problemumgehung für Ghc ist -main-is Flag. So können Sie etwas haben wie

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

Ja, das ist genau das, was ich zufällig herausgefunden habe, nachdem ich ein paar Stunden damit verbracht habe zu googeln und mich selbst zu schlagen. Ehrlich gesagt bin ich frustriert darüber, warum sie solch ein verwirrendes Verhalten gewählt haben. Eine schreckliche Designentscheidung IMO –

+4

@NikitaVolkov Dieses Verhalten wird vom [Sprachstandard] vorgeschrieben (http://www.haskell.org/onlinereport/modules.html) - "Ein Haskell-Programm ist eine Sammlung von Modulen, von denen eines, per Konvention muss Main genannt werden und muss den Wert main exportieren. " –

+0

@NikitaVolkov Sie können die mögliche Problemumgehung sehen, die ich in der aktualisierten Antwort vorgeschlagen habe. – Satvik