
新しいWindows 10 PCを購入し、以下を使用して(管理者として)WSL 2をインストールしました。
wsl --install
これにより、WSL 2およびUbuntu 20.04 LTSがインストールされます。その後、WSL2とUbuntu 18.04.6 LTSを使用して、同じWindows 10 proオペレーティングシステムを使用する古いPCからファイルをコピーしました。
同じフォルダで同じMakefileを使用するとエラーが発生します。
make[1]: execvp: /bin/bash: Argument list too long
›cd /mnt/g/public_html/
›cd my_notes/
›cd solving_ODE/
›cd current_version
›cd OUTPUT/
›make -I$HOME all
make: execvp: /bin/bash: Argument list too long
make: *** [common.mk:761: all] Error 127
ARG_MAX
検索してみると、新しいコンピュータでも同じようです。
>getconf ARG_MAX
4611686018427387903
古いコンピュータで
>getconf ARG_MAX
2097152
どちらのコンピュータも同じオペレーティングシステム(Windows 10)を実行し、どちらも64ビットです。
ARG_MAX
新しいコンピュータで修正する必要がありますか?上記の値は新しいコンピュータでは奇妙に見えます。
ちなみに、新しいコンピュータでは、Ubuntuは次のように言います。
>xargs --show-limits
Your environment variables take up 2463 bytes
POSIX upper limit on argument length (this system): 4611686018427383392
POSIX smallest allowable upper limit on argument length (all systems): 4096
Maximum length of command we could actually use: 4611686018427380929
Size of command buffer we are actually using: 131072
Maximum parallelism (--max-procs must be no greater): 2147483647
今失敗するMakefileのコマンドは次のとおりです。
DIRS = $(wildcard */.)
どこに着くの?フォルダ一覧現在のディレクトリにあります。私も試しました
DIRS = ${shell find . -type d -print}
同じエラーです。
8727
名前が非常に長いフォルダがあります。古いコンピュータのフォルダ数はまったく同じで、何も変更されませんでした。 Ubuntu 20.04のシェルではこれが大きすぎるようです。
make
新しいPCのバージョンはGNU make 4.2.1で、既存のPCのバージョンはGNU make 4.1です。新しいPCのBashバージョンはGNU bash 5.0.16で、既存のPCのBashバージョンは4.4.20です。
Windows 10 WSL2のUbuntu 20.04で同じMakefileが失敗するのはなぜですか?ARG_MAX
特定の構成設定を使用して値を変更できますか?それともDIRS = $(wildcard */.)
最初からこの問題を回避するために他のものを変更する方法はありますか?
ちなみに非常に似た質問がありますmakefileパラメーターのリストが長すぎますが、特定の構成にのみ適用されます。 私と設定が全く同じですね。しかし、ここでの質問は、同じメイクファイルがUbuntu 18のWSL2では機能しますが、Ubuntu 20の最新のWSL2では機能しないのはなぜですか?すべて同じオペレーティングシステム(Windows 10 Pro)で実行されます。
それでは、Windows 10にVirtual Boxをインストールし、そこに最新のUbuntuをインストールして同じエラーが発生するかどうかを確認します。そうでない場合、MicrosoftはWSL用のLinux Ubuntuをどのように構築する必要がありますか?
修正する
解決策が見つかりました。この長いパラメータ処理を避けるために、Makefileを書き直しました。これで、処理するディレクトリ名の長いリストを渡すのではなく(私は再帰的なmakeを使用します)、ループで1つずつ処理します。これはうまくいきます。
しかし、奇妙なことに、最新のWSL2 Ubuntuでは失敗しますが、古いWSL2 Ubuntuでは失敗します。私はこのMakefileを長年使用してきましたが、一度も問題はありませんでした。
これですべての準備が完了しました。ただし、これはMicrosoftがUbuntu 20.04用のLinuxカーネルを構築した方法に問題がある可能性があります。わかりません。しかし、ARG_MAX
ソースからLinux自体を再コンパイルする以外に、これを変更する方法はないようです。
答え1
これはmake
より長い引数を処理するためにパッチされました。パッチファイルの表示make-dfsg_4.1-9.1ubuntu1.diff.gz存在するhttps://packages.ubuntu.com/en/source/bionic/make-dfsg:
+ if (unixy_shell && line_len > MAX_ARG_STRLEN)
+ {
+ unsigned j;
+ memcpy (ap, eval_line, sizeof (eval_line) - 1);
+ ap += sizeof (eval_line) - 1;
+ for (j = 1; j <= 2 * line_len / (MAX_ARG_STRLEN - 2); j++)
+ ap += sprintf (ap, "\\$\\{%u\\}", j);
+ *ap++ = '\\';
+ *ap++ = '"';
+ *ap++ = ' ';
+ /* Copy only the first word of SHELL to $0. */
+ for (p = shell; *p != '\0'; ++p)
+ {
+ if (isspace ((unsigned char)*p))
+ break;
+ *ap++ = *p;
+ }
+ *ap++ = ' ';
+ }
Ubuntu 20では、make
v4.2.1にアップグレードした後、このパッチを使用できなくなります。長い引数を避けるには、Makefileを最適化する必要があります。