Fight the Future

Java言語とJVM、そしてJavaエコシステム全般にまつわること

WindowsでSubstrateVMをビルドする

7,8年ぶりにWindowsも使い始めました。ビルド環境として必要なのです。GraalVMのネイティブイメージ部分であるSubstrateVMをLinuxだけでなくWindowsでもビルドして確かめたいことがあり、WindowsのC++環境構築に習熟していないので悪戦苦闘しました!

基本的には、GitHubからGraalVMとMXをクローンして、mx buildするだけなのですが… WindowsのGitやコマンドを揃えるのに、今回はSourceTreeを使いました。

www.sourcetreeapp.com

Windowsなので、mxが使うPythonから入れました。公式サイトからダウンロードします。

www.python.org

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++環境を構築するので、まったく知らないことばかりでした。

visualstudio.microsoft.com

次から次へと出るエラーメッセージを読みながら、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がヒントになりました。

bugs.openjdk.java.net

通常の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の前にあるからなかなか気づかなかった…

github.com

これでエラーなくビルドできました。

$ 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