Linuxを日常的に使う実験ブログ

/tmpディレクトリの容量不足でghcupの導入に失敗したときの対処法

 2021-09-20

 プログラミング

こんにちは。今回のテーマは「/tmpディレクトリの容量不足でghcupの導入に失敗したときの対処法」です。最近、古いマシンにHaskellの開発ツールの管理やインストールを行うghcupを入れようとしたところghcのビルドでコケてしまい無駄に時間を使いましたので記事化しておこうと思いました。結論だけ知りたい人は/tmpディレクトリの容量が足りないときの対策をご覧ください。本記事はLinuxを対象として書かれています。Macでは未検証です。 [adsense02] 【目次】 ghcupとは /tmpディレクトリの容量が少ないとインストールに失敗する /tmpディレクトリの容量が足りないときの対策

ghcupとは

ghcupとはHaskellの開発ツール郡をインストールするためのツールです。HaskellコンパイラのデファクトスタンダードであるGHCをはじめ、Haskell Language Server(HLS)、cabal, stackなどをインストールすることが出来ます。すべてのツールが~/.ghcupディレクトリにまとめられるため、アンインストールも~/.ghcupディレクトリを削除するだけで済み、システムがクリーンに保たれます。 ghcのバージョンが複数選べることも特長であり、各ディストリビューションの公式リポジトリからインストールするghcよりも最新のバージョンを使えるメリットがあります。

/tmpディレクトリの容量が少ないとインストールに失敗する

今回ghcupの導入を試みたマシンは10年ほど前に現役だったメモリ4GBです。特に設定をしなければ/tmpの容量はRAMの半分が割り当てられます。当方の環境では約2GB(1.9GB)が/tmpの容量となります。 しかし、ghcup導入時にはghcをビルドするため、大きな容量が必要となります。筆者がver. 8.10.7のghcを導入する際には1.9GBの容量では足りずビルドに失敗してしまいました。

[ Error ] BuildFailed failed in dir "/tmp/ghcup-4b808ccd04155ba3": Process "sh" with arguments ["./configure","--prefix=/home/kuro/.ghcup/ghc/8.10.7"] failed with exit code 1.
[ ...   ]     Check the logs at /home/kuro/.ghcup/logs and the build directory /tmp/ghcup-4b808ccd04155ba3 for more clues.
[ ...   ]     Make sure to clean up /tmp/ghcup-4b808ccd04155ba3 afterwards.
"_eghcup --cache install ghc recommended" failed!

その時のログを見ると以下のような記録が残されています。

./configure: line 1926: cannot create temp file for here-document: No space left on device
./configure: line 1938: cannot create temp file for here-document: No space left on device
./configure: line 1967: printf: write error: No space left on device
./configure: line 1967: printf: write error: No space left on device
...

明らかに容量不足ですね。実はビルドに使用されるディレクトリは最低でも5GBが必要だとされています。

/tmpディレクトリの容量が足りないときの対策

/tmpディレクトリの容量を増やすという手もあるのですが、今回は一時的にビルドに使用するディレクトリを別のディレクトリに変えることで解決します。以下のようにコマンドを実行してghcupを導入していきます。環境変数TMPDIRを指定するのがキモです。

mkdir -p ~/tmp
export -p TMPDIR="$HOME/tmp
curl --proto '=https' --tlsv1.2 -sSf https://get-ghcup.haskell.org | sh

これで~/tmpをビルド用のディレクトリとして使用できるはずです。

最後に

長々と書きましたが、要は環境変数を変えてビルドを通しましょうというお話でした。 低メモリのマシンにghcupを導入する際にビルドがコケて困っている方のためにお役に立てば幸いです。 【関連記事】 FizzBuzz問題で考えるHaskellと問題解決のアプローチ [adsense]