WindowsでGraalVMを動かす。

Quarkus を触ってみようと思ってGet StartedをやってたらGraalVMが出てきたので実行してみました。 思ったよりも簡単にできましたが、Visual Studioの方でちょっとはまりどころがあったのでメモとして。

とりあえず、QuarkusのGet Startedのページについては終わった状態とします。 PowerShellが出てくるけど、特段何も困ることはありませんでした。

quarkus.io

GraalVMをインストールする。

基本的には以下のページの通りです。

quarkus.io

簡単に抜粋すると

①本家サイトからバイナリをダウンロード&解凍

www.graalvm.org

環境変数を追加

set GRAALVM_HOME=解凍した先のフォルダ
set JAVA_HOME=${GRAALVM_HOME}
set PATH=${GRAALVM_HOME}/bin;%PATH%

の2工程で終わりです。

Visual Studio 2022のインストール

Community Edition で大丈夫です。

visualstudio.microsoft.com

C++コンパイラが必要なので、C++によるデスクトップ開発を選択してインストールします。

f:id:megascus:20211208142940p:plain

GraalVMを実行する

Quarksのドキュメントだと

./mvnw package -Pnative

でビルドできるとなっていますが、Visual Studioを使用してコンパイルする場合は特殊な環境変数が必要になるので、それらが設定されたコマンドプロンプトを使用する必要があります。 スタートメニューから環境にあったコマンドプロンプトを指定して実行してください。

f:id:megascus:20211208143346p:plain

これで大丈夫なはずです。

必要に応じて、

gu install native-image

も実行してあげてください。(必要な場合はエラーメッセージに表示されてるはず)

成功したら targetの下に実行バイナリが出来ているはず。

ちなみに、環境変数が足りないと以下のようなエラーになります。スタートメニューから環境にあったコマンドプロンプトを指定して実行してください。

Error: Default native-compiler executable 'cl.exe' not found via environment variable PATH
Error: To prevent native-toolchain checking provide command-line option -H:-CheckToolchain
com.oracle.svm.core.util.UserError$UserException: Default native-compiler executable 'cl.exe' not found via environment variable PATH
To prevent native-toolchain checking provide command-line option -H:-CheckToolchain
        at com.oracle.svm.core.util.UserError.abort(UserError.java:144)
        at com.oracle.svm.hosted.c.codegen.CCompilerInvoker.addSkipCheckingInfo(CCompilerInvoker.java:104)
        at com.oracle.svm.hosted.c.codegen.CCompilerInvoker.<init>(CCompilerInvoker.java:72)
        at com.oracle.svm.hosted.c.codegen.CCompilerInvoker$WindowsCCompilerInvoker.<init>(CCompilerInvoker.java:110)
        at com.oracle.svm.hosted.c.codegen.CCompilerInvoker.create(CCompilerInvoker.java:84)
        at com.oracle.svm.hosted.NativeImageGenerator.setupNativeImage(NativeImageGenerator.java:864)
        at com.oracle.svm.hosted.NativeImageGenerator.doRun(NativeImageGenerator.java:527)
        at com.oracle.svm.hosted.NativeImageGenerator.run(NativeImageGenerator.java:488)
        at com.oracle.svm.hosted.NativeImageGeneratorRunner.buildImage(NativeImageGeneratorRunner.java:403)
        at com.oracle.svm.hosted.NativeImageGeneratorRunner.build(NativeImageGeneratorRunner.java:569)
        at com.oracle.svm.hosted.NativeImageGeneratorRunner.main(NativeImageGeneratorRunner.java:122)
        at com.oracle.svm.hosted.NativeImageGeneratorRunner$JDK9Plus.main(NativeImageGeneratorRunner.java:599)

cl.exeが見つからないといって、適当にPATHを追加すると以下のようなエラーになります。スタートメニューから環境にあったコマンドプロンプトを指定して実行してください。

Error: Error compiling query code (in C:\Users\ユーザー名\AppData\Local\Temp\SVM-15902845214491549260\JNIHeaderDirectives.c). Compiler command ''C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.30.30705\bin\Hostx64\x64\cl.exe' /WX /W4 /wd4244 /wd4245 /wd4800 /wd4804 /wd4214 '-IC:\apps\graalvm-ce-java11-21.3.0\include\win32' '/FeC:\Users\ユーザー名\AppData\Local\Temp\SVM-15902845214491549260\JNIHeaderDirectives.exe' 'C:\Users\ユーザー名\AppData\Local\Temp\SVM-15902845214491549260\JNIHeaderDirectives.c'' output included error: [JNIHeaderDirectives.c, C:\Users\ユーザー名\AppData\Local\Temp\SVM-15902845214491549260\JNIHeaderDirectives.c(1): fatal error C1083: include ?t?@?C?????J???????B'stdio.h':No such file or directory]
com.oracle.svm.core.util.UserError$UserException: Error compiling query code (in C:\Users\ユーザー名\AppData\Local\Temp\SVM-15902845214491549260\JNIHeaderDirectives.c). Compiler command ''C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.30.30705\bin\Hostx64\x64\cl.exe' /WX /W4 /wd4244 /wd4245 /wd4800 /wd4804 /wd4214 '-IC:\apps\graalvm-ce-java11-21.3.0\include\win32' '/FeC:\Users\ユーザー名\AppData\Local\Temp\SVM-15902845214491549260\JNIHeaderDirectives.exe' 'C:\Users\ユーザー名\AppData\Local\Temp\SVM-15902845214491549260\JNIHeaderDirectives.c'' output included error: [JNIHeaderDirectives.c, C:\Users\ユーザー名\AppData\Local\Temp\SVM-15902845214491549260\JNIHeaderDirectives.c(1): fatal error C1083: include ?t?@?C?????J???????B'stdio.h':No such file or directory]
        at com.oracle.svm.core.util.UserError.abort(UserError.java:144)
        at com.oracle.svm.hosted.c.NativeLibraries.reportErrors(NativeLibraries.java:370)
        at com.oracle.svm.hosted.NativeImageGenerator.processNativeLibraryImports(NativeImageGenerator.java:1571)
        at com.oracle.svm.hosted.NativeImageGenerator.setupNativeLibraries(NativeImageGenerator.java:1046)
        at com.oracle.svm.hosted.NativeImageGenerator.setupNativeImage(NativeImageGenerator.java:869)
        at com.oracle.svm.hosted.NativeImageGenerator.doRun(NativeImageGenerator.java:527)
        at com.oracle.svm.hosted.NativeImageGenerator.run(NativeImageGenerator.java:488)
        at com.oracle.svm.hosted.NativeImageGeneratorRunner.buildImage(NativeImageGeneratorRunner.java:403)
        at com.oracle.svm.hosted.NativeImageGeneratorRunner.build(NativeImageGeneratorRunner.java:569)
        at com.oracle.svm.hosted.NativeImageGeneratorRunner.main(NativeImageGeneratorRunner.java:122)
        at com.oracle.svm.hosted.NativeImageGeneratorRunner$JDK9Plus.main(NativeImageGeneratorRunner.java:599)