CentOS7にDenoをインストール

公式サイトに書いてあるやり方でCentOS7にDenoをインストールすると、下のようなエラーが発生する。

```
deno: /lib64/libc.so.6: version `GLIBC_2.18' not found 
```

これを回避する方法について。

## 方法1：glibcのバージョンを上げる

glibcのバージョンが古いことが原因なので、glibcのバージョンを上げてやればよい。
やり方については[こちらのサイト](https://omohikane.com/install_deno_in_centos7/)で詳しく解説されている。

しかし、人によってはglibcをアップデートできない事情もあるだろう。その場合は、以下の方法を使う。

## 方法2：AWS Lambda用のコミュニティビルドを利用する

AWS Lambda用のコミュニティビルドが存在する。
> https://github.com/denoland/deno/issues/1658#issuecomment-632986792
[ここ](https://github.com/hayd/deno-lambda/releases)で公開されているamazonlinux 1バイナリを試してみてください。dockerを使用してcentos7で正常に実行できました。

https://github.com/hayd/deno-lambda/releases からAWS Lambda用のコミュニティビルドをダウンロードできる。これをCentOS7で動かすことができる。

```
curl -L https://github.com/hayd/deno-lambda/releases/download/1.6.0/amz-deno.gz -o deno.gz
gunzip deno.gz
chmod 777 deno
./deno  # repl works
```

ただし、[リポジトリのオーナー氏のコメント](https://github.com/hayd/deno-lambda/pull/115#issuecomment-731648568)によると、バージョン1.6.1以降はCentOS7に対応していないとのこと。
一応、[再度CentOS7用のビルドをリリースしてほしいというissue](https://github.com/hayd/deno-lambda/issues/131)は立っている。

1.6.1以降のバージョンが欲しい場合は、次の方法を使う。

## 方法3：cargo installでソースからビルド

Deno自体はRustのクレートとして公開されている。Rustをインストールしてビルドすることで、古いglibcにも対応できる。

1. Rustをインストール

    [公式サイト](https://www.rust-lang.org/ja/tools/install)の手順に従って、Rustをインストールする。
この辺は正直よく調べてないので、各自の環境に合わせてお好みでということで。

    ```
$ curl https://sh.rustup.rs -sSf | sh
$ cargo --version
cargo 1.51.0
```

2. ~~gcc / g++のバージョンアップ~~

    ~~そのままビルドするとgcc (g++?) のバージョンが古いと言われビルドできない（依存関係のspriv_crossのビルドでエラーが発生する）。~~
    ~~devtoolset-9を利用して、gccのバージョンを上げる。~~

    ```
$ yum install -y centos-release-scl
$ yum install -y devtoolset-9-gcc devtoolset-9-gcc-c++
$ source scl_source enable devtoolset-9
$ g++ --version
g++ (GCC) 9.3.1
```

    ~~参考：
    https://qiita.com/witchcraze/items/3bfd9582d16168e654ae
    https://www.hpc.co.jp/tech-blog/2019/11/08/software_collections/
    （上記サイト内ではdevtoolset-8をインストールしているが、現行の最新版はdevtoolset-9なので、適宜読み替える。）~~

    ※Deno 1.10以降では依存関係にspirv_crossが含まれなくなる？模様。1.10以降のバージョンではg++のインストールは不要~~かもしれない~~。
    <font color="Red">追記</font>：[#9760](https://github.com/denoland/deno/pull/9760)以降、最新版のgcc無しでもビルドできることを確認。

3. ビルド

    さて、次はいよいよビルドを行う。[公式サイトのマニュアル](https://deno.land/manual@main/getting_started/installation)の「Build and install from source using Cargo」の項目を参照。

    ```
$ cargo install deno --locked
```

    以上の手順でビルドすることができる。ビルドには自分の環境では1時間ほどかかった。

    メモリが少ない環境では`linking with ``cc`` failed: exit code: 1` `collect2: ld terminated with signal 9 [Killed]`というエラーが出てビルドに失敗する。最低でも**4GB程度のメモリ**が必要だった。Virtual Boxとかを使ってる人は注意。

## 方法4：git cloneでソースからビルド

git cloneしてソースからビルドすることもできる。[公式サイトのドキュメント](https://deno.land/manual@main/contributing/building_from_source)を参照。

基本的には方法3と同様の流れである。

まずrustのインストール。

```
$ curl https://sh.rustup.rs -sSf | sh
$ cargo --version
cargo 1.51.0
```

~~次にg++のインストール。~~ Deno 1.10以降不要と思われる。

```
$ yum install -y centos-release-scl
$ yum install -y devtoolset-9-gcc devtoolset-9-gcc-c++
$ source scl_source enable devtoolset-9
$ g++ --version
g++ (GCC) 9.3.1
```

最後に、git cloneしてビルドを行う。

```
$ git clone --recurse-submodules --branch main --depth 1 https://github.com/denoland/deno.git
$ cd ./deno
$ cargo build
```

これで`./target/debug/`以下に`deno`という名前のファイルが作成されていればビルド成功。
以下のように実行できる。

```
$ ./target/debug/deno
```

なお、git cloneするにあたって16GB程度のストレージが必要だった。Virtual Boxとかを使ってる人はこちらも注意されたし。


以下追記↓
## 方法5：dockerを使う

「windows上で生成（ビルド）した実行ファイルをCentOS7に送って実行する」というパターン。
dockerよく分からないんですが、とりあえず下のdockerfileでビルドに成功した。（Deno1.10.1で試した）

```dockerfile
FROM centos:7

RUN yum upgrade -y \
    && yum install -y gcc \
    && yum clean packages \
    && curl -sSf https://sh.rustup.rs | sh -s -- -y

WORKDIR /tmp
CMD . ~/.cargo/env \
    && cargo --version \
    && cc --version \
    && cargo install deno --locked \
    && mv /root/.cargo/bin/deno /output
```
設定はこんな感じで↓。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678625/3d154571-e6ad-4c21-e03c-44b9b265195e.png)

また、https://gist.github.com/nodakai/bc0c80381cd0b787d8a5c65a1771ef5f で公開されているdockerfileを使ってもビルドすることができた。（こっちはgit cloneするやつ）