haskell and FreeBSD 11.1

鈴虫が盛んに鳴く季節。あの忌まわしい蚊もゆく夏を惜しんで活動を活発化してる。

また、蚊の被害を受けた。残念ながら犯行現場とホシは特定出来ず。今回の被害は、 ケツの穴の近く。今年で2度目の被害。変態蚊がうろちょろしてるんだな。

駐在さんか役場の方に言って、犯人を逮捕して欲しいぞ。なんたって、目にも見えにくい ストーカーですからな。

被害に遭った本人は、身悶えしております。痒くても迂闊に掻ける場所ではないからね。 一時の快楽に浸ってしまうと、痔になるとか、とんでもない後遺症を併発しそうなので、 全治5日ぐらいまで、ひたすらMになってましょ。

全国各地で、ストーカーが蔓延してるみたいで、今年バージョンの対策が出てた。

蚊に刺されないための7つの対策と、かゆみを抑える9つの方法

今年の夏こそ虫に刺されない宣言!虫刺され予防対策をご紹介

いろいろ紹介されてるけど、決定的なものは無いなあ。絶対に刺されない方法を研究して、誰か (イグ)ノーベル賞を取ってください。それが人類を幸福に導きますよ。

でもまあ、蚊のストーカー被害ぐらいならよしとするか。殺人鬼のヒアリの被害には遭っていないからね。

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は 融通の利かない奴って事だな。

Linking options

を見ると、-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にしとけ、、、これが苦労して得た結論かな。