Armadilloフォーラム

ATDEへの node.js インストールについて

nf

2020年12月2日 16時59分

ATDE7 に nvm コマンドを使用して node.js をインストールしようとしたところ、コンパイルエラーとなりました。

コマンド

$ nvm install 14.15.1

エラー内容

cc -o /home/atmark/.nvm/.cache/src/node-v14.15.1/files/out/Release/obj.target/zlib/deps/zlib/contrib/optimizations/inffast_chunk.o ../deps/zlib/contrib/optimizations/inffast_chunk.c '-DV8_DEPRECATION_WARNINGS' '-DV8_IMMINENT_DEPRECATION_WARNINGS' '-D__STDC_FORMAT_MACROS' '-DOPENSSL_NO_PINSHARED' '-DOPENSSL_THREADS' '-DHAVE_HIDDEN' '-DADLER32_SIMD_SSSE3' '-DINFLATE_CHUNK_SIMD_SSE2' '-DCRC32_SIMD_SSE42_PCLMUL' -I../deps/zlib  -pthread -Wall -Wextra -Wno-unused-parameter -m32 -O3 -fno-omit-frame-pointer  -MMD -MF /home/atmark/.nvm/.cache/src/node-v14.15.1/files/out/Release/.deps//home/atmark/.nvm/.cache/src/node-v14.15.1/files/out/Release/obj.target/zlib/deps/zlib/contrib/optimizations/inffast_chunk.o.d.raw   -c
In file included from ../deps/zlib/contrib/optimizations/inffast_chunk.c:10:0:
../deps/zlib/contrib/optimizations/chunkcopy.h: In function ‘loadchunk’:
../deps/zlib/contrib/optimizations/chunkcopy.h:52:5: warning: SSE vector return without SSE enabled changes the ABI [-Wpsabi]
     const unsigned char FAR* s) {
     ^~~~~
In file included from ../deps/zlib/contrib/optimizations/chunkcopy.h:32:0,
                 from ../deps/zlib/contrib/optimizations/inffast_chunk.c:10:
../deps/zlib/contrib/optimizations/chunkcopy.h: In function ‘v_load64_dup’:
/usr/lib/gcc/i686-linux-gnu/6/include/emmintrin.h:625:1: error: inlining failed in call to always_inline ‘_mm_set1_epi64x’: target specific option mismatch
 _mm_set1_epi64x (long long __A)
 ^~~~~~~~~~~~~~~
In file included from ../deps/zlib/contrib/optimizations/inffast_chunk.c:10:0:
../deps/zlib/contrib/optimizations/chunkcopy.h:215:10: note: called from here
   return _mm_set1_epi64x(i64);
          ^~~~~~~~~~~~~~~~~~~~

システムバージョン

$ uname -a
Linux atde7 4.9.0-12-686-pae #1 SMP Debian 4.9.210-1+deb9u1 (2020-06-07) i686 GNU/Linux

対応方法ご教授いただければ幸いです。
よろしくお願いいたします。

コメント

花田です。

> ATDE7 に nvm コマンドを使用して node.js をインストールしようとしたところ、コンパイルエラーとなりました。
> ../deps/zlib/contrib/optimizations/chunkcopy.h: In function ‘v_load64_dup’:
> /usr/lib/gcc/i686-linux-gnu/6/include/emmintrin.h:625:1: error: inlining failed in call to always_inline ‘_mm_set1_epi64x’: target specific option mismatch
> _mm_set1_epi64x (long long __A)
> ^~~~~~~~~~~~~~~

i386(x86)環境では使えない(amd64用の)optionでビルドしようとしてますね。
ATDE7相当の環境をamd64で構築した場合は、当たらない問題です。
また、現時点で最新版LTSとなっているv14.15.1特有のバグであって、v15.3.0を試してみると問題なく通ります。

直接のnodeのissueはこれです。

zlib change broke x86 builds · Issue #33019 · nodejs/node · GitHub
https://github.com/nodejs/node/issues/33019

直接的には、下記PRが通ってしまったことによる副作用です。

deps: fix zlib compilation for CPUs without SIMD features by addaleax · Pull Request #32627 · nodejs/node · GitHub
https://github.com/nodejs/node/pull/32627

あんまり綺麗な方法にはなりませんが「i386環境のまま」「v14.15.1を使用」するワークアラウンドとして、下記のような方法を紹介します。

添付のnvm.patchを(nvmのインストールされたアカウントの)ホームディレクトリに置いてから、

atmark@atde7:~$ cat nvm.patch | patch -p0
patching file .nvm/nvm.sh
atmark@atde7:~$ source .profile
atmark@atde7:~$ nvm install v14.15.1

これだけです。

patchの中身は下記のようなもの。

@@ -2236,6 +2236,7 @@
     command "${tar}" -x${tar_compression_flag}f "${TARBALL}" -C "${TMPDIR}" --strip-components 1 && \
     VERSION_PATH="$(nvm_version_path "${PREFIXED_VERSION}")" && \
     nvm_cd "${TMPDIR}" && \
+    ( "${VERSION_PATH}" != "v14.15.1" || wget -O - "https://github.com/nodejs/node/commit/b211c4dea1bae6a8816321987e9da1e52e94db4d.patch" | patch -p1 -R) && \
     nvm_echo '$>'./configure --prefix="${VERSION_PATH}" $ADDITIONAL_PARAMETERS'<' && \
     ./configure --prefix="${VERSION_PATH}" $ADDITIONAL_PARAMETERS && \
     $make -j "${NVM_MAKE_JOBS}" ${MAKE_CXX-} && \

wgetしているのが、先ほどの問題のPRにあたるパッチ。これを使って、v14.15.1の時だけ強制的に逆パッチしているだけです。お試しください。

ファイル ファイルの説明
nvm.patch nvmパッチ(node v14.15.1 for i386用)

花田様

ご回答ありがとうございます。

開発バージョンを使用するのは避けたいので、頂いたパッチを使用して 14.15.1 を再度インストールしてみます。

花田様

頂いたパッチで 14.15.1 をインストールできました。
ありがとうございました。

話がそれて恐縮ですが、参考までに伺いたいのですが、

> ATDE7相当の環境をamd64で構築

Debian9 をセットアップ後、以下ページの「3. クロス開発環境のインストール」でATDE7 と同等環境になりますでしょうか?
https://armadillo.atmark-techno.com/blog/8700/3542

at_akihito.irie

2020年12月4日 17時17分

入江です。

> Debian9 をセットアップ後、以下ページの「3. クロス開発環境のインストール」でATDE7 と同等環境になりますでしょうか?
> https://armadillo.atmark-techno.com/blog/8700/3542

上記ページの「3. クロス開発環境のインストール」の「6. Armadillo用のク
ロス開発環境一式をインストールします。」まで行った後に以下の手順を行う
ことでATDE7と同等の環境が作成できます。

1. /etc/apt/preference.d/atmark-techno-pin-1001を作成し、以下のように編集します。

[PC]$ sudo vi /etc/apt/preferences.d/atmark-techno-pin-1001 
[PC]$ cat /etc/apt/preferences.d/atmark-techno-pin-1001 
Package: *
Pin: origin download.atmark-techno.com
Pin-Priority: 1001

2. 以下のコマンドを実行し、必要なパッケージをインストールします。

[PC]$ sudo dpkg --add-architecture armhf
[PC]$ sudo apt-get update
[PC]$ sudo apt-get install atftpd minicom emacs gedit git git-svn valgrind dosfstools squashfs-tools uim-mozc apt-file openbsd-inetd manpages-dev manpages-ja-dev lighttpd sbuild open-vm-tools-dkms dkms open-vm-tools-desktop libncurses-dev a600-essential

以上、よろしくお願いいたします。