haskell and FreeBSD 11.1
鈴虫が盛んに鳴く季節。あの忌まわしい蚊もゆく夏を惜しんで活動を活発化してる。
また、蚊の被害を受けた。残念ながら犯行現場とホシは特定出来ず。今回の被害は、 ケツの穴の近く。今年で2度目の被害。変態蚊がうろちょろしてるんだな。
駐在さんか役場の方に言って、犯人を逮捕して欲しいぞ。なんたって、目にも見えにくい ストーカーですからな。
被害に遭った本人は、身悶えしております。痒くても迂闊に掻ける場所ではないからね。 一時の快楽に浸ってしまうと、痔になるとか、とんでもない後遺症を併発しそうなので、 全治5日ぐらいまで、ひたすらMになってましょ。
全国各地で、ストーカーが蔓延してるみたいで、今年バージョンの対策が出てた。
いろいろ紹介されてるけど、決定的なものは無いなあ。絶対に刺されない方法を研究して、誰か (イグ)ノーベル賞を取ってください。それが人類を幸福に導きますよ。
でもまあ、蚊のストーカー被害ぐらいならよしとするか。殺人鬼のヒアリの被害には遭っていないからね。
ghc 8.2.1 on FreeBSD 11.1
まずFreeBSDの新しいのを入れた。古いBSDでどんなpkgを入れたか忘れてしまっているので、 pkg infoして、どんなのが入っていたか偵察。必要なものを新たな革袋に入れてあげた。
そして、いよいよghcの新種を入れる。
810 2 I+ 0:00.54 gmake --no-print-directory -f ghc.mk install BINDIST=YES NO_INCLUDE_DEPS=YES 1330 2 I+ 0:00.30 utils/ghc-cabal/dist-install/build/tmp/ghc-cabal copy libraries/template-haskell dist-install strip /usr/loc 1333 2 R+ 3:02.13 strip --strip-unneeded /usr/local/GHC821/lib/ghc-8.2.1/template-haskell-2.12.0.0/libHStemplate-haskell-2.12.
上記のようにstripしてる所で、べらぼうに時間がかかった。対象ファイルが沢山あるので 気長に待とう。
で、次は動作試験。ハロワ出来るかな。
[sakae@fb11 /tmp]$ ghc aa.hs [1 of 1] Compiling Main ( aa.hs, aa.o ) Linking aa ... <no location info>: error: Warning: Couldn't figure out linker information! Make sure you're using GNU ld, GNU gold or the built in OS X linker, etc. /usr/bin/ld.lld: error: unable to find library -liconv /usr/bin/ld.lld: error: unable to find library -lcharset /usr/bin/ld.lld: error: unable to find library -lgmp clang: error: linker command failed with exit code 1 (use -v to see invocation) `clang' failed in phase `Linker'. (Exit code: 1)
iconvとかは、/usr/local/libの下に有るはずなんで、それらをちゃんと捕捉していないのか脳?取り合えず、詳細なコンパイルログを取ってみよう。
[sakae@fb11 /tmp]$ ghc aa.hs -v >log 2>&1
そして古い方もね。
[fb11: tmp]$ stack exec -- ghc aa.hs -v >OLD 2>&1
見比べてみると、-L/usr/local/libが、新しい方には付いていないなあ。
古いFB11の方は、stackで動かしていて、こちらはちゃんと実行ファイルが生成された。 念のため、ちゃんとリンクしてるか確認。
[fb11: tmp]$ ldd ./aa ./aa: libiconv.so.2 => /usr/local/lib/libiconv.so.2 (0x8008dc000) libcharset.so.1 => /usr/local/lib/libcharset.so.1 (0x800bd7000) libgmp.so.10 => /usr/local/lib/libgmp.so.10 (0x800dd9000) libm.so.5 => /lib/libm.so.5 (0x80105b000) librt.so.1 => /usr/lib/librt.so.1 (0x801286000) libthr.so.3 => /lib/libthr.so.3 (0x80148b000) libc.so.7 => /lib/libc.so.7 (0x8016b2000)
そうなったら、export LD_LIBRARY_PATH=/usr/local/lib しとけばいいんだな。やってみたけど、どうも働いていない雰囲気。ちょいとぐぐったら、FreeBSDの流儀では、rc.confに 書いておkって事みたい。
ldconfig_local_dirs="/usr/local/lib"
で、やってみたけど、無駄骨だった。こうなれば、もっと根本的な問題だな。 C語でハロワを書いて実験。
[sakae@fb11 /tmp]$ cc t.c [sakae@fb11 /tmp]$ cc t.c -liconv /usr/bin/ld: cannot find -liconv cc: error: linker command failed with exit code 1 (use -v to see invocation) [sakae@fb11 /tmp]$ cc t.c -L/usr/local/lib -liconv
これが、clang 4.0.0って、備え付けの挙動。コンパイル時(正確にはリンク時か)に、libraryの在処を指定すると、ちゃんとコンパイルが成功するとな。
じゃ、pkgから入れたデフォと言うgcc 5.4.0でやってみる。
[sakae@fb11 /tmp]$ gcc t.c -liconv
こちらは、何食わぬ顔をしてコンパイルが成功している。ちゃんと/usr/local/libにも目を 通しているって事だ。
今の所の結論は、clangは 融通の利かない奴って事だな。
を見ると、-Lをghcする時に渡せとな。
[sakae@fb11 /tmp]$ ghc aa.hs -L/usr/local/lib Linking aa ... <no location info>: error: Warning: Couldn't figure out linker information! Make sure you're using GNU ld, GNU gold or the built in OS X linker, etc. [sakae@fb11 /tmp]$ ./aa Hellow GHC
ghcをインストールする時に、このオプションを埋め込んでおけってのが、どうやら正しい対処方法と思われる。
Comprehensive overview of using the Build System このあたりを見て、再度トライかな。
ghc とバトル
今入っているghcをまともに使いたい。これはもうghcとバトルだな。
ちょっと古いけどghcのマニュアルを見つけてきた。 栄光のグラスゴーHaskellコンパイルシステム利用の手引き
[sakae@fb11 /tmp]$ ghc --info [("Project name","The Glorious Glasgow Haskell Compilation System") ,("GCC extra via C opts"," -fwrapv -fno-builtin") ,("C compiler command","clang") ,("C compiler flags"," -fno-stack-protector") ,("C compiler link flags"," -fuse-ld=lld") ,("C compiler supports -no-pie","NO") ,("Haskell CPP command","clang") ,("Haskell CPP flags","-E -undef -traditional -Wno-invalid-pp-token -Wno-unicod e -Wno-trigraphs") ,("ld command","ld.lld") ,("ld flags","") ,("ld supports compact unwind","NO") ,("ld supports build-id","YES") ,("ld supports filelist","NO") ,("ld is GNU ld","YES") :
これがghcの内部環境のようだ。perlも必需品になってるぞ。ghcが開発されてた頃はperl全盛期だったんでしょうな。今ならpythonだろうけど、今更誰もpythonに乗り換える勇気が無い んだな。
上の報告を良く見ると、[(String, String)] って、事になってるな。真にもってhaskellで ございますって言う趣。
そんな事より、もっと高次元で考えるんだ。そう、これって、Makefileに書かれる情報じゃん。 ghcには、--makeなんてオプションが有るんで、makeを内蔵してんだな。これは、ocamlに 比べて、大きなアドバンテージになりますよ。あちらは、OMakeだったかが別アプリになってて、 わざわざインストールしないと使えない。まてよ、そうするとocamlの方がunix的だな。気に いらなかったら、取り換えられるからね。その点、ghcときたら、図体ばかり大きくなって(以下自粛)
で、糞みたいに沢山ある引数なんて、どうせ忘れてしまっているだろうから、確認出来るように しといたからねって、--helpをすると出てくる。
[sakae@fb11 /tmp]$ ghc --show-options | grep -- -pg -pgmlo -pgmlc -pgmi -pgmL -pgmP -pgmF -pgmc -pgms -pgma -pgml -pgmdll -pgmwindres -pgmlibtool
これと上記のマニュアルを照らし合わせてみると、使うコンパイラーをコマンド引数から変更 出来るようだ。
[sakae@fb11 /tmp]$ ghc -pgmc gcc aa.hs -v : *** C Compiler: gcc -c /tmp/ghc1143_0/ghc_4.c -o /tmp/ghc1143_0/ghc_5.o -I/usr/local/GHC821/lib/ ghc-8.2.1/include *** C Compiler: gcc -c /tmp/ghc1143_0/ghc_7.s -o /tmp/ghc1143_0/ghc_8.o Error (figuring out linker information): user error (invalid --version output, o r linker is unsupported)
こんな風に、コンパイラーを動的に切り替え出来るとな。
コンパイルの途中で実行を止め、成果を確認出来るとな。興味があるのが、hs語がどんなC語に 変換されるかなって事。それには、-Cオプションを付けると良いらしい。
[sakae@fb11 /tmp]$ ghc -C aa.hs ghc: the option -C is only available with an unregisterised GHC Usage: For basic information, try the `--help' option.
ちゃんとしたGHCでは、そんな秘密を暴くようなまねをさせませんだと。秘密主義だな。 ならば、コンパイルの残骸を残す作戦はどうだ?
[sakae@fb11 /tmp]$ ghc aa.hs -keep-tmp-files [1 of 1] Compiling Main ( aa.hs, aa.o )
こんなdir(多分pidと、n個目のターゲットって事だろう)が出来ていた。ファイルに番号が 付いているのは、生成順だろう。(haskell用語で言うと、数えられる性質 Ord を満たす。 まてよ順番だから、Enumかな。その両方だろうな)
[sakae@fb11 /tmp/ghc1205_0]$ ls ghc_10.rsp ghc_4.c ghc_6.rsp ghc_8.o ghc_2.s ghc_5.o ghc_7.s ghc_9.rsp
で、順番と言うと、ghc_2.s が、数字的に一番小さい。なんでこんなものが最初なんだ? しばし考えて、メインを動かす為の下準備だろうと推測。C語系で言う、crt.oみたいなやつだな。
次にghc_4.c 折角だから開陳しとく
#include "Rts.h" extern StgClosure ZCMain_main_closure; int main(int argc, char *argv[]) { RtsConfig __conf = defaultRtsConfig; __conf.rts_opts_enabled = RtsOptsSafeOnly; __conf.rts_opts_suggestions = true; __conf.rts_hs_main = true; return hs_main(argc,argv,&ZCMain_main_closure,__conf); }
これに関連するのが、ghc_6.rsp 内容は
"-fno-stack-protector" "-DTABLES_NEXT_TO_CODE" "-c" "/tmp/ghc1205_0/ghc_4.c" "-o" "/tmp/ghc1205_0/ghc_5.o" "-I/usr/local/GHC821/lib/ghc-8.2.1/include"
コンパイルに使ったコマンド引数だな。
元ネタのaa.hsは、main = putStrLn "hello" なので、helloを探してみる。 ghc_2.s に有ったぞ。最初の推測は、脆くも崩れ去ったのかな。
.section .rodata.str,"aMS",@progbits,1 .align 1 .align 1 c18T_str: .asciz "hello" : .Lc18R: movq $stg_bh_upd_frame_info,-16(%rbp) movq %rax,-8(%rbp) movl $c18T_str,%r14d movl $ghczmprim_GHCziCString_unpackCStringzh_closure,%ebx addq $-16,%rbp jmp stg_ap_n_fast
あああ、糞石の所まで行っちゃったね。で、最後のおまとめ引数は、ghc_10.rspにあった。
"-fno-stack-protector" "-DTABLES_NEXT_TO_CODE" "-fuse-ld=lld" "-o" "aa" "-Wl,--gc-sections" "aa.o" "-L/usr/local/GHC821/lib/ghc-8.2.1/base-4.10.0.0" "-L/usr/local/GHC821/lib/ghc-8.2.1/integer-gmp-1.0.1.0" "-L/usr/local/GHC821/lib/ghc-8.2.1/ghc-prim-0.5.1.0" "-L/usr/local/GHC821/lib/ghc-8.2.1/rts" "/tmp/ghc1205_0/ghc_5.o" "/tmp/ghc1205_0/ghc_8.o" "-Wl,-u,base_GHCziInt_I16zh_con_info" : "-lHSbase-4.10.0.0" "-lHSinteger-gmp-1.0.1.0" "-lHSghc-prim-0.5.1.0" "-lHSrts" "-lCffi" "-liconv" "-lcharset" "-lgmp" "-lm" "-lrt" "-lpthread"
長い々引数を使って、やっと実行ファイルが出来上がるとな。そして大事な事は、lHSrtsが リンクされてる事。IOモナドで、アクションが出てくるけど、こやつがその正体なのね。 下々の事は、こいつにまかせて、上の人は、純粋さに酔いしれているとな。
おまけで、コンパイルした時に出来上がる、*.hi ファイル。大事なファイルと言われるけど バイナリーぽくて目障りだったんだ。それを克服する手段が見つかったぞ。
[sakae@fb11 /tmp]$ ghc --show-iface aa.hi Magic: Wanted 33214052, got 33214052 Version: Wanted [8, 0, 2, 1], got [8, 0, 2, 1] Way: Wanted [], got [] interface Main 8021 interface hash: 19f6a4a4da9136a816a32115ec55da59 ABI hash: 50d12cfa3fafa76362ad669e2ab71a6f export-list hash: f771e351bdd1727b0d1a620d7b529ff0 orphan hash: 693e9af84d3dfcc71e640e005bdc5e2e flag hash: 1c9edd8f53b0421dfc05392e725e4fe1 sig of: Nothing used TH splices: False where exports: main module dependencies: package dependencies: base-4.10.0.0* ghc-prim-0.5.1.0 integer-gmp-1.0.1.0 orphans: GHC.Base GHC.Float family instance modules: Control.Applicative Data.Either Data.Functor.Const Data.Functor.Identity Data.Monoid Data.Type.Equality GHC.Generics GHC.IO.Exception GHC.TypeLits GHC.TypeNats : 1ecb270cb7abe920603f26ebb081f978 main :: IO ()
何となく普通の人が見ても、役に立ちそうだな。cabal地獄の一因は、これを見ても分かるな。 しっかりバージョン情報が埋め込まれている。悪い事が出来ない仕掛けなんだな。
その点、UnixがELFに採用してるバージョンマッチは、ファイル名なんだな。こちらの方が 穏やかで良いわい。ああ、これを否定して開発されたのが、前回やったNixOSか。
try install cabal-install
余りghcと戯れていてもしょうがないので、取り合えずcabalを使えるようにしておこう。 その前に、ghcにリンク用の引数を埋め込む。そんなの簡単、aliasでいいじゃんと思ったけど、 何かの都合でaliasが使われない可能性がある。そんな状況が発生する事を考慮して、本体に 埋め込むんだ。幸いな事に、ghcがghc-8.2.1にリンクされてて、そいつがshスクリプトに なってた。以下のように不格好なhackを施す。(ああ、不格好な経営とかいう本がDeNAから 出てて、読んだな。世の中のお役にたてたいって言う理念が、いつの間にか、金儲け集団に なっちゃってる。ああ、余談でした。)
[sakae@fb11 /usr/local/GHC821/bin]$ sudo vi ghc-8.2.1 : # exec "$executablename" -B"$topdir" ${1+"$@"} exec "$executablename" -B"$topdir" -L/usr/local/lib ${1+"$@"}
これでいいかと思ったら、ccを単独で使ってコンパイルしてるな。そういう場合は、上記の おまじないが効かない。さて、どうする? ぐぐれカス。
[sakae@fb11 ~/cabal-install-1.24.0.2]$ export LIBRARY_PATH=/usr/local/lib [sakae@fb11 ~/cabal-install-1.24.0.2]$ CC=cc ./bootstrap.sh -j 2 : Configuring Cabal-1.24.2.0... Setup: Encountered missing dependencies: process >=1.1.0.1 && <1.5 Error during cabal-install bootstrap: Configuring the Cabal package failed.
LIBRARY_PATHってのは、コンパイル時の拡張で、LD_LIBRARY_PATHってのは実行時の拡張なのね。前者は人生65年にして、初めて知った次第。
あれ、cabal地獄の蓋が開いたぞ。この現象って、OpenBSDの時も発生したような。。。。 何とか、閻魔様の眼をかいくぐりたいぞ。またぐぐれかな。
ちと中休みで、-j 2の効用を見てたら、ghcはあくまでシングルで走り、パラレルで走るのは、 バックエンドのCコンパイラーだけなのね。まあ、ghcはmake内蔵なんで、そんなものなのか。 こういうのを、ご隠居さんの無駄知識と言うんだな。
ああ、口の悪い人は、ご隠居さんなんて言うと、自他共に認めたと言うだろうけど、最近読んだ、隠居学って本の影響ね。
隠れて居るから隠居。最近の若い者の中に引き籠りって症状を呈する輩が居るけど、こちらの方が余程もってご隠居さんですよ。本当の隠居さんは、有り余る時間を好きな事に費やせる、余裕な人の事を言うそうなんで、お間違えなきように!
まあ、麻生さんは、そんな金を使わん経済効果ZEROの老人は、早くくたばってしまえ、らしい ですけどね。この間、出版業界に貢献したから許してね。そして、これからの消費計画は、 地元の旨い酒半ダース購入、旨いもん探検隊出発予定となってます。
てんやわんやの探検物語は、椎名誠さんあたりの本でも読めばいいのかな。膨大なシリーズに なってたから、有意義に時間を潰せるだろう。
再び cabal-install
bootstrap.sh fails on MacOS with GHC-8.2.1 を見ると、新しいCabalを用意したとの事なんで、bootstrap.shを書き換えてみた。けど、そんなのは まだ上がっていない。
しょうがないので、 The Cabal package をみたら、processの所が1.7に修正されてた。ならば、今有るやつを書き換えちゃえ。
Cabal-1.24.2.0/Cabal.cabalとCabal.cabal.hackageの該当部分を書き換えた。
そこは通過したけど、今度は
Configuring HTTP-4000.3.3... Setup: Encountered missing dependencies: base >=4.3.0.0 && <4.10, time >=1.1.2.3 && <1.7 Error during cabal-install bootstrap: Configuring the HTTP package failed.
今度は、bootstrap.shを書き換え
HTTP_VER="4000.3.7"; HTTP_VER_REGEXP="4000\.(2\.([5-9]|1[0-9]|2[0-9])|3\.?)" # >= 4000.2.5 < 4000.4
お次のエラーは、
Configuring async-2.1.0... Setup: Encountered missing dependencies: base >=4.3 && <4.10
bootstrap.shのファイルを開いたままにしてのもぐら叩き(不毛ですな)
ASYNC_VER="2.1.1.1"; ASYNC_VER_REGEXP="2\." # 2.*
今度な何だじゃなくて、今度は難だですよ!!
Configuring hashable-1.2.4.0... Setup: Encountered missing dependencies: base >=4.0 && <4.10
また修正
HASHABLE_VER="1.2.6.1"; HASHABLE_VER_REGEXP="1\." # 1.*
次
Configuring cabal-install-1.24.0.2... Setup: Encountered missing dependencies: bytestring >=0.9 && <0.10.2, bytestring-builder >=0.10 && <1, directory ==1.1.*, process >=1.0.1.1 && <1.5
cabal-install.cabalを修正。いよいよ本山にかかったな。
build-depends: directory >= 1.2 && < 1.4, process >= 1.1.0.2 && < 1.7
で、本山の登頂中に、意味不なエラーに遭遇したしたよ。
[ 65 of 106] Compiling Distribution.Client.ProjectPlanOutput ( Distribution/Client/ProjectPlanOutput.hs, dist/build/cabal/cabal-tmp/Distribution/Client/ProjectPlanOutput.o ) Error during cabal-install bootstrap: Building the cabal-install package failed.
こうなったら、パラレルコンパイルを止めて(-j無し)、普通にやってみます。
[ 7 of 106] Compiling Distribution.Client.Compat.Time ( Distribution/Client/Com pat/Time.hs, dist/build/cabal/cabal-tmp/Distribution/Client/Compat/Time.o ) Distribution/Client/Compat/Time.hs:130:41: error: * Couldn't match type `time-1.8.0.2:Data.Time.Clock.Internal.NominalDiffTime.NominalDiffTime' with `time-1.7:Data.Time.Clock.UTC.NominalDiffTime' NB: `time-1.7:Data.Time.Clock.UTC.NominalDiffTime' is defined in `Data.Time.Clock.UTC' in package `time-1.7' `time-1.8.0.2:Data.Time.Clock.Internal.NominalDiffTime.NominalDiffTim$' is defined in `Data.Time.Clock.Internal.NominalDiffTime' in package `time-1.8.0.2' Expected type: POSIXTime Actual type: time-1.8.0.2:Data.Time.Clock.Internal.POSIXTime.POSIXTime * In the first argument of `posixTimeToModTime', namely `(modificationTimeHiRes x)' In the expression: posixTimeToModTime (modificationTimeHiRes x) In an equation for `extractFileTime': extractFileTime x = posixTimeToModTime (modificationTimeHiRes x) | 130 | extractFileTime x = posixTimeToModTime (modificationTimeHiRes x) | ^^^^^^^^^^^^^^^^^^^^^^^ Distribution/Client/Compat/Time.hs:158:41: error: * Couldn't match expected type `time-1.7:Data.Time.Clock.UTC.UTCTime' with actual type `time-1.8.0.2:Data.Time.Clock.Internal.UTCTime.UTCTime$ NB: `time-1.8.0.2:Data.Time.Clock.Internal.UTCTime.UTCTime' is defined in `Data.Time.Clock.Internal.UTCTime' in package `time-1.8.0.2' `time-1.7:Data.Time.Clock.UTC.UTCTime' is defined in `Data.Time.Clock.UTC' in package `time-1.7' * In the second argument of `diffUTCTime', namely `t0' In the first argument of `realToFrac', namely `(t1 `diffUTCTime` t0)' In the first argument of `(/)', namely `realToFrac (t1 `diffUTCTime` t0)' | 158 | return $ realToFrac (t1 `diffUTCTime` t0) / realToFrac posixDayLength | ^^ Error during cabal-install bootstrap: Building the cabal-install package failed.
今度は、ちゃんとエラーの所で止まってくれた。パラレル系は扱いが難しい。(今はそんな、突っ込みは無しです)
該当箇所 Distribution/Client/Compat/Time.hs
129#if MIN_VERSION_unix(2,6,0) 130extractFileTime x = posixTimeToModTime (modificationTimeHiRes x) 131#else 132extractFileTime x = posixSecondsToModTime $ fromIntegral $ fromEnum $ 133 modificationTime x 134#endif : 156#if MIN_VERSION_directory(1,2,0) 157 t1 <- getCurrentTime 158 return $ realToFrac (t1 `diffUTCTime` t0) / realToFrac posixDayLength 159#else 160 t1 <- getClockTime 161 let dt = normalizeTimeDiff (t1 `diffClockTimes` t0) 162 return $ fromIntegral ((24 * tdDay dt) + tdHour dt) / 24.0 163#endif
らちが明かないので、 Getting the Code Version Control cabalから、dev版を取ってきた。README.mdには、
Installing Cabal ---------------- Assuming that you have a pre-existing, older version of `cabal-install`, run: ~~~~ cabal install cabal-install
こんな事が書かれている。古いcabal-installを使って、Lift(ああ、haskell屋が好んで使う用語だな)しろとな。だからさー、オイラーの場合は諸般の事情で古いcabalは入れたくない訳よ。(古いghc属が諸々と入るため)
だめもとで、cabal-installに移動して、強引にbootstrap.shしたら、
[ 95 of 141] Compiling Distribution.Client.FetchUtils ( Distribution/Client/FetchUtils.hs, dist/build/cabal/cabal-tmp/Distribution/Client/FetchUtils.o ) Distribution/Client/FetchUtils.hs:182:36: error: * Couldn't match type `Distribution.Types.PackageId.PackageIdentifier' with `Cabal-2.0.0.2:Distribution.Types.PackageId.PackageIdentifier' NB: `Cabal-2.0.0.2:Distribution.Types.PackageId.PackageIdentifier' is defined in `Distribution.Types.PackageId' in package `Cabal-2.0.0.2' `Distribution.Types.PackageId.PackageIdentifier' is defined in `Distribution.Types.PackageId' in package `Cabal-2.1.0.0' Expected type: Cabal-2.0.0.2:Distribution.Types.PackageId.PackageIdentifier Actual type: PackageId * In the second argument of Sec.downloadPackage', namely `pkgid' In a stmt of a 'do' block: Sec.downloadPackage' rep pkgid path In the second argument of `($)', namely `do info verbosity ("writing " ++ path) Sec.downloadPackage' rep pkgid path' | 182 | Sec.downloadPackage' rep pkgid path | ^^^^^ Error during cabal-install bootstrap: Building the cabal-install package failed.
やっぱり駄目か。しくしく(T_T)
そもそも、素直なghcを使おうと思ったのは、stackで際限なく増え続ける.stackに嫌気が さしたからだった。でも、普通に考えたら、ghcを使っていても、今度は,cabalが鬼のように 増え続ける事うけあい。
だったら、日よってstackにしとけ、、、これが苦労して得た結論かな。