2017-11-25 148 views
-2

我是Haskell語言中的新成員,我想爲現在正在處理的haskell程序創建一個makefile。但我不知道該怎麼做。如何爲Haskell語言的程序製作Makefile?

謝謝:)

+3

我們知道你想要什麼。大。你到目前爲止有什麼? – panther

+2

我不建議。而是使用'ghc --make',或'cabal'或'stack'。如果您確實需要'make',請閱讀有關它的文檔:https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/separate_compilation.html#using-make – chi

+1

那麼你首先想想你是什麼命令在製作程序時調用自己,然後將其轉換爲Makefile。 –

回答

2

幾乎沒有哈斯克爾項目使用一個Makefile,因爲這是笨重,難以閱讀,而且容易出錯。

對於簡單的一次性項目,你真的不需要任何專門的編譯系統在所有:GHC本身可以計算出模塊之間的依賴關係:

[email protected]:/tmp$ cat >> Hello.hs 
module Main where 

import Greeting 

main = putStrLn greeting 

[email protected]:/tmp$ cat >> Greeting.hs 
module Greeting where 

greeting = "Hello, World!" 

[email protected]:/tmp$ ghc Hello.hs 
[1 of 2] Compiling Greeting   (Greeting.hs, Greeting.o) 
[2 of 2] Compiling Main    (Hello.hs, Hello.o) 
Linking Hello ... 

[email protected]:/tmp$ ./Hello 
Hello, World! 

...或者乾脆

[email protected]:/tmp$ runhaskell Hello.hs 
Hello, World! 

對於更復雜的項目,絕對是圖書館,你要使用Cabal。即您需要一個.cabal文件,例如對於上述「項目」 hello.cabal。可以通過cabal工具半自動生成這樣的文件:

[email protected]:/tmp$ mkdir hello 
[email protected]:/tmp$ mv Hello.hs hello 
[email protected]:/tmp$ mv Greeting.hs hello 
[email protected]:/tmp$ cd hello/ 
[email protected]:/tmp/hello$ cabal init 
Package name? hello 
This package name is already used by another package on hackage. Do you want to choose a different name? [default: y] n 
Package version? [default: 0.1.0.0] 
Please choose a license: 
    1) GPL-2 
    2) GPL-3 
    3) LGPL-2.1 
    4) LGPL-3 
    5) AGPL-3 
    6) BSD2 
* 7) BSD3 
    8) MIT 
    9) ISC 
    10) MPL-2.0 
    11) Apache-2.0 
    12) PublicDomain 
    13) AllRightsReserved 
    14) Other (specify) 
Your choice? [default: BSD3] 12 
Author name? [default: Justus Sagemüller] 
Maintainer email? [default: [email protected]] 
Project homepage URL? 
Project synopsis? hello 
Project category: 
* 1) (none) 
    2) Codec 
    3) Concurrency 
    4) Control 
    5) Data 
    6) Database 
    7) Development 
    8) Distribution 
    9) Game 
    10) Graphics 
    11) Language 
    12) Math 
    13) Network 
    14) Sound 
    15) System 
    16) Testing 
    17) Text 
    18) Web 
    19) Other (specify) 
Your choice? [default: (none)] 17 
What does the package build: 
    1) Library 
    2) Executable 
Your choice? 2 
What is the main module of the executable: 
* 1) Main.hs (does not yet exist, but will be created) 
    2) Main.lhs (does not yet exist, but will be created) 
    3) Other (specify) 
Your choice? [default: Main.hs (does not yet exist, but will be created)] 3 
Please specify? Hello.hs 
Source directory: 
* 1) (none) 
    2) src 
    3) Other (specify) 
Your choice? [default: (none)] 
What base language is the package written in: 
* 1) Haskell2010 
    2) Haskell98 
    3) Other (specify) 
Your choice? [default: Haskell2010] 
Add informative comments to each field in the cabal file (y/n)? [default: n] 

Guessing dependencies... 
Generating Setup.hs... 
Generating ChangeLog.md... 
Generating hello.cabal... 

You may want to edit the .cabal file and add a Description field. 

此時該文件將包含:

[email protected]:/tmp/hello$ cat hello.cabal 
-- Initial hello.cabal generated by cabal init. For further documentation, 
-- see http://haskell.org/cabal/users-guide/ 

name:    hello 
version:    0.1.0.0 
synopsis:   hello 
-- description:   
license:    PublicDomain 
author:    Justus Sagemüller 
maintainer:   [email protected] 
category:   Text 
build-type:   Simple 
extra-source-files: ChangeLog.md 
cabal-version:  >=1.10 

executable hello 
    main-is:    Hello.hs 
    -- other-modules:  
    -- other-extensions:  
    build-depends:  base >=4.10 && <4.11 
    -- hs-source-dirs:  
    default-language: Haskell2010 

這不是很完整,你仍然需要添加Greeting.hs到項目:(沒有文件擴展名)

... 
executable hello 
    main-is:    Hello.hs 
    other-modules:  Greeting 
    -- other-extensions: 
... 

但僅此而已,你現在可以做

[email protected]:/tmp/hello$ cabal build 
Resolving dependencies... 
Configuring hello-0.1.0.0... 
Preprocessing executable 'hello' for hello-0.1.0.0.. 
Building executable 'hello' for hello-0.1.0.0.. 
[1 of 2] Compiling Greeting   (Greeting.hs, dist/build/hello/hello-tmp/Greeting.o) 
[2 of 2] Compiling Main    (Hello.hs, dist/build/hello/hello-tmp/Main.o) 
Linking dist/build/hello/hello ... 

或者,只需運行腳本,cabal runcabal install以使其始終可用於您的系統。