スプーキーズのちょっとTech。

SPOOKIES社内のより技工的な、専門的なブログページです。

M1 Macでnodenvを使ってNode.js 10に切り替える

Node.jsのリリーススケジュール(GitHub - nodejs/Release: Node.js Release Working Groupより引用)

zeosuttです。

4月ですね。
ということは、間もなくNode.js 12がサポート終了となります。早めに後継LTSバージョンへ移行しましょう。

さて、その一つ前のLTSバージョンといえばNode.js 10ですが、
ふとM1 Macで nodenv を使ってNode.js 10に切り替えたくなったので、試してみました。

普通にインストール(失敗)

まずはインストール。いつも通り、普通に nodenv install してみます。

$ nodenv install 10.24.1
Downloading node-v10.24.1.tar.gz...
-> https://nodejs.org/dist/v10.24.1/node-v10.24.1.tar.gz

WARNING: node-v10.24.1 is in LTS Maintenance mode and nearing its end of life.
It only receives *critical* security updates, *critical* bug fixes and documentation updates.

Installing node-v10.24.1...

BUILD FAILED (OS X 12.3 using node-build 4.9.75)

Inspect or clean up the working tree at /var/folders/t4/80l1z5p97p740xdhd30p79hm0000gn/T/node-build.20220407153822.26770.hlBy7W
Results logged to /var/folders/t4/80l1z5p97p740xdhd30p79hm0000gn/T/node-build.20220407153822.26770.log

Last 10 log lines:
^
../deps/openssl/config/archs/linux-x86_64/asm_avx2/crypto/aes/aesni-sha1-x86_64.s:2733:8: error: invalid alignment value
.align 32
       ^
../deps/openssl/config/archs/linux-x86_64/asm_avx2/crypto/aes/aesni-sha1-x86_64.s:3035:1: error: unknown directive
.size aesni_cbc_sha1_enc_shaext,.-aesni_cbc_sha1_enc_shaext
^
make[1]: *** [/private/var/folders/t4/80l1z5p97p740xdhd30p79hm0000gn/T/node-build.20220407153822.26770.hlBy7W/node-v10.24.1/out/Release/obj.target/openssl/deps/openssl/config/archs/linux-x86_64/asm_avx2/crypto/aes/aesni-sha1-x86_64.o] Error 1
rm 0ecf2830a96d494ab5665be6dfef23082ad49156.intermediate
make: *** [node] Error 2

コケます。

linux-x86_64 とか言ってるので、まあそりゃいかんよな、という感じです。
Node.js 14より前はM1 Macに対応していないので、仕方ないですね。

ちなみに、Node.js 12.22.9は一応ビルドに通りました。正しく動くかどうかは分かりませんが。

x64版のビルド済みバイナリを取得してインストール

ビルドができないので、おとなしくビルド済みバイナリ(x64版)を取得します。

手動

バイナリの取得とインストールを手動でやってみます。

まずはバイナリの取得。

nodejs.org

の中で、欲しいのは node-v10.24.1-darwin-x64.tar.gz または node-v10.24.1-darwin-x64.tar.xz ですね。

$ wget -q https://nodejs.org/dist/v10.24.1/node-v10.24.1-darwin-x64.tar.gz
$ tar -xf node-v10.24.1-darwin-x64.tar.gz
$ rm node-v10.24.1-darwin-x64.tar.gz

次に、

Alternatively to the install command, you can download and compile Node manually as a subdirectory of ~/.nodenv/versions/.

GitHub - nodenv/nodenv: Manage multiple NodeJS versions.

を参考にインストール。

$ mv node-v10.24.1-darwin-x64 $(nodenv root)/versions/10.24.1

確認。

$ nodenv versions
  10.24.1

良い感じです。

自動

......いやいや、面倒でしょ。

ということで、nodenvに任せます。

$ arch -x86_64 nodenv install 10.24.1
Downloading node-v10.24.1-darwin-x64.tar.gz...
-> https://nodejs.org/dist/v10.24.1/node-v10.24.1-darwin-x64.tar.gz

WARNING: node-v10.24.1-darwin-x64 is in LTS Maintenance mode and nearing its end of life.
It only receives *critical* security updates, *critical* bug fixes and documentation updates.

Installing node-v10.24.1-darwin-x64...
Installed node-v10.24.1-darwin-x64 to /Users/mitsuru/.anyenv/envs/nodenv/versions/10.24.1

確認。

$ nodenv versions
  10.24.1

ちゃんと入りましたね。

補足

x64な環境で動かしたらそりゃ上手く行くでしょ、という話ではあるんですが、せっかくなので補足。

そもそも、 nodenv install 10.24.1node-v10.24.1.tar.gz を落としてビルドし始めたのは、 uname の結果から得たプラットフォーム darwin-arm64 に対応するエントリが

github.com

に存在しないからです。
M1 Mac向けのバイナリが配布されるようになったのはNode.js 16からなので、当然ですね。

arch -x86_64 を付けて動かせば darwin-x64 に対応するエントリを探すようになるため、上手く行くというわけです。

切り替え

インストールできたので、切り替えます。

$ nodenv local 10.24.1

バージョンと、ついでにアーキテクチャを確認。

$ node --version
v10.24.1
$ node -p process.arch
x64

M1 Macで nodenv を使ってNode.js 10に切り替えることができました。