昨日はGHCでのビルドについて説明した。
今日はGHCで使えるオプションについて。
もちろん、全部は書けないので、基本的なものだけ。
オプションの種類と指定方法
まず、GHCのオプションは、次のように分類できる。
- モード選択オプション
- その他のオプション
- 静的オプション
- 動的オプション
モード選択オプションはGHCのモード(対話的に使うかや、ビルドを行うかなど)を指定するもので、いずれか1つだけをコマンドラインから選択できる。
モード選択を行った上で、他にもオプションをつけることが出来て、これらは静的オプションと動的オプションに分類される。
静的オプションはコマンドラインからのみ指定できるオプションで、GHC(もしくはGHCi)の実行中、ずっと有効になる。
一方、動的オプションは、コマンドラインから指定する他に、各ソースファイルにも指定することが出来る。
ソースファイルで動的オプションを指定した場合、そのソースファイルに対してのみ、そのオプションが有効になる。
動的オプションをソースファイルで指定するには、module宣言よりも前に、以下のプラグマを挿入する。
{-# OPTIONS_GHC ここにオプション #-}
例えば、特定のファイルについて、すべての警告を有効(-Wall
)にして、最適化を無効化(-O0
)させたかったら、次のようにすればいい。
{-# OPTIONS_GHC -Wall -O0 #-} -- 以下、moduleの宣言
なお、ほとんどオプションは動的オプション。
モード選択オプション
モード選択オプションとして、次のようなものがある:
オプション | 説明 |
---|---|
--interactive |
GHCiを起動する。 |
--make |
依存関係を解析してビルドを行う。 |
-e expr |
式exprをGHCiと同様に評価して終了する。 |
-E |
プリプロセスだけ行う。(.hsppというファイルを出力する) |
-C |
(可能なら)Cの中間コード(拡張子は.hc)を出力する。 |
-S |
アセンブラの中間コードを出力する。 |
-c |
オブジェクトファイルを出力する。 |
-M |
依存関係の情報を出力する。 |
--mk-dll |
DLLを作成する。(Windowsのみ) |
--help 、-? |
ヘルプを出力して終了。 |
--show-iface file |
インタフェースファイルfileを読んで、その情報を表示する。 |
--supported-extensions 、--supported-languages |
対応している言語拡張を表示する。 |
--show-options |
対応しているコマンドラインオプションを表示する。 |
--info |
コンパイラに関する情報を表示する。 |
--version 、-V |
バージョン情報を表示する。 |
--numeric-version |
バージョン番号(x.y.zという形式)のみを表示する。 |
--print-libdir |
ライブラリディレクトリのパスを表示する。 |
なお、デフォルトの指定は--make
なので、ビルドを行いたい場合は、モードを明示的に選択する必要はない。
ワンライナー
-e
オプションは、PerlやRubyの-e
オプションと同じで、ワンライナーを書くことが出来る。
$ ghc -e 'putStrLn "Hello, Haskell!"' Hello, Haskell! $
なお、引数にHaskellのソースファイルを指定した場合、それをロードした上で実行してくれる。
例えば、以下の通り:
(Fibo.hsはこれまでの記事で使ってたファイルと同じ)
$ ghc -e 'fibo 10' Fibo.hs 55 $
Fibo.hsがロードされ、fibo関数を使えているのが分かると思う。
(GHCiと同様に評価するので、評価した結果が出力されることに注意)
インタフェースファイルの表示
--show-iface
オプションを使うと、インタフェースファイルの中身を表示することが出来る。
(インタフェースファイル自体はバイナリなので、そのまま見ようと思っても見れないことに注意)
例えば、以下のとおり:
$ ghc --show-iface Fibo.hi Magic: Wanted 33214052, got 33214052 Version: Wanted [7, 1, 0, 2], got [7, 1, 0, 2] Way: Wanted [], got [] interface Fibo 7102 interface hash: 064153e95d1fe67be5eb34bc5bf283f7 ABI hash: bd540c1e6f5e1eb55ce7369c86f38a04 export-list hash: d1ca8dc7dc8f9d3138f7698ddb7e25dd orphan hash: 693e9af84d3dfcc71e640e005bdc5e2e flag hash: b72619b91173ba000f4578573acc809f sig of: Nothing used TH splices: False where exports: fibo module dependencies: package dependencies: base-4.8.1.0* ghc-prim-0.4.0.0 integer-gmp-1.0.0.0 orphans: GHC.Base GHC.Float family instance modules: Control.Applicative Data.Either Data.Monoid Data.Type.Equality GHC.Generics import -/ GHC.Num 9f42750c866f5832ca565146bd660c60 import -/ Prelude 518f762991bc287d78f21a73c974da1f import -/ GHC.Integer.Type bf9b4d13b1dbe96a83786d2e47d2e8ca ab66b1e48e3d51c592e95c69a3b8c08a fibo :: Integer -> Integer vectorised variables: vectorised tycons: vectorised reused tycons: parallel variables: parallel tycons: trusted: safe require own pkg trusted: False $
冗長出力に関するオプション
-v
オプションを指定すると、冗長出力がされるようになる。
また、-v0
、-v1
、-v2
、-v3
、-v4
オプションで、冗長出力のレベルをコントロールすることが出来る。
- レベル0は冗長出力をしない。(デフォルトの動作)
- レベル1はコンパイルやリンクの情報を1行を表示。(
--make
や--interactive
のデフォルトの動作) - レベル2はコンパイルやリンクの情報を細かく表示。
- レベル3はレベル2に加えて、他のツールに渡した引数も表示。(単に
-v
を指定した場合、この動作をする) - レベル4はレベル3に加えて、中間の出力も表示。
最適化に関するオプション
-O
オプションを指定すると、最適化が行われるようになる。
また、-O0
、-O1
、-O2
オプションで、最適化をコントロールすることが出来る。
-O0
は最適化をしない。(デフォルトの動作)-O1
はコンパイル時間を犠牲にしない程度の最適化を行う。(単に-O
を指定した場合、この動作をする)-O2
は可能な限り最適化を行う。(コンパイルに時間がかかる)
警告に関するオプション
-W
オプションを指定すると、標準的な警告に加えて、いくつかの有用な警告が有効になる。
また、-Wall
オプションを指定すると、(一部を除いた)ほぼすべての警告が有効になる。
基本的には-Wall
を指定した方がいいと思う。
また、-Werror
を指定すると、警告がエラー扱いになる。(そこでビルドが止まる)
逆に、-Wwarn
を指定すると、警告は警告として扱われる。(これは、コマンドラインから-Werror
を指定しているときなどに使える)
今日はここまで!