…ときに色々詰まったのでメモ.最近は関連ツールも充実していて,基本的には引っかかるところはないと思うのだが,多分 arch 独自の引っかかりポイントとかがあり少しだけ手間がかかった.以前なら stack
だけでインストールしていたのだけれど,なんか自分で適宜最近の ghc
のバージョン見たりよしなに resolver を選んだりとか色々めんどくさいなーという感じとか,stack に cabal に language server にとそれぞれ多層に管理するのわけわからんくなるなとも思ったのとか,一度試しておくかというので,今回は流行りっぽい ghcup を使った.
このタイミングでの作り直しは開発環境に関するこの記事(Haskell に IDE はないのか?──独断と偏見による Haskell の IDE 十年史)を読んで触発されたというのもある.元々 Haskell は 2015-6年頃までが一番良く触っていて,その後そもそもコードを書くことが減ったのと,ちょうどこの記事にも書かれている ghc-mod
が止まって, haskell-ide-engine
がうまく動かない(ガンガンメモリを食って動かなかったり いろいろうまく行かなかった)時期と重なっていた.当時は vim で lsp を扱うプラグイン類も過渡期にあって,ghcmod-vim
と neco-ghc
でハッピーだった時代が終わり始め,かと行って新しい環境への以降もうまく行かず,コードを書く機会が少ない→環境設定に関するトラブルシュートが下手になる→ますますめんどくさい,などもあって,書くなら rust というふうに移っていった.(この辺のツール周りは rust が本当に親切だとおもう.)
$ pacman -Qs haskell
とかで色々インストールされていた(少し前に pandoc インストールしたときのかも)のはややこしくなりそうなので消しておいて,とりあえず指示通りに
$ curl --proto '=https' --tlsv1.2 -sSf https://get-ghcup.haskell.org | sh
して少ない質問項目に答えていく..bashrc
に Append
してもらい,ghc, cabal, stack, hls までインストールしてもらう.さらにおすすめに従って,
$ stack config set system-ghc true --global; stack config set install-ghc false --global
で,stack さんには ghcup で入った ghc を尊重してもらうことにする.
stack new
して stack build
を試みるとこんな感じで
Linking /home/kagcc/.stack/setup-exe-cache/x86_64-linux/tmp-Cabal-simple_mPHDZzAJ_3.2.1.0_ghc-8.10.7 ...
ld.lld: error: can't create dynamic relocation R_X86_64_32 against local symbol in readonly segment; recompile object files with -fPIC or pass '-Wl,-z,notext' to allow text relocations in the output
>>> defined in /home/kagcc/.stack/setup-exe-src/setup-mPHDZzAJ.o
>>> referenced by /home/kagcc/.stack/setup-exe-src/setup-mPHDZzAJ.o:(.text+0x44)
大量のエラーが出てしまう.cabal init; cabal build
でも同様.調べた範囲で関連するのは stack に関する stackoverflow の これ や ghcup の issue のこれ.
とりあえず,ghcup の方を見て ~/.cabal/config
に
program-default-options
ghc-options: -optc-no-pie -optl-no-pie
を追記するととりあえずcabal によるコンパイル自体は通るようになる. stack
の方は --ghc-options=
で渡そうとしたがなぜだか効果なし(ちょっと調べたら調べが付きそうだが…).-fPIC
で再コンパイルを試せと言われても,ghcup
さんに任せたところだから変な手出しはややこしくなるだけの気配.
stackoverflow の方でリンクされている stack
の方の FAQ を見ると,GHC がお使いの (C) コンパイラが -no-pie
に対応してないと思い込んでるというようなことで,ghcup で入れた今回だと
~/.ghcup/ghc/8.10.7/lib/ghc-8.10.7/settings
に
("C compiler supports -no-pie", "NO")
というくだりがあるので,これを YES
に書き換えると解決する.これで ~/.cabal/config
のオプションは多分消して大丈夫.
Arch(したがってmanjaro)では haskell 周りもできるだけ動的リンクにしようとするが GHC などがそれが得意でないので色々ややこしいという情報が散見されて調査に要らん手間を掛けてしまったが,一晩寝ると結局最初に引っかかるページに書いてあるのそのままで良かったという案件.ただ,これは多分 ghcup で ghc を入れ替えるたびに書き換えが必要になるので,もう少し抜本的に解決できるといいと思うのだが,そこまでは調査が及ばず.
ちなみに, haskell-language-server についてもはじめ動かなくて一瞬発狂していたが,古いバージョンが ~/.local/bin
に残っていただけだった.環境をきれいにしてから取り組むの大事.