如何为Haskell语言制作程序的Makefile?

时间:2017-11-25 11:47:16

标签: haskell makefile ghci

我是Haskell语言的新手,我想为haskell程序创建一个makefile,我正在研究它。但我不知道该怎么做。

谢谢:)

1 个答案:

答案 0 :(得分:4)

几乎没有Haskell项目使用Makefile,因为它很笨重,难以阅读且容易出错。

对于简单的一次性项目,您根本不需要任何专用的构建系统:GHC本身可以找出模块之间的依赖关系:

sagemuej@sagemuej-X302LA:/tmp$ cat >> Hello.hs
module Main where

import Greeting

main = putStrLn greeting
sagemuej@sagemuej-X302LA:/tmp$ cat >> Greeting.hs
module Greeting where

greeting = "Hello, World!"
sagemuej@sagemuej-X302LA:/tmp$ ghc Hello.hs 
[1 of 2] Compiling Greeting         ( Greeting.hs, Greeting.o )
[2 of 2] Compiling Main             ( Hello.hs, Hello.o )
Linking Hello ...
sagemuej@sagemuej-X302LA:/tmp$ ./Hello 
Hello, World!

......或者只是

sagemuej@sagemuej-X302LA:/tmp$ runhaskell Hello.hs
Hello, World!

对于更多涉及的项目,绝对是图书馆,您希望使用Cabal。即您需要一个.cabal文件,例如对于上述“项目”hello.cabal。这样的文件可以由cabal工具半自动生成:

sagemuej@sagemuej-X302LA:/tmp$ mkdir hello
sagemuej@sagemuej-X302LA:/tmp$ mv Hello.hs hello
sagemuej@sagemuej-X302LA:/tmp$ mv Greeting.hs hello
sagemuej@sagemuej-X302LA:/tmp$ cd hello/
sagemuej@sagemuej-X302LA:/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: sagemueller@geo.uni-koeln.de] 
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.

此时文件将包含:

sagemuej@sagemuej-X302LA:/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:          sagemueller@geo.uni-koeln.de
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:
...

但那就是它,你现在可以做到

sagemuej@sagemuej-X302LA:/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即可使其始终在您的系统上使用。