Files
IMR6/libraries/windows/graalvm/lib/svm/bin/native-image-configure.cmd
T

237 lines
9.3 KiB
Batchfile

::
:: ----------------------------------------------------------------------------------------------------
::
:: Copyright (c) 2019, 2026, Oracle and/or its affiliates. All rights reserved.
:: DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
::
:: This code is free software; you can redistribute it and/or modify it
:: under the terms of the GNU General Public License version 2 only, as
:: published by the Free Software Foundation. Oracle designates this
:: particular file as subject to the "Classpath" exception as provided
:: by Oracle in the LICENSE file that accompanied this code.
::
:: This code is distributed in the hope that it will be useful, but WITHOUT
:: ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
:: FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
:: version 2 for more details (a copy is included in the LICENSE file that
:: accompanied this code).
::
:: You should have received a copy of the GNU General Public License version
:: 2 along with this work; if not, write to the Free Software Foundation,
:: Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
::
:: Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
:: or visit www.oracle.com if you need additional information or have any
:: questions.
::
:: ----------------------------------------------------------------------------------------------------
@echo off
:: Please read file `windows.md` before making changes.
setlocal enabledelayedexpansion
call :getScriptLocation location
call :getExecutableName executablename
for /f "delims=" %%i in ("%executablename%") do set "basename=%%~ni"
set "relcp=..\..\graalvm\svm-enterprise-configure.jar;..\builder\espresso-svm.jar;..\builder\native-image-base.jar;..\builder\objectfile.jar;..\builder\pointsto.jar;..\builder\reporter.jar;..\builder\svm-capnproto-runtime.jar;..\builder\svm-configure.jar;..\builder\svm-enterprise.jar;..\builder\svm.jar"
set "absolute_cp="
set newline=^
:: The two white lines above this comment are significant.
:: Split on semicolon by replacing it by newlines.
for /f "delims=" %%i in ("%relcp:;=!newline!%") do (
if "!absolute_cp!"=="" (
set "absolute_cp=%location%%%i"
) else (
set "absolute_cp=!absolute_cp!;%location%%%i"
)
)
set "jvm_args=-Dorg.graalvm.launcher.shell=true "-Dorg.graalvm.launcher.executablename=%executablename%""
set "launcher_args="
:: Check option-holding variables.
:: Those can be specified as the `option_vars` argument of the LauncherConfig constructor.
for %%v in () do (
if "!%%v:~0,5!"=="--vm.*" (
call :escape_args !%%v!
for %%o in (!args!) do (
call :unescape_arg %%o
call :process_arg !arg!
if errorlevel 1 exit /b 1
)
)
)
call :escape_args %*
for %%a in (%args%) do (
call :unescape_arg %%a
call :process_arg !arg!
if errorlevel 1 exit /b 1
)
set "module_launcher=True"
:: The list of --add-exports can easily exceed the 8191 command
:: line character limit so pass them in a command line arguments file.
if "%module_launcher%"=="True" (
set "main_class=--module org.graalvm.nativeimage.enterprise.configure/com.oracle.svm.enterprise.configure.ConfigurationEnterpriseTool"
set "app_path_arg=--module-path"
set exports_file="%location%!basename!.export-list"
set "jvm_args=!jvm_args! @!exports_file!"
) else (
set "main_class=com.oracle.svm.enterprise.configure.ConfigurationEnterpriseTool"
set "app_path_arg=-cp"
)
if "%VERBOSE_GRAALVM_LAUNCHERS%"=="true" echo on
"%location%..\..\..\bin\java" "--add-exports=jdk.graal.compiler/jdk.graal.compiler.phases.common=ALL-UNNAMED" "--add-exports=jdk.internal.vm.ci/jdk.vm.ci.meta=ALL-UNNAMED" "--add-exports=jdk.internal.vm.ci/jdk.vm.ci.services=ALL-UNNAMED" "--add-exports=jdk.graal.compiler/jdk.graal.compiler.core.common.util=ALL-UNNAMED" -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI %jvm_args% %app_path_arg% "%absolute_cp%" %main_class% %launcher_args%
exit /b %errorlevel%
:: Function are defined via labels, so have to be defined at the end of the file and skipped
:: in order not to be executed.
:escape_args
set "args=%*"
:: Without early exit on empty contents, substitutions fail.
if "!args!"=="" exit /b 0
set "args=%args:,=##GR_ESC_COMMA##%"
set "args=%args:;=##GR_ESC_SEMI##%"
:: Temporarily, so that args are split on '=' only.
set "args=%args: =##GR_ESC_SPACE##%"
:: Temporarily, otherwise we won't split on '=' inside quotes.
set "args=%args:"=##GR_ESC_QUOTE##%"
:: We can't replace equal using the variable substitution syntax.
call :replace_equals %args%
set "args=%args:##GR_ESC_SPACE##= %"
set "args=%args:##GR_ESC_QUOTE##="%"
exit /b 0
:replace_equals
setlocal
:: The argument passed to this function was split on =, because all other
:: delimiters were replaced in escape_args.
set "arg=%1"
if "!arg!"=="" goto :end_replace_equals
set "args=%1"
shift
:loop_replace_equals
set "arg=%1"
if "!arg!"=="" goto :end_replace_equals
set "args=%args%##GR_ESC_EQUAL##%arg%"
shift
goto :loop_replace_equals
:end_replace_equals
endlocal & ( set "args=%args%" )
exit /b 0
:unescape_arg
set "arg=%*"
set "arg=%arg:##GR_ESC_COMMA##=,%"
set "arg=%arg:##GR_ESC_SEMI##=;%"
set "arg=%arg:##GR_ESC_EQUAL##==%"
exit /b 0
:is_quoted
setlocal
set "args=%*"
set /a argslen=0
for %%a in (%args%) do set /a argslen+=1
if %argslen% gtr 1 (
set "quoted=false"
) else (
if "!args:~0,1!!args:~-1!"=="""" ( set "quoted=true" ) else ( set "quoted=false" )
)
endlocal & ( set "quoted=%quoted%" )
exit /b 0
:unquote_arg
:: Sets %arg% to a version of the argument with outer quotes stripped, if present.
call :is_quoted %*
setlocal
set "maybe_quoted=%*"
if %quoted%==true ( set "arg=%~1" ) else ( set "arg=!maybe_quoted!" )
endlocal & ( set "arg=%arg%" )
exit /b 0
:: Unfortunately, parsing of `--vm.*` arguments has to be done blind:
:: Maybe some of those arguments where not really intended for the launcher but were application
:: arguments.
:process_vm_arg
if %arg_quoted%==false (
call :is_quoted %*
set "arg_quoted=%quoted%"
)
call :unquote_arg %*
set "vm_arg=%arg%"
set "custom_cp="
if "!vm_arg!"=="cp" (
set "part1='--%prefix%.cp' argument must be of the form"
set "part2='--%prefix%.cp=..\..\graalvm\svm-enterprise-configure.jar;..\builder\espresso-svm.jar;..\builder\native-image-base.jar;..\builder\objectfile.jar;..\builder\pointsto.jar;..\builder\reporter.jar;..\builder\svm-capnproto-runtime.jar;..\builder\svm-configure.jar;..\builder\svm-enterprise.jar;..\builder\svm.jar', not two separate arguments."
>&2 echo !part1! !part2!
exit /b 1
) else if "!vm_arg!"=="classpath" (
set "part1='--%prefix%.classpath' argument must be of the form"
set "part2='--%prefix%.classpath=..\..\graalvm\svm-enterprise-configure.jar;..\builder\espresso-svm.jar;..\builder\native-image-base.jar;..\builder\objectfile.jar;..\builder\pointsto.jar;..\builder\reporter.jar;..\builder\svm-capnproto-runtime.jar;..\builder\svm-configure.jar;..\builder\svm-enterprise.jar;..\builder\svm.jar', not two separate arguments."
>&2 echo !part1! !part2!
exit /b 1
) else if "!vm_arg:~0,3!"=="cp=" (
call :unquote_arg %vm_arg:~3%
set "absolute_cp=%absolute_cp%;!arg!"
) else if "!vm_arg:~0,10!"=="classpath=" (
call :unquote_arg %vm_arg:~10%
set "absolute_cp=%absolute_cp%;!arg!"
) else if "!vm_arg:~0,1!"=="@" (
if %arg_quoted%==true ( set "arg="%vm_arg%"" ) else ( set "arg=%vm_arg%" )
set "jvm_args=%jvm_args% !arg!"
) else (
if %arg_quoted%==true ( set "arg="-%vm_arg%"" ) else ( set "arg=-%vm_arg%" )
set "jvm_args=%jvm_args% !arg!"
)
exit /b 0
:process_arg
set "original_arg=%*"
call :unquote_arg !original_arg!
set "arg_quoted=%quoted%"
if "!arg:~0,5!"=="--vm." (
set prefix=vm
call :unquote_arg !arg:~5!
call :process_vm_arg !arg!
if errorlevel 1 exit /b 1
) else (
if "!arg!"=="--native" (
>&2 echo The native version of %basename% does not exist: cannot use '!arg!'.
set "extra="
if "!basename!"=="polyglot" set "extra= --language:all"
set "part1=If native-image is installed, you may build it with"
set "part2='native-image --macro:native-image-configure-launcher!extra!'."
>&2 echo !part1! !part2!
exit /b 1
) else (
:: Use !original_arg! instead of !arg! to preserve surrounding quotes if present.
set "launcher_args=%launcher_args% !original_arg!"
)
)
exit /b 0
:: If this script is in `%PATH%` and called quoted without a full path (e.g., `"js"`), `%~dp0` is expanded to `cwd`
:: rather than the path to the script.
:: This does not happen if `%~dp0` is accessed in a subroutine.
:getScriptLocation variableName
set "%~1=%~dp0"
exit /b 0
:getExecutableName variableName
set "%~1=%~f0"
exit /b 0
endlocal