如何为 Haskell 语言的程序制作 Makefile?
How to make a Makefile for a program for Haskell Language?
我是 Haskell 语言的新手,我想为我正在处理的 haskell 程序创建一个 makefile。但我不确定该怎么做。
谢谢:)
几乎没有 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。 IE。你需要一个 .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 run
,或 cabal install
使其在您的系统上始终可用。
我是 Haskell 语言的新手,我想为我正在处理的 haskell 程序创建一个 makefile。但我不确定该怎么做。
谢谢:)
几乎没有 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。 IE。你需要一个 .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 run
,或 cabal install
使其在您的系统上始终可用。