前置き
Windows 10でWSLを有効時、Quartus PrimeのDDR3 Memory Controller IP生成でエラーになって、IPの生成ができない現象に遭遇した。
ひとまずはWSLを無効にすれば正常に生成できるが、気になったので調査してみた。
エラー内容
Quartus Primeのバージョン16.1のエラー表示(17.1でも同様)。
Error: Error during execution of "{C:/intelfpga/16.1/quartus//../nios2eds/Nios II Command Shell.bat} make all 2>> stderr.txt": child process exited abnormally Error: Execution of command "{C:/intelfpga/16.1/quartus//../nios2eds/Nios II Command Shell.bat} make all 2>> stderr.txt" failed
Quartusで自動生成されたMakefileの下記部分でエラーになっている。
D:/intelfpga/17.1/quartus//../nios2eds/sdk2/bin/nios2-bsp hal sequencer_bsp .. --default_sections_mapping sequencer_mem --use_bootloader DONT_CHANGE
調査内容
nios2-bsp
でエラーになるようだが、これの中身はシェルスクリプトであり、Quartus(Nios II)のmakeからシェルスクリプトを呼ぶとbash nios2-bsp
が実行される事がわかった。
このbash
は、WSLが有効な環境ではC:\Windows\System32\bash.exe
に展開されてしまうのでエラーになってしまう。本当はNIOS II Command Shellのbashを呼んでほしい。
対策
かなり無理矢理だが、自作のnios2-bsp.exe
をオリジナルのnios2-bsp
と同じフォルダに置くことで解決した。
nios2-bsp.exe
については、特に理由はないが今回はgolangで作ってみた。(shebang書き換えでスマートに対応できたかもしれない)
package main import ( "fmt" "os" "os/exec" ) func main() { cmd := exec.Command( os.Getenv("QUARTUS_ROOTDIR")+`\bin64\cygwin\bin\bash.exe`, append([]string{os.Getenv("SOPC_KIT_NIOS2") + "/sdk2/bin/nios2-bsp"}, os.Args[1:]...)..., ) cmd.Stdin = os.Stdin cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr if err := cmd.Run(); err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } }