7,8年ぶりにWindowsも使い始めました。ビルド環境として必要なのです。GraalVMのネイティブイメージ部分であるSubstrateVMをLinuxだけでなくWindowsでもビルドして確かめたいことがあり、WindowsのC++環境構築に習熟していないので悪戦苦闘しました!
基本的には、GitHubからGraalVMとMXをクローンして、mx build
するだけなのですが… WindowsのGitやコマンドを揃えるのに、今回はSourceTreeを使いました。
Windowsなので、mxが使うPythonから入れました。公式サイトからダウンロードします。
mxがPython 2.7のようだったので、2.7にしました。
$ python --version Python 2.7.18
PATHを通してmx build
すると、まだ当然うまくいきません。
export PATH=/c/Users/hoge/dev/Python27/:/c/Users/hoge/dev/Python27/Scripts/:$JAVA_HOME/bin/:/c/Users/hoge/code/mx/:$PATH
C++環境がないからです。Visual Studioが必要なのかなと思っていたのですが、Microsoft C++ Build Toolsでいいようで、実際うまくいきました。いやー生まれて初めてWindowsにC++環境を構築するので、まったく知らないことばかりでした。
次から次へと出るエラーメッセージを読みながら、PATHを設定しました。
export PATH=/c/Users/hoge/dev/Python27/:/c/Users/hoge/dev/Python27/Scripts/:$JAVA_HOME/bin/:/c/Users/hoge/code/mx/:"/c/Program Files (x86)/Microsoft Visual Studio/2019/BuildTools/MSBuild/Current/Bin/amd64/":/c/Program\ Files\ \(x86\)/Microsoft\ Visual\ Studio/2019/BuildTools/VC/Tools/MSVC/14.26.28801/bin/Hostx64/x64/:$PATH
さらに、環境変数INCLUDEが必要とわかりました。同様に、次から次へと出るエラーメッセージに1つ1つ対処して、設定しました。
export INCLUDE="/c/Program Files (x86)/Windows Kits/10/Include/10.0.18362.0/ucrt":"/c/Program Files (x86)/Windows Kits/10/Include/10.0.18362.0/um":"/c/Program Files (x86)/Windows Kits/10/Include/10.0.18362.0/shared":"/c/Program Files (x86)/Windows Kits/10/Include/10.0.18362.0/ucrt":"/c/Program Files (x86)/Microsoft Visual Studio/2019/BuildTools/VC/Tools/MSVC/14.26.28801/Include"
さらにさらに、環境変数LIBも必要とわかりました。同様に、次か(r
export LIB="/c/Program Files (x86)/Microsoft Visual Studio/2019/BuildTools/VC/Tools/MSVC/14.26.28801/lib/x64":"/c/Program Files (x86)/Windows Kits/10/Lib/10.0.18362.0/um/x64":"/c/Program Files (x86)/Windows Kits/10/Lib/10.0.18362.0/ucrt/x64"
これでC++環境は(SubstrateVMビルドに必要な分は)整ったようなのですが、今度はJDKに関するエラーメッセージが出ました。
Compiling com.oracle.svm.core.genscavenge with javac-daemon(JDK 11)... [dependency GRAAL_PROCESSOR updated] JvmFuncsFallbacksBuildTask svm-jvmfuncs-fallback-builder... [C:\Users\hoge\code\graal\substratevm\src\com.oracle.svm.native.jvm.windows\src\src_gen\JvmFuncsFallbacks.c does not exist] Could not find any unresolved JVM_* symbols in static JDK libraries
「unresolved JVM_* symbols in static JDK libraries」で検索していると、このissueがヒントになりました。
通常のJDKではビルドできないということです。SubstrateVMのビルドドキュメントをよく見ると、Quick startの最初、Prerequisitesの前にこう書いてありました。
point the JAVA_HOME variable to a JDK that supports a compatible version of the JVM Compiler Interface (JVMCI)
以下からLABSのJDKをダウンロードしてJAVA_HOMEに設定します。Prerequisitesの前にあるからなかなか気づかなかった…
これでエラーなくビルドできました。
$ mx build $ ../sdk/mxbuild/windows-amd64/GRAALVM_132C5E3B79_JAVA11/graalvm-132c5e3b79-java11-20.2.0-dev/bin/java -version openjdk version "11.0.7" 2020-04-14 OpenJDK Runtime Environment GraalVM 20.2.0-dev (fastdebug build 11.0.7+10-jvmci-20.1-b02) OpenJDK 64-Bit Server VM GraalVM 20.2.0-dev (fastdebug build 11.0.7+10-jvmci-20.1-b02, mixed mode, sharing) $ ls -la ../sdk/mxbuild/windows-amd64/GRAALVM_132C5E3B79_JAVA11/graalvm-132c5e3b79-java11-20.2.0-dev/bin/native-image* -rw-r--r-- 1 jyukutyo 197609 397 6月 16 08:10 ../sdk/mxbuild/windows-amd64/GRAALVM_132C5E3B79_JAVA11/graalvm-132c5e3b79-java11-20.2.0-dev/bin/native-image.cmd -rw-r--r-- 1 jyukutyo 197609 407 6月 16 08:10 ../sdk/mxbuild/windows-amd64/GRAALVM_132C5E3B79_JAVA11/graalvm-132c5e3b79-java11-20.2.0-dev/bin/native-image-configure.cmd