公式サイトに書いてあるやり方でCentOS7にDenoをインストールすると、下のようなエラーが発生する。
deno: /lib64/libc.so.6: version `GLIBC_2.18' not found
これを回避する方法について。
方法1:glibcのバージョンを上げる
glibcのバージョンが古いことが原因なので、glibcのバージョンを上げてやればよい。
やり方についてはこちらのサイトで詳しく解説されている。
しかし、人によってはglibcをアップデートできない事情もあるだろう。その場合は、以下の方法を使う。
方法2:AWS Lambda用のコミュニティビルドを利用する
AWS Lambda用のコミュニティビルドが存在する。
https://github.com/denoland/deno/issues/1658#issuecomment-632986792
ここで公開されている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
ただし、リポジトリのオーナー氏のコメントによると、バージョン1.6.1以降はCentOS7に対応していないとのこと。
一応、再度CentOS7用のビルドをリリースしてほしいというissueは立っている。
1.6.1以降のバージョンが欲しい場合は、次の方法を使う。
方法3:cargo installでソースからビルド
Deno自体はRustのクレートとして公開されている。Rustをインストールしてビルドすることで、古いglibcにも対応できる。
-
Rustをインストール
公式サイトの手順に従って、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無しでもビルドできることを確認。
-
ビルド
さて、次はいよいよビルドを行う。公式サイトのマニュアルの「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
また、https://gist.github.com/nodakai/bc0c80381cd0b787d8a5c65a1771ef5f で公開されているdockerfileを使ってもビルドすることができた。(こっちはgit cloneするやつ)