haskell-jp / atcoder-lang-updates #8 at 2023-06-29 07:33:05 +0900

フィードバック #119 を見てて思ったのですが,インストールの最後に
rm -rf ~/.ghcup/bin/ghcup ~/.ghcup/cache ~/.ghcup/logs ~/.ghcup/tmp ~/.cabal/logs

あたり実行した方が良いのでしょうか?


フィードバック #119 の引用:
https://docs.google.com/spreadsheets/d/1HXyOXt5bKwhKWXruzUvfMFHQtBxfZQ0047W7VVObnXI/edit#gid=1835616968&range=123:123
Q:「インストール時に一時的に使用するファイルは/tmpに置くようにしてもらえると実行環境からは除かれるので“助かります“」とありますが、
インストールからコンパイル、コンパイルから実行への転送量がジャッジの負荷やコストに結構影響するのでしょうか?
例えば、インストールで使った git を apt-get remove && apt-get autoremove したり、
コンパイル後にコンパイラとライブラリを消したほうがいいですか?

A: インストールに際して一時的に使用されるもののみ/tmpに置く、ないしはインストールの最後に削除していただくとジャッジを複数台立てるときにそのコピーするデータ量が減るためありがたいということです
例えばコンパイラ本体を含む圧縮ファイルや、バイナリインストールのためにダウンロードしてきたソースコードなどは実行環境上には不要なものであるはずなので、それらは基本的に/tmpで作業をしてもらえるとインストールコマンドをすべて実行し終わったあとに削除され、コンパイル/実行環境からは消えた状態となります

コンパイル時に行った各種操作による後片付けはしなくても大丈夫です
逆に下手にコンパイル時に後片付けを行うと
- 実行時に必要なファイルまで間違えて消してしまう可能性がある
- 後片付けもコンパイル時間に含まれ、コンパイル時間は一定時間で制限されているためこの制限時間を超えてしまう可能性がある
といった点からおすすめはしません
明日昼にテストをした上で,24:00を目処に ~/.ghcup/trash を加えて

rm -rf ~/.ghcup/bin/ghcup ~/.ghcup/cache ~/.ghcup/logs ~/.ghcup/tmp ~/.ghcup/trash ~/.cabal/logs

を最後に実行するように変更しようかと思います.ご意見があればお願いします.
忘れてました.

sudo apt-get remove -y libncurses-dev libncurses5
sudo apt-get autoremove -y

も試したいと思います. ghcupghcup tui のために vty を通して ncurses に依存しますが,それを必要とするパッケージが我々のdependency に含まれないように見えるからです.
追加で,コマンド最初の apt-get を

$ sudo apt-get install -y build-essential curl libffi-dev libffi8ubuntu1 libgmp-dev libgmp10 libncurses-dev libncurses5 libtinfo5 llvm-14

から

$ sudo apt-get install -y curl
$ sudo apt-get install -y --no-install-recommends build-essential curl libffi-dev libffi8ubuntu1 libgmp-dev libgmp10 libncurses-dev libncurses5 libtinfo5 llvm-14

に変更しました.その上で,インストール最後に

$ sudo apt-get remove -y curl libncurses5 libncurses-dev
$ sudo apt-get autoremove -y
$ rm -rf ~/.ghcup/bin/ghcup ~/.ghcup/cache ~/.ghcup/logs ~/.ghcup/tmp ~/.ghcup/trash ~/.cabal/logs

を実行した上で,モジュールインポートのコードのビルド・実行が正しく行われることを確認しました!
https://docs.google.com/spreadsheets/d/1HXyOXt5bKwhKWXruzUvfMFHQtBxfZQ0047W7VVObnXI/edit#gid=408033513&range=K38

上の内容を提案シートに反映しました.ただし,

$ sudo apt-get remove -y curl libncurses5 libncurses-dev
$ sudo apt-get autoremove -y

については追加を見合わせました.この理由は,GHC/cabal-install の実行に curl, libncurses5, libncurses-dev が必要ないという確信を持てなくなったからです.そもそも,これらのパッケージは言語環境インストール開始時に次のコマンドでインストールしたものです.

$ sudo apt-get install -y --no-install-recommends build-essential curl libffi-dev libffi8ubuntu1 libgmp-dev libgmp10 libncurses-dev libncurses5 libtinfo5 llvm-14

これらインストールパッケージの由来は, GHCup がインストール時に要求する System Requirementsです.実際の文面は次のとおり:

System requirements 
  Please ensure the following distro packages are installed before continuing (you can exit ghcup and return at any time): build-essential curl libffi-dev libffi8ubuntu1 libgmp-dev libgmp10 libncurses-dev libncurses5 libtinfo5

そこで,GHCupインストールスクリプトのこのメッセージを発行する箇所() を読みにいって確認したところ,これは $ ghcup tool-requirements によって表示されていることがわかりました. ghcup tool-requirements の機能は, --help によれば

Show the requirements for ghc/cabal
とのことで,このたびの apt-get remove の追加見合わせはこの一文が理由です. どう考えても curl やら ncurses やら使ってそうなのは ghcup だろと断言したいのは山々なのですが,安全側に倒しておきたいと判断しました.