2013-01-09 11 views
16

Với cấu trúc dự án sau:Sản xuất nhiều thực thi từ dự án duy nhất

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

và cài đặt cabal sau:

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

Chạy cabal install không thành công với kết quả như sau:

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 

Tôi đang làm gì sai hay đây là lỗi Cabal?


Nội dung của module thực thi như sau:

module FirstExecutable where 

main = putStrLn "Running FirstExecutable" 

module SecondExecutable where 

main = putStrLn "Running SecondExecutable" 
+0

Nó làm việc cho tôi. – Satvik

+0

@Satvik Tôi vừa phát hiện ra giải pháp. Đăng nó –

+2

bạn không nên sử dụng 'module ..' trong thực thi. hoặc bạn có thể sử dụng 'module Main' – Satvik

Trả lời

19

cabal hy vọng các module của file thực thi được Main. Bạn nên bỏ qua dòng mô-đun hoặc sử dụng module Main where.

Ok đây là lý do có thể. Việc thực thi chương trình haskell không được tạo ra khi mô-đun không phải là Main khi bạn thực sự biên dịch chương trình. Chức năng main của mô-đun Main được sử dụng khi thực thi được chạy. Giải pháp khả thi cho ghc là -main-is cờ. Vì vậy, bạn có thể có một cái gì đó như

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

Vâng, đó là chính xác những gì tôi vừa phát hiện ra một cách tình cờ sau khi dành một vài giờ để googling và đánh bại bản thân mình xung quanh. Khá thẳng thắn tôi thất vọng với lý do tại sao họ chọn một hành vi khó hiểu như vậy. Quyết định thiết kế khủng khiếp IMO –

+4

@NikitaVolkov Hành vi này được bắt buộc bởi [tiêu chuẩn ngôn ngữ] (http://www.haskell.org/onlinereport/modules.html) - "Chương trình Haskell là tập hợp các mô-đun, một trong số đó, theo quy ước, phải được gọi là Chính và phải xuất giá trị chính. " –

+0

@NikitaVolkov Bạn có thể thấy giải pháp thay thế có thể tôi đã đề xuất trong câu trả lời được cập nhật. – Satvik