cabal buildで作った*.oをcabal replで再利用させる

最初に断っておくと、開発時にこの方法を使うことは稀だと思う(#heyhey_haskell懇親会調べ)。あくまでも興味本位でやっていることだとを念頭に入れておいてもらいたい。

ghciのマニュアルに書いてある原理は把握した上で、やりたかったのはstackoverflowに出ていたこの質問。幸い cabal replだと、 -odir に適切な値を渡してくれるので、自前でこの質問にあるようなオプションを指定する必要はない。

が、ghc 7.8.3現在では、これだけではうまくいかない。まず、 *.cabal 内に executable として指定されているターゲットについては kazu-yamamotoさんのエントリ に書いてあるとおり cabal は静的ライブラリしか作らず ghci は動的ライブラリを見に行くのでうまく行かない。これは以下のようにbuildしておくとghciから*.oを参照するようになる。

cabal build --ghc-option=-dynamic sudoku3

もっとひどいのは library 指定されている方で、 cabal のissueに上げられている この問題 が ghc-7.8.3 でも解決していない。これに対するワークアラウンドは以下のようなもの。

cabal repl --ghc-options='-dynamic -osuf dyn_o -hisuf dyn_hi' lib:typedperl

どうしてこれで cabal が差し込んでいる -dynamic-too が悪さしなくなるのか理解しがたい部分もあるが、こちらの環境ではこれで望みどおりの挙動(コンパイル済コードについてはコンパイルが走らない)となった。いずれにせよ、ghc 7.8.4では直して欲しい問題である。