cabal buildで作った*.oをcabal replで再利用させる
Posted on September 23, 2014
Tweet
最初に断っておくと、開発時にこの方法を使うことは稀だと思う(#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では直して欲しい問題である。