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コマンドを見よ。