GHCの振る舞いはオプションで制御される。歴史的な理由から、これはコマンド行フラグとか引数とも呼ばれる。オプションを指定する方法は次の三つである。
GHCを起動するときは次のような形をとる。
ghc [argument...]
コマンド行引数はオプションかファイル名のどちらかである。
コマンド行オプションは-
ではじまる。これをひとまとめにすることはできない。つまり、-vO
は-v -O
とは異なる。オプションがファイル名より先に置かれる必要はない。例えば、ghc *.o -o foo
のようにである。まず全てのオプションが処理され、全てのファイルに適用される。そのため、例えばghc -c -O1 Foo.hs -O2 Bar.hs
としてFoo.hs
とBar.hs
に異なる最適化水準を適用するということはできない。
ソースファイルと、それが必要とするコマンド行オプションの結合をとても強くした方が便利なことがある。例えば、あるHaskellソースファイルが意図的に名前の覆い隠しを使っているなら、それは-fno-warn-name-shadowing
オプション付きでコンパイルされるべきである。Makefile
でファイルごとのオプションの一覧を管理する代わりに、OPTIONS_GHC
プラグマを使ってソースファイルに直接これを書き込むこともできる。
{-# OPTIONS_GHC -fno-warn-name-shadowing #-} module X where ...
OPTIONS_GHC
はファイルヘッダプラグマである(7.20. プラグマを見よ)。
OPTIONS_GHC
の中で使えるのは動的なフラグだけである(4.3. 静的オプション、動的オプション、モード指定オプションを見よ)
ソースファイル中のオプションはコマンドシェルには渡されず、コンパイラが内部的に管理するコマンド行引数の配列に加えられるだけだということに注意せよ。そのため、OPTIONS_GHC
の中でワイルドカードなどを使おうとすると猛烈にがっかりすることになるだろう。
注意: OPTIONS_GHCの内容はコマンド行オプションの後に連結されるので、ソースファイルで与えられたオプションはコマンド行から与えられたものよりも優先される。
Makefileの内容を全てソースファイルに移すのは推奨されないが、場合によってはOPTIONS_GHC
プラグマを使うのが「正しい方法」である。(-keep-hc-file
を使っていて、モジュールにOPTIONフラグがあるなら、生成された.hcファイルにOPTIONS_GHCが置かれる)
GHCiの中から:set
コマンドを使ってオプションを変更することもできる。詳しくは2.8. :set
と:seti
コマンドを見よ。