WSLでriscv-gnu-toolchainを入れた時のエラー対処備忘録

# なにしてエラーおきたん
WSL(Windows Subsystem for Linux)を利用して、windows上でriscv-gnu-toolchainを導入しようとしてた。ちなみにバージョンは2で、windows11。
最初に参考にしたのは以下の記事。

https://qiita.com/Kosuke_Matsui/items/14aadce506fe3df79600

これのriscv-gnu-toolchainのところです。

手順としては普通にgit cloneでtoolchainを入れる。
次に依存パッケージを入れる。
そして次にビルドするだけ。
ビルドする場所はriscv-gnu-toolchainのディレクトリ内部でやってた。
# なんのエラーがおきたん
エラーが起きたのはmakeのタイミング。
~~~
configure: error: cannot find sources (move-if-change) in .././gcc
make: *** [Makefile:431: stamps/build-gcc-linux-stage1] Error 1
~~~
ふむふむ、わからん。
riscv-gnu-toolchainのディレクトリ内部にはgccディレクトリがあるため、とりあえず参照しているgccの場所が悪いと思い、srcの位置を変えたコマンドを打ってみた。
~~~
./configure --prefix=/opt/riscv --with-arch=rv32gc --with-abi=ilp32d --src=./gcc
~~~
これでmakeしたときに起きたエラーがこれ。
~~~
error: pathspec '/mnt/c/Users/(user名)/tc/riscv-gnu-toolchain/./gcc/gcc/' did not match any file(s) known to git
make: *** [Makefile:323: /mnt/c/Users/(user名)/tc/riscv-gnu-toolchain/./gcc/gcc/.git] Error 1
~~~
よくわからんけど、このgccがどうやらgitに認識されていないらしい。
ちなみに参照している場所自体は間違っていないはず？なので、理由はわからなかった。
ここで手詰まって、数時間無駄にしたのが今日の私。
# どうしたらエラーなくなったのか。

とりあえず手詰まって巨人になったので、一回クリーンに全部消してみた。
次に参考にしたのがこの記事。

https://74th.hateblo.jp/entry/2023/03/12/092600

元々RV32EC用のアセンブラを入れたくて調べた時に出た記事。
最初に参考にした記事と違うのは、riscv-gnu-toolchainディレクトリの中にbuildディレクトリを別で作っているところ。
だから参照してるところが「.././gcc」で問題無いんだなぁって納得しました。

それと結局関係があったかわからないけど、もう一度git cloneをする時にワーニングが出ていた。
~~~
warning: the following paths have collided (e.g. case-sensitive paths
on a case-insensitive filesystem) and only one from the same
colliding group is in the working tree:
  'linux-headers/include/linux/netfilter/xt_CONNMARK.h'
  'linux-headers/include/linux/netfilter/xt_connmark.h'
  'linux-headers/include/linux/netfilter/xt_DSCP.h'
  'linux-headers/include/linux/netfilter/xt_dscp.h'
  'linux-headers/include/linux/netfilter/xt_MARK.h'
  'linux-headers/include/linux/netfilter/xt_mark.h'
  'linux-headers/include/linux/netfilter/xt_RATEEST.h'
  'linux-headers/include/linux/netfilter/xt_rateest.h'
  'linux-headers/include/linux/netfilter/xt_TCPMSS.h'
  'linux-headers/include/linux/netfilter/xt_tcpmss.h'
  'linux-headers/include/linux/netfilter_ipv4/ipt_ECN.h'
  'linux-headers/include/linux/netfilter_ipv4/ipt_ecn.h'
  'linux-headers/include/linux/netfilter_ipv4/ipt_TTL.h'
  'linux-headers/include/linux/netfilter_ipv4/ipt_ttl.h'
  'linux-headers/include/linux/netfilter_ipv6/ip6t_HL.h'
  'linux-headers/include/linux/netfilter_ipv6/ip6t_hl.h'
~~~
これはWSLでインストールする際に、windowsはフォルダの大文字と小文字の区別をつけないことが原因で起きるエラーらしい。
通常問題ないらしいけど、念には念を入れて潰しておいた。
やり方の参考はこちら。

https://learn.microsoft.com/ja-jp/windows/wsl/case-sensitivity

~~~
fsutil.exe file setCaseSensitiveInfo <ディレクトリのパス> enable
~~~
パスは、ツールチェーンを入れるディレクトリへのパスを入れます。
自分だったら「C:\Users\ (ユーザー名) \ (ディレクトリ名)」みたいな感じでした。
これで、このディレクトリ以下のファイルが大文字と小文字区別つけられるようになります。
ここの名前重複問題については、gitの方にも書いてました。

https://github.com/riscv-collab/riscv-gnu-toolchain

 __If building a linux toolchain on a MacOS system, or on a Windows system using the Linux subsystem or cygwin, you must ensure that the filesystem is case-sensitive. A build on a case-insensitive filesystem will fail when building glibc because *.os and *.oS files will clobber each other during the build eventually resulting in confusing link errors.__

ディレクトリの設定を変更したら、一度ツールチェーン消してもう一度git clone。
ワーニング無し！makeもしっかりすすんだ！
# まとめ

・とりあえず一旦全部消してみてもう一度入れてみる。
・ツールチェーンディレクトリの中にビルドディレクトリを作ってビルド。
・ウィンドウズで大文字小文字の区別をつけられるように設定変更。
この３つのどれが効いたのかはわかりませんが、問題なくmakeしてくれました。

# 今回の学び
しばらく詰まったら一旦最初からやり直してみる。
ひとつの記事だけでなく、他の記事も探して試してみる。
小手先の変更で対応するのも時には大事かもしれないけど、結果的には遠回りこそ一番の近道なのかもね。
この怒りと反省をぶつけるために初めてQiita書いたけど、こういうの記録しておくのは大事かもね。

# 追記
・makeするときはsudoを忘れずに。
・めっちゃmakeとか遅いなって思ってたし多分普通に遅いと思うんだけど、cdでlinux用のhomeに移動してからディレクトリ作ったほうがいいのかもしれない。
VSCodeで使う際に下記のurlとともに注意が出てきたけど、パフォーマンスが圧倒的に違うらしい。
もしかしたら名前問題もhome以下なら問題なかったのかもしれない。
・実際にやってみて全くパフォーマンスが違ったし、名前問題も起きませんでした！！！まじか・・・

https://learn.microsoft.com/ja-jp/windows/wsl/setup/environment#file-storage