気を散らすノート

色々と散った気をまとめておくところ.論文読んだり自分で遊んだりする.たぶん.

Arch (manjaro) で Haskell 環境を作り直す (ld.lld: error)

…ときに色々詰まったのでメモ.最近は関連ツールも充実していて,基本的には引っかかるところはないと思うのだが,多分 arch 独自の引っかかりポイントとかがあり少しだけ手間がかかった.以前なら stack だけでインストールしていたのだけれど,なんか自分で適宜最近の ghc のバージョン見たりよしなに resolver を選んだりとか色々めんどくさいなーという感じとか,stack に cabal に language server にとそれぞれ多層に管理するのわけわからんくなるなとも思ったのとか,一度試しておくかというので,今回は流行りっぽい ghcup を使った.

このタイミングでの作り直しは開発環境に関するこの記事(Haskell に IDE はないのか?──独断と偏見による Haskell の IDE 十年史)を読んで触発されたというのもある.元々 Haskell は 2015-6年頃までが一番良く触っていて,その後そもそもコードを書くことが減ったのと,ちょうどこの記事にも書かれている ghc-mod が止まって, haskell-ide-engine がうまく動かない(ガンガンメモリを食って動かなかったり いろいろうまく行かなかった)時期と重なっていた.当時は vim で lsp を扱うプラグイン類も過渡期にあって,ghcmod-vimneco-ghc でハッピーだった時代が終わり始め,かと行って新しい環境への以降もうまく行かず,コードを書く機会が少ない→環境設定に関するトラブルシュートが下手になる→ますますめんどくさい,などもあって,書くなら rust というふうに移っていった.(この辺のツール周りは rust が本当に親切だとおもう.)

$ pacman -Qs haskell とかで色々インストールされていた(少し前に pandoc インストールしたときのかも)のはややこしくなりそうなので消しておいて,とりあえず指示通りに

$ curl --proto '=https' --tlsv1.2 -sSf https://get-ghcup.haskell.org | sh

して少ない質問項目に答えていく..bashrcAppend してもらい,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 に残っていただけだった.環境をきれいにしてから取り組むの大事.