1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

CentOS7にDenoをインストール

Last updated at Posted at 2021-05-07

公式サイトに書いてあるやり方で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にも対応できる。

  1. 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無しでもビルドできることを確認。
  1. ビルド

    さて、次はいよいよビルドを行う。公式サイトのマニュアルの「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://gist.github.com/nodakai/bc0c80381cd0b787d8a5c65a1771ef5f で公開されているdockerfileを使ってもビルドすることができた。(こっちはgit cloneするやつ)

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?