Ubuntu (WSL) に asdf をインストールして Ruby と Crystal をそれぞれ複数バージョンインストール

# asdf とは

プログラミング言語などのバージョンを管理するツールです。
Ruby なら rbenv が有名ですが、asdf は様々なプログラミング言語やツールについて複数のバージョンを自在に切り替えながら使うことを可能にしてくれます。

https://asdf-vm.com/

# なぜ asdf を使いたいのか

「複数の言語を」「単一のしくみ」でバージョン管理できる点が嬉しいです。

私は Ruby と Crystal を使って競技プログラミングをやっているのですが、コンテストでは必ずしも各言語の最新バージョンを使えるわけではありません。かつ、ときどきコンテストサイトで言語アップデートがあってバージョンが変わるのに追随する必要があります。
また、使っている言語の最新バージョンが出るとやっぱりさわってみたくなったりもします。

asdf なら、Ruby も Crystal も（新しく増えたらその言語も）同じしくみで、コンテスト用のバージョンから最新バージョンまで簡単に切り替えながら使えていろいろ捗ります。

# 環境、前提条件など

Ubuntu 20.04.4 LTS (Windows 11 上の WSL2)
2022年8月21日に `sudo apt update && sudo apt upgrade` した直後の状態からそのまま下記を行っていきました。

# asdf （のコア）のインストール

[公式ガイド](https://asdf-vm.com/guide/getting-started.html) に沿って。
まずは git clone。

```shell
git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.10.2
```

~/.bashrc 編集。下記を追記。

```shell:.bashrc
. $HOME/.asdf/asdf.sh
. $HOME/.asdf/completions/asdf.bash
```

ここで .bashrc を効かせるためにいったんログアウトしてログインし直し。

# Ruby のインストール

まずは asdf の Ruby 用 plugin をインストール。

```shell
asdf plugin add ruby https://github.com/asdf-vm/asdf-ruby.git
```

いよいよ Ruby （バージョンは競技プログラミング用に 2.7.1）をインストール、しようとしたらこけた。

```shell
naokid@myhost:~$ asdf install ruby 2.7.1
No system openssl version was found, ensure openssl headers are installed (https://github.com/rbenv/ruby-build/wiki#suggested-build-environment)Downloading openssl-1.1.1q.tar.gz...
-> https://dqw8nmjcqpjn7.cloudfront.net/d7939ce614029cdff0b6c20f0e2e5703158a489a72b2507b8bd51bf8c8fd10ca
Installing openssl-1.1.1q...
patching file test/v3ext.c

BUILD FAILED (Ubuntu 20.04 using ruby-build 20220726)

Inspect or clean up the working tree at /tmp/ruby-build.20220821011037.396.xnGcMh
Results logged to /tmp/ruby-build.20220821011037.396.log

Last 10 log lines:
***   issue on GitHub <https://github.com/openssl/openssl/issues>  ***
***   and include the output from the following command:           ***
***                                                                ***
***       perl configdata.pm --dump                                ***
***                                                                ***
***   (If you are new to OpenSSL, you might want to consult the    ***
***   'Troubleshooting' section in the INSTALL file first)         ***
***                                                                ***
**********************************************************************
/home/naokid/.asdf/plugins/ruby/ruby-build/bin/ruby-build: line 595: make: command not found
```

冒頭に openssl 関連の記述がありますが、そこより末尾のほうで `make` が無いぞって怒られてるらしいのがダメそうです。

https://github.com/asdf-vm/asdf-ruby#install を見るとこう書いてありました。

> Please make sure you have the required system dependencies installed before trying to install Ruby.

あっはいすみません。

https://github.com/rbenv/ruby-build/wiki#suggested-build-environment を見て、下記を実行しました。

```shell
sudo apt-get install autoconf bison build-essential libssl-dev libyaml-dev libreadline6-
dev zlib1g-dev libncurses5-dev libffi-dev libgdbm6 libgdbm-dev libdb-dev uuid-dev
```

あらためて Ruby 2.7.1 のインストール、今度は成功。

```shell
naokid@myhost:~$ asdf install ruby 2.7.1
Downloading ruby-2.7.1.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.1.tar.bz2
Installing ruby-2.7.1...
Installed ruby-2.7.1 to /home/naokid/.asdf/installs/ruby/2.7.1
```

せっかくなので最新版も入れときます。

```shell
naokid@myhost:~$ asdf install ruby latest
Downloading ruby-3.1.2.tar.gz...
-> https://cache.ruby-lang.org/pub/ruby/3.1/ruby-3.1.2.tar.gz
Installing ruby-3.1.2...
Installed ruby-3.1.2 to /home/naokid/.asdf/installs/ruby/3.1.2
```

使うバージョンは 2.7.1 に設定。

```shell
naokid@myhost:~$ asdf global ruby 2.7.1
naokid@myhost:~$ ruby --version
ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [x86_64-linux]
```

# Crystal のインストール

Crystal の公式サイトに超簡潔な [インストラクション](https://ja.crystal-lang.org/install/from_asdf/) がありました。

asdf の Crystal 用 plugin をインストール。

```shell
asdf plugin add crystal
```

続いて Crystal をインストール。
やはり競技プログラミング用に 0.33.0 と、最新バージョン（1.5.0 でした）もインストールしておきます。使うバージョンは 0.33.0 で。

```shell
naokid@myhost:~$ asdf install crystal 0.33.0
∗ Downloading and installing Crystal...
The installation was successful!
naokid@myhost:~$ 
naokid@myhost:~$ asdf install crystal latest
∗ Downloading and installing Crystal...
The installation was successful!
naokid@myhost:~$ asdf list crystal
  0.33.0
  1.5.0
naokid@myhost:~$ 
naokid@myhost:~$ asdf global crystal 0.33.0
naokid@myhost:~$ crystal --version
Crystal 0.33.0 [612825a53] (2020-02-14)

LLVM: 8.0.0
Default target: x86_64-unknown-linux-gnu
```

すんなり成功！
…と思ったのですが、その後、簡素なテストプログラムを書いてテストしてみたらエラーに。

```Crystal:test.cr
puts "Hello, world!!"
```

```shell
naokid@myhost:~$ crystal ./test.cr 
/usr/bin/ld: cannot find -levent (this usually means you need to install the development package for libevent)
collect2: error: ld returned 1 exit status
Error: execution of command failed with code: 1: `cc "${@}" -o '/home/naokid/.cache/crystal/crystal-run-test.tmp'  -rdynamic  -lpcre -lm /home/naokid/.asdf/installs/crystal/0.33.0/bin/../lib/crystal/lib/libgc.a -lpthread /home/naokid/.asdf/installs/crystal/0.33.0/share/crystal/src/ext/libcrystal.a -levent -lrt -ldl -L/home/naokid/.asdf/installs/crystal/0.33.0/bin/../lib/crystal/lib -L/usr/lib -L/usr/local/lib`
```

また何か無いぞって怒られてますね。学習能力…
https://github.com/crystal-lang/crystal/wiki/All-required-libraries を見つけて、下記を実行しました。

```shell
sudo apt-get install -y \
  automake \
  build-essential \
  git \
  libbsd-dev \
  libedit-dev \
  libevent-dev \
  libgmp-dev \
  libgmpxx4ldbl \
  libpcre3-dev \
  libssl-dev \
  libtool \
  libxml2-dev \
  libyaml-dev \
  lld \
  llvm \
  llvm-dev\
  libz-dev
```

あらためて。

```shell
naokid@myhost:~$ crystal ./test.cr
Hello, world!!
```

めでたしめでたし。

# 参考

この記事はインストール（トラブル）の記録って感じでした（になってしまいました）。
asdf や Ruby、Crystal について私より詳しい方々が書いた記事として以下を紹介しておきます。

https://zenn.dev/universato/articles/20210529-z-crystal

https://zenn.dev/kentarok/articles/bc196b7bd196ce