# HG changeset patch # User Jiri Vanek # Date 1549973444 -3600 # Node ID a9608af1d93fc7a166131bb186f96a9bbf126b6c # Parent 889bb8e09dda333e1a77e9d85578097de8c72d5e Rewritten bat launcher and introduced file to keep modular JDK swithces * .Makefile: introduced MODULARJDK_ARGS_FILE=itw-modularjdk.args; built to launcher-build, handled as separate file. MODULARJDK_ARGS_LOCATION is sedded into shell scripts. bat files are now cleaned to windows line-endings. * acinclude.m4: Introduced new switch to allow to set switch file target location * configure.ac: IT_CHECK_MODULARJDK_ARGS called; fixed few typos (mostly lunch->launch) * itw-modularjdk.args: new file, containing jisgsaw argument to allow ITW to run on jdk9 and up * shell-launcher/launchers.bat.in: rewritten from scratch; to be more like linux shell launcher * shell-launcher/launchers.sh.in: JAVA no longer sed. USed JRE/bin/java instead. Adapted for itw-modularjdk.args file; few additional cosmetic changes diff -r 889bb8e09dda -r a9608af1d93f ChangeLog --- a/ChangeLog Thu Feb 07 17:06:20 2019 +0100 +++ b/ChangeLog Tue Feb 12 13:10:44 2019 +0100 @@ -1,3 +1,16 @@ +2019-02-11 Laurent Bourgès + Jiri Vanek + + Rewritten bat launcher and introduced file to keep modular JDK swithces + * .Makefile: introduced MODULARJDK_ARGS_FILE=itw-modularjdk.args; built to launcher-build, handled as separate file. + MODULARJDK_ARGS_LOCATION is sedded into shell scripts. bat files are now cleaned to windows line-endings. + * acinclude.m4: Introduced new switch to allow to set switch file target location + * configure.ac: IT_CHECK_MODULARJDK_ARGS called; fixed few typos (mostly lunch->launch) + * itw-modularjdk.args: new file, containing jisgsaw argument to allow ITW to run on jdk9 and up + * shell-launcher/launchers.bat.in: rewritten from scratch; to be more like linux shell launcher + * shell-launcher/launchers.sh.in: JAVA no longer sed. USed JRE/bin/java instead. Adapted for itw-modularjdk.args file; + few additional cosmetic changes + 2019-02-07 Jiri Vanek Allowed cross-build of bat launchers on linux systems diff -r 889bb8e09dda -r a9608af1d93f Makefile.am --- a/Makefile.am Thu Feb 07 17:06:20 2019 +0100 +++ b/Makefile.am Tue Feb 12 13:10:44 2019 +0100 @@ -28,6 +28,9 @@ WIN_LAUNCHERS= endif + +MODULARJDK_ARGS_FILE=itw-modularjdk.args + if WINDOWS_OR_INCLUDE_BATS WIN_LAUNCHERS=launcher.build/$(javaws).bat launcher.build/$(itweb_settings).bat launcher.build/$(policyeditor).bat else @@ -35,28 +38,28 @@ endif if ENABLE_SHELL_LAUNCHERS - SHELL_LUNCHERS=$(WIN_LAUNCHERS) launcher.build/$(javaws).sh launcher.build/$(itweb_settings).sh launcher.build/$(policyeditor).sh + SHELL_LAUNCHERS=$(WIN_LAUNCHERS) launcher.build/$(MODULARJDK_ARGS_FILE) launcher.build/$(javaws).sh launcher.build/$(itweb_settings).sh launcher.build/$(policyeditor).sh else - SHELL_LUNCHERS= + SHELL_LAUNCHERS= endif if ENABLE_NATIVE_LAUNCHERS - NATIVE_LUNCHERS=launcher.build/$(javaws) launcher.build/$(itweb_settings) launcher.build/$(policyeditor) + NATIVE_LAUNCHERS=launcher.build/$(MODULARJDK_ARGS_FILE) launcher.build/$(javaws) launcher.build/$(itweb_settings) launcher.build/$(policyeditor) DESKTOP_SUFFIX= else - NATIVE_LUNCHERS= + NATIVE_LAUNCHERS= DESKTOP_SUFFIX=.sh endif # javaws is program name, JAVAWS is used executable name. in 99.9% those are equals. -# in unsupported case (no rust, and enforced shell lunchers), it will become javaws.sh. +# in unsupported case (no rust, and enforced shell launchers), it will become javaws.sh. # similar case is for other two binaries. JAVAWS=$(javaws)$(DESKTOP_SUFFIX) ITWEB_SETTINGS=$(itweb_settings)$(DESKTOP_SUFFIX) POLICYEDITOR=$(policyeditor)$(DESKTOP_SUFFIX) -LAUNCHERS=$(NATIVE_LUNCHERS) $(SHELL_LUNCHERS) +LAUNCHERS=$(NATIVE_LAUNCHERS) $(SHELL_LAUNCHERS) DESKTOP_FILES=javaws.desktop itweb-settings.desktop policyeditor.desktop DESKTOP_IN_FILES=javaws.desktop.in itweb-settings.desktop.in policyeditor.desktop.in @@ -169,8 +172,11 @@ PLUGIN_JAR=$(datadir)/$(PACKAGE_NAME)/plugin.jar JSOBJECT_JAR=$(datadir)/$(PACKAGE_NAME)/jsobject.jar endif - NETX_JAR=$(datadir)/$(PACKAGE_NAME)/javaws.jar - SPLASH_PNG=$(datadir)/$(PACKAGE_NAME)/javaws_splash.png + +NETX_JAR=$(datadir)/$(PACKAGE_NAME)/javaws.jar +SPLASH_PNG=$(datadir)/$(PACKAGE_NAME)/javaws_splash.png +MODULARJDK_ARGS_LOCATION=$(MODULARJDK_ARGS_DIR)/$(MODULARJDK_ARGS_FILE) + # Conditional defintions if HAVE_TAGSOUP @@ -302,7 +308,7 @@ export PLUGIN_VERSION = IcedTea-Web $(FULL_VERSION) -export EXTRA_DIST = $(top_srcdir)/netx $(top_srcdir)/plugin javaws.png $(DESKTOP_IN_FILES) $(top_srcdir)/completion \ +export EXTRA_DIST = $(MODULARJDK_ARGS_FILE) $(top_srcdir)/netx $(top_srcdir)/plugin javaws.png $(DESKTOP_IN_FILES) $(top_srcdir)/completion \ shell-launcher rust-launcher $(top_srcdir)/tests html-gen.sh NEW_LINE_IFS $(top_srcdir)/metadata.in $(top_srcdir)/win-installer # reproducers `D`shortcuts @@ -325,6 +331,14 @@ itweb_settings:= $(shell echo itweb-settings | sed '@program_transform_name@') policyeditor:= $(shell echo policyeditor | sed '@program_transform_name@') +if WINDOWS_OR_INCLUDE_BATS +# convert Unix newlines (LF) to DOS format: + fix_CRLF=-e "s/\$$/\r/" +else + fix_CRLF= +endif + + # the launcher needs to know $(bindir) and $(datadir) which can be different at # make-time from configure-time edit_launcher_script = sed \ @@ -340,7 +354,9 @@ -e "s|[@]MSLINKS_JAR[@]|$(MSLINKS_JAR)|g" \ -e "s|[@]TAGSOUP_JAR[@]|$(TAGSOUP_JAR)|g" \ -e "s|[@]RHINO_JAR[@]|$(RHINO_JAR)|g" \ - -e "s|[@]PROGRAM_NAME[@]|$${PROGRAM_NAME}|g" + -e "s|[@]PROGRAM_NAME[@]|$${PROGRAM_NAME}|g" \ + -e "s|[@]MODULARJDK_ARGS_LOCATION[@]|$(MODULARJDK_ARGS_LOCATION)|g" + # Top-Level Targets # ================= @@ -374,6 +390,8 @@ ${INSTALL_DATA} $(NETX_DIR)/lib/classes.jar $(DESTDIR)$(NETX_JAR) ${INSTALL_DATA} $(NETX_SRCDIR)/javaws_splash.png $(DESTDIR)$(SPLASH_PNG) ${INSTALL_DATA} $(TOP_SRC_DIR)/javaws.png $(ICONS_DEST_DIR)/ + mkdir -p $(MODULARJDK_ARGS_DIR) + ${INSTALL_PROGRAM} launcher.build/$(MODULARJDK_ARGS_FILE) $(MODULARJDK_ARGS_DIR)/$(MODULARJDK_ARGS) if ENABLE_NATIVE_LAUNCHERS ${INSTALL_PROGRAM} launcher.build/$(javaws) $(DESTDIR)$(bindir) ${INSTALL_PROGRAM} launcher.build/$(itweb_settings) $(DESTDIR)$(bindir) @@ -461,6 +479,7 @@ if ENABLE_DOCS cp -r $(DOCS_DIR)/html $(DESTDIR)$(prefix)/icedtea-web-docs endif + if [ ! -e $(DESTDIR)$(bindir)/$(MODULARJDK_ARGS_FILE) ] ; then cp $(MODULARJDK_ARGS_LOCATION) $(DESTDIR)$(bindir)/$(MODULARJDK_ARGS_FILE) ; fi (cd $(DESTDIR)$(prefix)/.. && $(ZIP) -qr $(TOP_BUILD_DIR)/$(distdir).linux.bin.zip `basename $(DESTDIR)$(prefix)` ); win-bin-dist: win-only-image @@ -470,6 +489,7 @@ # strips cygwin and other linux-like blobs. keeping only windows-usefull stuff win-only-image: install uninstall-linux-only remove-empty-linux-only-dirs rm -rf $(WIN_ALL_DEPS) + if [ ! -e $(DESTDIR)$(bindir)/$(MODULARJDK_ARGS_FILE) ] ; then cp $(MODULARJDK_ARGS_LOCATION) $(DESTDIR)$(bindir)/$(MODULARJDK_ARGS_FILE) ; fi if ENABLE_DOCS cp -r $(DOCS_DIR)/html $(DESTDIR)$(prefix)/icedtea-web-docs endif @@ -514,7 +534,7 @@ if ls -1qA $$dirCandidate | grep -q . ; then echo "$$dirCandidate not empty"; else rmdir -v $$dirCandidate ; fi ; # all generated manpages must be removed one by one -# shell (only shell!) lunchers must go away +# shell (only shell!) launchers must go away uninstall-linux-only: KNOWN_MANS="icedtea-web.1 icedtea-web-plugin.1 itweb-settings.1 javaws.1 policyeditor.1" ; \ KNOWN_DIRS="man1 de/man1 pl/man1 cs/man1" ; \ @@ -913,6 +933,12 @@ rm -f policyeditor.desktop +# launcher run args: +launcher.build/$(MODULARJDK_ARGS_FILE): $(srcdir)/$(MODULARJDK_ARGS_FILE) + mkdir -p launcher.build + cp $(srcdir)/$(MODULARJDK_ARGS_FILE) launcher.build/$(MODULARJDK_ARGS_FILE) + + if ENABLE_NATIVE_LAUNCHERS # todo, handling of suffixes # there is curently harecoded sh, so it can somehow basically work @@ -936,6 +962,7 @@ export JSOBJECT_JAR=$(JSOBJECT_JAR) ; \ export TAGSOUP_JAR=$(TAGSOUP_JAR) ; \ export RHINO_JAR=$(RHINO_JAR) ; \ + export MODULARJDK_ARGS_LOCATION=$(MODULARJDK_ARGS_LOCATION) ; \ unset MAIN_CLASS ; \ unset BIN_LOCATION ; \ unset PROGRAM_NAME ; \ @@ -1000,6 +1027,7 @@ export JSOBJECT_JAR=$(JSOBJECT_JAR) ; \ export TAGSOUP_JAR=$(TAGSOUP_JAR) ; \ export RHINO_JAR=$(RHINO_JAR) ; \ + export MODULARJDK_ARGS_LOCATION=$(MODULARJDK_ARGS_LOCATION) ; \ export MAIN_CLASS=net.sourceforge.jnlp.runtime.Boot ; \ export BIN_LOCATION=$(bindir)/none ; \ export PROGRAM_NAME=test ; \ @@ -1038,8 +1066,7 @@ MAIN_CLASS=net.sourceforge.jnlp.runtime.Boot ;\ BIN_LOCATION=$(bindir)/$(javaws) ;\ PROGRAM_NAME=$(javaws) ;\ - $(edit_launcher_script) < $< > $@ - + $(edit_launcher_script) $(fix_CRLF) < $< > $@ # TODO get rid of this copypaste launcher.build/$(itweb_settings).bat: shell-launcher/launchers.bat.in @@ -1047,7 +1074,7 @@ MAIN_CLASS=net.sourceforge.jnlp.controlpanel.CommandLine ;\ BIN_LOCATION=$(bindir)/$(itweb_settings) ;\ PROGRAM_NAME=$(itweb_settings) ;\ - $(edit_launcher_script) < $< > $@ + $(edit_launcher_script) $(fix_CRLF) < $< > $@ # TODO get rid of this copypaste launcher.build/$(policyeditor).bat: shell-launcher/launchers.bat.in @@ -1055,11 +1082,12 @@ MAIN_CLASS=net.sourceforge.jnlp.security.policyeditor.PolicyEditor ;\ BIN_LOCATION=$(bindir)/$(policyeditor) ;\ PROGRAM_NAME=$(policyeditor) ;\ - $(edit_launcher_script) < $< > $@ + $(edit_launcher_script) $(fix_CRLF) < $< > $@ endif endif clean-launchers: + rm -f launcher.build/$(MODULARJDK_ARGS_FILE) if ENABLE_NATIVE_LAUNCHERS rm -f launcher.build/$(javaws) rm -f launcher.build/$(itweb_settings) @@ -1070,12 +1098,12 @@ rm -f launcher.build/$(javaws).sh rm -f launcher.build/$(itweb_settings).sh rm -f launcher.build/$(policyeditor).sh -if WINDOWS +endif +if WINDOWS_OR_INCLUDE_BATS rm -f launcher.build/$(javaws).bat rm -f launcher.build/$(itweb_settings).bat rm -f launcher.build/$(policyeditor).bat endif -endif if [ -e launcher.build ] ; then \ rmdir launcher.build ; \ fi diff -r 889bb8e09dda -r a9608af1d93f acinclude.m4 --- a/acinclude.m4 Thu Feb 07 17:06:20 2019 +0100 +++ b/acinclude.m4 Tue Feb 12 13:10:44 2019 +0100 @@ -1184,3 +1184,18 @@ fi AC_SUBST([KCOV]) ]) + +AC_DEFUN([IT_CHECK_MODULARJDK_ARGS], +[ + AC_MSG_CHECKING([where to place file with modular switches]) + AC_ARG_WITH([modularjdk-file], + [AS_HELP_STRING(--with-modularjdk-file,directory where file with arguments for modualr jdk willbe installed)], + [ + MODULARJDK_ARGS_DIR="${withval}" + ], + [ + MODULARJDK_ARGS_DIR="${bindir}" + ]) + AC_MSG_RESULT([${MODULARJDK_ARGS_DIR}]) + AC_SUBST([MODULARJDK_ARGS_DIR]) +]) diff -r 889bb8e09dda -r a9608af1d93f configure.ac --- a/configure.ac Thu Feb 07 17:06:20 2019 +0100 +++ b/configure.ac Tue Feb 12 13:10:44 2019 +0100 @@ -39,6 +39,8 @@ AC_MSG_ERROR([/bin/bash is used in runtime and for about generation. Dying sooner rather then later]) fi +IT_CHECK_MODULARJDK_ARGS + AC_MSG_CHECKING([whether build legacy shell launchers]) AC_ARG_ENABLE([shell-launchers], [AS_HELP_STRING([--enable-shell-launchers], @@ -50,17 +52,17 @@ AC_PATH_PROG([RUSTC], [rustc],,) if test x"$RUSTC" = x ; then if test x${ENABLE_SHELL_LAUNCHERS} = xno ; then - AC_MSG_ERROR([rust is used to compile lunchers. No go]) + AC_MSG_ERROR([rust is used to compile launchers. No go]) else - echo "rust is used to compile lunchers, is missing but you have enable-shell-launchers as yes, continuing with UNAMAINTAINED shell launchers only" + echo "rust is used to compile launchers, is missing but you have enable-shell-launchers as yes, continuing with UNMAINTAINED shell launchers only" fi else AC_PATH_PROG([CARGO], [cargo],,) if test x"$CARGO" = x ; then if test x${ENABLE_SHELL_LAUNCHERS} = xno ; then - AC_MSG_ERROR([cargo is used to call rustc for lunchers. No go]) + AC_MSG_ERROR([cargo is used to call rustc for launchers. No go]) else - echo "cargo is used to manage lunchers sources, is missing but you have enable-shell-launchers as yes, continuing with UNAMAINTAINED shell launchers only" + echo "cargo is used to manage launchers sources, is missing but you have enable-shell-launchers as yes, continuing with UNMAINTAINED shell launchers only" fi fi fi @@ -86,7 +88,7 @@ AC_MSG_CHECKING([whether to include also bat lunchers during linux build]) AC_ARG_ENABLE([bats-on-linux], [AS_HELP_STRING([--enable-bats-on-linux], - [enable generation of windows legacy bat launchers during linux build with legacy shell launchers. This is for subjects, who wish to do an custom build for windows and linuxes/mac users togethrer. Preparation of rest of the ITW then require a bit of love. This switch is not exactly supported option.])], + [enable generation of windows legacy bat launchers during linux build with legacy shell launchers. This is for subjects, who wish to do an custom build for windows and linuxes/mac users together. Preparation of rest of the ITW then require a bit of love. This switch is not exactly supported option.])], [WINDOWS_OR_INCLUDE_BATS="${enableval}"], [WINDOWS_OR_INCLUDE_BATS='no']) AM_CONDITIONAL([WINDOWS_OR_INCLUDE_BATS], [test "x$WINDOWS_OR_INCLUDE_BATS" = "xyes" -o "$build_windows" = "yes" ]) AC_MSG_RESULT(${WINDOWS_OR_INCLUDE_BATS}) diff -r 889bb8e09dda -r a9608af1d93f itw-modularjdk.args --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/itw-modularjdk.args Tue Feb 12 13:10:44 2019 +0100 @@ -0,0 +1,27 @@ +# ------------------------------------- +# IcedTea-Web jigsaw run args (jdk9+) +# ------------------------------------- + +--add-reads=java.base=ALL-UNNAMED,java.desktop +--add-reads=java.desktop=ALL-UNNAMED,java.naming +--add-reads=java.naming=ALL-UNNAMED,java.desktop + +--add-exports=java.desktop/sun.awt=ALL-UNNAMED,java.desktop +--add-exports=java.desktop/javax.jnlp=ALL-UNNAMED,java.desktop + +--add-exports=java.base/com.sun.net.ssl.internal.ssl=ALL-UNNAMED,java.desktop +--add-exports=java.base/sun.net.www.protocol.jar=ALL-UNNAMED,java.desktop +--add-exports=java.base/sun.security.action=ALL-UNNAMED,java.desktop +--add-exports=java.base/sun.security.provider=ALL-UNNAMED,java.desktop +--add-exports=java.base/sun.security.util=ALL-UNNAMED,java.desktop +--add-exports=java.base/sun.security.validator=ALL-UNNAMED,java.desktop +--add-exports=java.base/sun.security.x509=ALL-UNNAMED,java.desktop +--add-exports=java.base/jdk.internal.util.jar=ALL-UNNAMED,java.desktop +--add-exports=java.base/sun.net.www.protocol.http=ALL-UNNAMED,java.desktop + +--add-exports=java.desktop/sun.awt.X11=ALL-UNNAMED,java.desktop +--add-exports=java.desktop/sun.applet=ALL-UNNAMED,java.desktop +--add-exports=java.desktop/sun.applet=ALL-UNNAMED,jdk.jsobject + +--add-exports=java.naming/com.sun.jndi.toolkit.url=ALL-UNNAMED,java.desktop + diff -r 889bb8e09dda -r a9608af1d93f shell-launcher/launchers.bat.in --- a/shell-launcher/launchers.bat.in Thu Feb 07 17:06:20 2019 +0100 +++ b/shell-launcher/launchers.bat.in Tue Feb 12 13:10:44 2019 +0100 @@ -1,89 +1,188 @@ +@echo off +setLocal EnableDelayedExpansion + rem use JAVAWS_J_OPTIONS to pass java arguments, instead of -J opts for this script. This will be fixed in next releases -rem use ITW_HOME to set location where ITW can be found. Form there all binaries and jars and other resources are found +rem use ITW_HOME to set location where ITW can be found. From there all binaries and jars and other resources are found rem use JAVA_HOME to set path to JRE rem any redistribution/installer can replace INST_ITW_HOME and INST_JAVA_HOME to create better defaults rem if not set, following defaults are used -set CLASSNAME=@MAIN_CLASS@ -set PROGRAM_NAME=@PROGRAM_NAME@ +set "INST_ITW_HOME=" +set "INST_JAVA_HOME=" + +rem Warning for linux users: when you put VAR="value" also quotes are stored in VAR! +rem maybe set "VAR=value" is working better? +rem Warning for if blocks: variables using %my_var% do not work (interpreter), use !my_var! with ENABLEDELAYEDEXPANSION instead +rem convention to use for temporary variables use '_' prefix + +set "NASHORN=lib/ext/nashorn.jar" +set "JRE=@JRE@" +set "JAVA=%JRE%/bin/java" +set "LAUNCHER_BOOTCLASSPATH=@LAUNCHER_BOOTCLASSPATH@" +set "LAUNCHER_FLAGS=-Xms8m" +set "CLASSNAME=@MAIN_CLASS@" +set "BINARY_LOCATION=@BIN_LOCATION@.bat" +set "SPLASH_LOCATION=@JAVAWS_SPLASH_LOCATION@" +set "RUN_ARGS_LOCATION=@MODULARJDK_ARGS_LOCATION@" +set "PROGRAM_NAME=@PROGRAM_NAME@" +set "CP=%JRE%/lib/rt.jar;%JRE%/lib/jfxrt.jar" + +rem individual parts of bootclasspath for more easy processing +set "NETX_JAR=@NETX_JAR@" +set "PLUGIN_JAR=@PLUGIN_JAR@" +set "JSOBJECT_JAR=@JSOBJECT_JAR@" +set "TAGSOUP_JAR=@TAGSOUP_JAR@" +set "RHINO_JAR=@RHINO_JAR@" +set "MSLINKS_JAR=@MSLINKS_JAR@" + -# individual parts of bootclasspath for more easy processing -NETX_JAR=@NETX_JAR -PLUGIN_JAR=@PLUGIN_JAR@ -JSOBJECT_JAR=@JSOBJECT_JAR@ -TAGSOUP_JAR=@TAGSOUP_JAR@ -RHINO_JAR=@RHINO_JAR@ -MSLINKS_JAR=@MSLINKS_JAR@ +rem resolve folder of this script: +if "%ITW_HOME%" == "" ( + set "_BAD_SLASH_SCRIPT_DIR=%~dp0" + set "_SCRIPT_DIR=!_BAD_SLASH_SCRIPT_DIR:\=/!" + set "ITW_HOME=!_SCRIPT_DIR!../" + set "_BAD_SLASH_SCRIPT_DIR=" & set "_SCRIPT_DIR=" +) -set NASHORN=lib/ext/nashorn.jar -set LAUNCHER_FLAGS=-Xms8m -if "%PROGRAM_NAME%" == "javaws" ( - set ITW_WIN_SPECIALS=-Xnofork -) else ( - set ITW_WIN_SPECIALS= +rem resolve custom JRE: +set "CUSTOM_JRE=" +if not "%JAVA_HOME%" == "" ( + "%JAVA_HOME%/bin/java.exe" -version > nul 2>&1 + if errorlevel 0 if not errorlevel 1 ( + set "CUSTOM_JRE=%JAVA_HOME%" + ) else ( + echo "Your custom JRE [%JAVA_HOME%] read from JAVA_HOME is not valid. Please fix this." + ) +) +if "%CUSTOM_JRE%" == "" ( + if not "%INST_JAVA_HOME%" == "" ( + "%INST_JAVA_HOME%/bin/java.exe" -version > nul 2>&1 + if errorlevel 0 if not errorlevel 1 ( + set "CUSTOM_JRE=%INST_JAVA_HOME%" + ) else ( + echo "Your custom JRE [%INST_JAVA_HOME%] read from INST_JAVA_HOME is not valid. Please fix this." + ) + ) +) +if "%CUSTOM_JRE%" == "" ( + rem the following is for testing-only and not intended to be robust + rem will not work from 32-bit firefox + for /f "tokens=*" %%a in ('%windir%\System32\reg query "HKLM\SOFTWARE\JavaSoft\Java Development Kit"') do set "_version_key=%%a" + set "_version=!_version_key:~58!" + for /f "tokens=*" %%a in ('%windir%\System32\reg query "HKLM\SOFTWARE\JavaSoft\Java Development Kit\!_version!" /v JavaHome') do set "_jh_key=%%a" + set "_BAD_SLASH_JAVA_HOME=!_jh_key:~22!" + set "_REG_JAVA_HOME=!_BAD_SLASH_JAVA_HOME:\=/!" + "!_REG_JAVA_HOME!/bin/java.exe" -version > nul 2>&1 + if errorlevel 0 if not errorlevel 1 ( + set "CUSTOM_JRE=!_REG_JAVA_HOME!" + ) else ( + echo "Your custom JRE [!_REG_JAVA_HOME!] read from Registry HKLM\SOFTWARE\JavaSoft\Java Development Kit is not valid. Please fix this." + ) + set "_version_key=" & set "_version=" & set "_jh_key=" & set "_BAD_SLASH_JAVA_HOME=" & set "_REG_JAVA_HOME=" ) -rem warning for linux users: when you put VAR="value" also quotes are stored in VAR! -rem maybe set "VAR=value" is working better? - -set INST_JAVA_HOME= -set BAD_SLASH_SCRIPT_DIR=%~dp0 -set SCRIPT_DIR=%BAD_SLASH_SCRIPT_DIR:\=/% -set ITW_HOME=%SCRIPT_DIR%../ +rem Support portable ITW: +if "%ITW_HOME%" == "" if not "%INST_ITW_HOME%" == "" ( + set "ITW_HOME=%INST_ITW_HOME%" +) +if not "%ITW_HOME%" == "" ( + set "BINARY_LOCATION=%ITW_HOME%/bin/%PROGRAM_NAME%.bat" + set "SPLASH_LOCATION=%ITW_HOME%/share/icedtea-web/javaws_splash.png" + set "RUN_ARGS_LOCATION=%ITW_HOME%/bin/itw-modularjdk.args" + set "NETX_JAR=%ITW_HOME%/share/icedtea-web/javaws.jar" + set "PLUGIN_JAR=%ITW_HOME%/share/icedtea-web/plugin.jar" + set "JSOBJECT_JAR=%ITW_HOME%/share/icedtea-web/jsobject.jar" + set "LAUNCHER_BOOTCLASSPATH=-Xbootclasspath/a:!NETX_JAR!;!PLUGIN_JAR!;!JSOBJECT_JAR!;%ITW_HOME%/win-deps-runtime/tagsoup.jar;%ITW_HOME%/win-deps-runtime/js.jar;%ITW_HOME%/win-deps-runtime/mslinks.jar" +) -rem the following is for testing-only and not intended to be robust -rem will not work from 32-bit firefox -for /f "tokens=*" %%a in ('%windir%\System32\reg query "HKLM\SOFTWARE\JavaSoft\Java Development Kit"') do set "version_key=%%a" -set "version=%version_key:~58%" -for /f "tokens=*" %%a in ('%windir%\System32\reg query "HKLM\SOFTWARE\JavaSoft\Java Development Kit\%version%" /v JavaHome') do set "jh_key=%%a" -set BAD_SLASH_JAVA_HOME=%jh_key:~22% -set REG_JAVA_HOME=%BAD_SLASH_JAVA_HOME:\=/% -"%REG_JAVA_HOME%/bin/java.exe" -version -if errorlevel 0 if not errorlevel 1 ( - set JAVA_HOME=%REG_JAVA_HOME% + +rem Fix classpaths for custom JRE: +if not "%CUSTOM_JRE%" == "" ( + set "JAVA=%CUSTOM_JRE%/bin/java" + set "CP=%CUSTOM_JRE%/lib/rt.jar;%CUSTOM_JRE%/lib/jfxrt.jar" + set "LAUNCHER_BOOTCLASSPATH=%LAUNCHER_BOOTCLASSPATH%;%CUSTOM_JRE%/%NASHORN%" +) else ( + set "LAUNCHER_BOOTCLASSPATH=%LAUNCHER_BOOTCLASSPATH%;%JRE%/%NASHORN%" ) -if "%INST_JAVA_HOME%" == "" ( - if not "%JAVA_HOME%" == "" ( - set CP=%JAVA_HOME%/lib/rt.jar;%JAVA_HOME%/lib/jfxrt.jar - set NASHORN=%JAVA_HOME%/%NASHORN% - set JAVA=%JAVA_HOME%/bin/java - ) else ( - set CP=@JRE@/lib/rt.jar;@JRE@/lib/jfxrt.jar - set NASHORN=@JRE@/%NASHORN% - set JAVA=@JAVA@ +rem Support Modular JDK (jigsaw): +set "MODULAR_JDK=NO" + +rem Parse Java Version +set "fullversion=" +rem capture stderr with 2^>^&1 1^>con: +for /f "tokens=*" %%a in ('"%JAVA%" -version 2^>^&1 1^>con:') do ( + set "_versionLine=%%a" + echo !_versionLine! + if "!fullversion!" == "" ( + set "_unquoted=!_versionLine:"=@!" + for /f "tokens=2,3 delims=@.-" %%b in ("!_unquoted!") do ( + set "fullversion=%%b" + rem get second digit for "1.x.y" + if !fullversion! EQU 1 ( + set "fullversion=%%c" + ) + ) ) -) else ( - set CP=%INST_JAVA_HOME%/lib/rt.jar;%INST_JAVA_HOME%/lib/jfxrt.jar - set NASHORN=%INST_JAVA_HOME%/%NASHORN% - set JAVA=%INST_JAVA_HOME%/bin/java ) +if %fullversion% GEQ 9 ( + set "MODULAR_JDK=YES" +) +set "_versionLine=" & set "_unquoted=" & set "fullversion=" -if "%ITW_HOME%" == "" ( - if not "%INST_ITW_HOME%" == "" ( - set SPLASH_LOCATION=%INST_ITW_HOME%/share/icedtea-web/javaws_splash.png - set BINARY_LOCATION=%INST_ITW_HOME%/bin/@PROGRAM_NAME@.bat - set LAUNCHER_BOOTCLASSPATH=-Xbootclasspath/a:%INST_ITW_HOME%/share/icedtea-web/netx.jar;%INST_ITW_HOME%/share/icedtea-web/plugin.jar;%INST_ITW_HOME%/share/icedtea-web/jsobject.jar;%INST_ITW_HOME%/win-deps-runtime/js.jar;%INST_ITW_HOME%/win-deps-runtime/tagsoup.jar;%INST_ITW_HOME%/win-deps-runtime/mslinks.jar;%NASHORN% - ) else ( - set SPLASH_LOCATION=@JAVAWS_SPLASH_LOCATION@ - set BINARY_LOCATION=@BIN_LOCATION@.bat - set LAUNCHER_BOOTCLASSPATH=@LAUNCHER_BOOTCLASSPATH@;%NASHORN% +set "MODULAR_ARGS=" +if "%MODULAR_JDK%" == "YES" ( + rem warning extra escaping + set "MODULAR_ARGS=--patch-module "java.desktop=%NETX_JAR%;%PLUGIN_JAR%"" + rem jsobject must be patched separately from plugin + rem otherwise netscape pkg would be shared by two modules, which is forbiden + rem plugin jar may not be built + if not "%JSOBJECT_JAR%" == "" ( + set "MODULAR_ARGS=!MODULAR_ARGS! --patch-module "jdk.jsobject=%JSOBJECT_JAR%"" ) -) else ( - set SPLASH_LOCATION=%ITW_HOME%/share/icedtea-web/javaws_splash.png - set BINARY_LOCATION=%ITW_HOME%/bin/@PROGRAM_NAME@.bat - set LAUNCHER_BOOTCLASSPATH=-Xbootclasspath/a:%ITW_HOME%/share/icedtea-web/netx.jar;%ITW_HOME%/share/icedtea-web/plugin.jar;%ITW_HOME%/share/icedtea-web/jsobject.jar;%ITW_HOME%/win-deps-runtime/js.jar;%ITW_HOME%/win-deps-runtime/tagsoup.jar;%ITW_HOME%/win-deps-runtime/mslinks.jar;%NASHORN% + rem add JDK9+ arg file: + set "MODULAR_ARGS=!MODULAR_ARGS! "@%RUN_ARGS_LOCATION%"" ) +rem Filter script args: +set "SPLASH=false" +if "%ICEDTEA_WEB_SPLASH%" == "" ( + set "SPLASH=true" +) -rem TODO use "exec -a %PROGRAM_NAME% ..." idiom -"%JAVA%" "-splash:%SPLASH_LOCATION%" "%LAUNCHER_BOOTCLASSPATH%" %LAUNCHER_FLAGS% %JAVAWS_J_OPTIONS% "-classpath" "%CP%" "-Dicedtea-web.bin.name=%PROGRAM_NAME%" "-Dicedtea-web.bin.location=%BINARY_LOCATION%" "%CLASSNAME%" %ITW_WIN_SPECIALS% %* +set "JAVA_ARGS=" +set "ARGS=" -SET errno=%ERRORLEVEL% +for %%a IN (%*) do ( + set "_arg=%%a" + set "_beg=!_arg:~0,2!" + if "!_beg!" == "-J" ( + set "JAVA_ARGS=!JAVA_ARGS! !_arg:~2!" + ) else ( + set "ARGS=!ARGS! !_arg!" + if "!_arg:~0,1!" == "-" if not "x!_arg:headless=!" == "x!_arg!" ( + set "SPLASH=false" + ) + ) +) +set "_arg=" & set "_beg=" +rem Build Java command line: + +if "%SPLASH%" == "true" ( + set "SPLASH="-splash:%SPLASH_LOCATION%"" +) else ( + set "SPLASH=" +) + +"%JAVA%" %SPLASH% "%LAUNCHER_BOOTCLASSPATH%" %LAUNCHER_FLAGS% %MODULAR_ARGS% %JAVAWS_J_OPTIONS% %JAVA_ARGS% -classpath "%CP%" "-Dicedtea-web.bin.name=%PROGRAM_NAME%" "-Dicedtea-web.bin.location=%BINARY_LOCATION%" "%CLASSNAME%" %ARGS% + +SET "errno=%ERRORLEVEL%" + echo Please press any key to close this window/get back prompt pause > nul EXIT /B %errno% + diff -r 889bb8e09dda -r a9608af1d93f shell-launcher/launchers.sh.in --- a/shell-launcher/launchers.sh.in Thu Feb 07 17:06:20 2019 +0100 +++ b/shell-launcher/launchers.sh.in Tue Feb 12 13:10:44 2019 +0100 @@ -1,23 +1,28 @@ #!/bin/bash NASHORN=lib/ext/nashorn.jar -JAVA=@JAVA@ +JRE=@JRE@ +JAVA=$JRE/bin/java LAUNCHER_BOOTCLASSPATH='@LAUNCHER_BOOTCLASSPATH@' LAUNCHER_FLAGS=-Xms8m CLASSNAME=@MAIN_CLASS@ BINARY_LOCATION=@BIN_LOCATION@ SPLASH_LOCATION=@JAVAWS_SPLASH_LOCATION@ +RUN_ARGS_LOCATION=@MODULARJDK_ARGS_LOCATION@ PROGRAM_NAME=@PROGRAM_NAME@ -CP=@JRE@/lib/rt.jar:@JRE@/lib/jfxrt.jar +CP=$JRE/lib/rt.jar:$JRE/lib/jfxrt.jar + # individual parts of bootclasspath for more easy processing NETX_JAR=@NETX_JAR@ PLUGIN_JAR=@PLUGIN_JAR@ JSOBJECT_JAR=@JSOBJECT_JAR@ TAGSOUP_JAR=@TAGSOUP_JAR@ RHINO_JAR=@RHINO_JAR@ -MSLINKS_JAR=@MSLINKS_JAR@ +# windows only: +#MSLINKS_JAR=@MSLINKS_JAR@ -## resolve folder of this script, following all symlinks, + +## resolve folder of this script, following all symlinks: ## http://stackoverflow.com/questions/59895/can-a-bash-script-tell-what-directory-its-stored-in SCRIPT_SOURCE="${BASH_SOURCE[0]}" while [ -h "$SCRIPT_SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink @@ -29,6 +34,8 @@ readonly SCRIPT_DIR="$( cd -P "$( dirname "$SCRIPT_SOURCE" )" && pwd )" readonly PORTABLE_ITW_HOME="`dirname $SCRIPT_DIR`" + +## resolve custom JRE: CONFIG_HOME=$XDG_CONFIG_HOME if [ "x$CONFIG_HOME" = "x" ] ; then CONFIG_HOME=~/.config @@ -45,7 +52,8 @@ CUSTOM_JRE=`grep "$CUSTOM_JRE_REGEX" /etc/.java/.deploy/deployment.properties 2>/dev/null | sed "s/$CUSTOM_JRE_REGEX//g"` fi; -# as used in windows lunchers, supporting portable ITW + +# Support portable ITW: # note, that this is temporary, experimental solution, moreover for 1.7 and will likely change since 1.8 # by this, sh launchers can be again a bit more portable then win ones, thats why we moved to native ones since 1.8 # still this is very dummy @@ -54,20 +62,22 @@ fi if [ "x$ITW_LIBS" == "xBUNDLED" -o ! "x$ITW_HOME" = "x" ] ; then if [ "x$ITW_HOME" = "x" ] ; then - LAUNCHER_BOOTCLASSPATH="-Xbootclasspath/a:$PORTABLE_ITW_HOME/share/icedtea-web/`basename \"$NETX_JAR\"`:$PORTABLE_ITW_HOME/share/icedtea-web/`basename \"$PLUGIN_JAR\"`:$PORTABLE_ITW_HOME/share/icedtea-web/`basename \"$JSOBJECT_JAR\"`:$PORTABLE_ITW_HOME/linux-deps-runtime/`basename \"$TAGSOUP_JAR\"`:$PORTABLE_ITW_HOME/linux-deps-runtime/`basename \"$RHINO_JAR\"`" -BINARY_LOCATION="$PORTABLE_ITW_HOME/bin/`basename \"$BINARY_LOCATION \"`" -SPLASH_LOCATION="$PORTABLE_ITW_HOME/share/icedtea-web/`basename \"$SPLASH_LOCATION \"`" -echo "warning, using portable itw from $PORTABLE_ITW_HOME: $LAUNCHER_BOOTCLASSPATH $BINARY_LOCATION $SPLASH_LOCATION" - else - LAUNCHER_BOOTCLASSPATH="-Xbootclasspath/a:$ITW_HOME/share/icedtea-web/`basename \"$NETX_JAR\"`:$ITW_HOME/share/icedtea-web/`basename \"$PLUGIN_JAR\"`:$ITW_HOME/share/icedtea-web/`basename \"$JSOBJECT_JAR\"`:$ITW_HOME/linux-deps-runtime/`basename \"$TAGSOUP_JAR\"`:$ITW_HOME/linux-deps-runtime/`basename \"$RHINO_JAR\"`" -BINARY_LOCATION="$ITW_HOME/bin/`basename \"$BINARY_LOCATION \"`" -SPLASH_LOCATION="$ITW_HOME/share/icedtea-web/`basename \"$SPLASH_LOCATION\"`" -echo "warning, using portable itw from $ITW_HOME: $LAUNCHER_BOOTCLASSPATH $BINARY_LOCATION $SPLASH_LOCATION" + ITW_HOME=$PORTABLE_ITW_HOME fi + BINARY_LOCATION="$ITW_HOME/bin/`basename \"$BINARY_LOCATION\"`" + SPLASH_LOCATION="$ITW_HOME/share/icedtea-web/`basename \"$SPLASH_LOCATION\"`" + RUN_ARGS_LOCATION="$ITW_HOME/bin/`basename \"$RUN_ARGS_LOCATION\"`" + NETX_JAR="$ITW_HOME/share/icedtea-web/`basename \"$NETX_JAR\"`" + PLUGIN_JAR="$ITW_HOME/share/icedtea-web/`basename \"$PLUGIN_JAR\"`" + JSOBJECT_JAR="$ITW_HOME/share/icedtea-web/`basename \"$JSOBJECT_JAR\"`" + LAUNCHER_BOOTCLASSPATH="-Xbootclasspath/a:$NETX_JAR:$PLUGIN_JAR:$JSOBJECT_JAR:$ITW_HOME/linux-deps-runtime/`basename \"$TAGSOUP_JAR\"`:$ITW_HOME/linux-deps-runtime/`basename \"$RHINO_JAR\"`" + echo "warning, using portable itw from $ITW_HOME: $LAUNCHER_BOOTCLASSPATH $BINARY_LOCATION $SPLASH_LOCATION" fi + +# Fix classpaths for custom JRE: if [ "x$CUSTOM_JRE" != "x" ] ; then - if [ -e "$CUSTOM_JRE" -a -e "$CUSTOM_JRE/bin/java" ] ; then + if [ -e "$CUSTOM_JRE" -a -e "$CUSTOM_JRE/bin/java" ] ; then JAVA=$CUSTOM_JRE/bin/java CP=$CUSTOM_JRE/lib/rt.jar:$CUSTOM_JRE/lib/jfxrt.jar LAUNCHER_BOOTCLASSPATH=$LAUNCHER_BOOTCLASSPATH:$CUSTOM_JRE/$NASHORN @@ -75,18 +85,23 @@ echo "Your custom JRE $CUSTOM_JRE read from deployment.properties under key $PROPERTY_NAME as $CUSTOM_JRE is not valid. Using default ($JAVA, $CP) in attempt to start. Please fix this." fi else - LAUNCHER_BOOTCLASSPATH="$LAUNCHER_BOOTCLASSPATH:@JRE@/$NASHORN" + LAUNCHER_BOOTCLASSPATH="$LAUNCHER_BOOTCLASSPATH:$JRE/$NASHORN" fi; + +# Support Modular JDK (jigsaw): MODULAR_JDK="NO" -version=`${JAVA} -version 2>&1 | head -n 1 | cut -d'-' -f1 | cut -d'"' -f2 | cut -d'.' -f1` +fullversion=`${JAVA} -version 2>&1` +version=`echo $fullversion | head -n 1 | cut -d'-' -f1 | cut -d'"' -f2 | cut -d'.' -f1` if [ $version -eq "1" ]; then - version=`${JAVA} -version 2>&1 | head -n 1 | cut -d'-' -f1 | cut -d'"' -f2 | cut -d'.' -f2` + version=`echo $fullversion | head -n 1 | cut -d'-' -f1 | cut -d'"' -f2 | cut -d'.' -f2` fi if [ $version -ge "9" ]; then MODULAR_JDK="YES" fi + +# Build Java command line: JAVA_ARGS=( ) ARGS=( ) COMMAND=() @@ -94,10 +109,12 @@ i=0 j=0 +# Filter script args: SPLASH="false" if [ "x$ICEDTEA_WEB_SPLASH" = "x" ] ; then -SPLASH="true" + SPLASH="true" fi; + while [ "$#" -gt "0" ]; do case "$1" in -J*) @@ -115,12 +132,13 @@ shift done +# TODO: inline args without using COMMAND[array] to unify linux/windows scripts k=0 COMMAND[k]="${JAVA}" k=$((k+1)) if [ "$SPLASH" = "true" ] ; then -COMMAND[k]="-splash:${SPLASH_LOCATION}" -k=$((k+1)) + COMMAND[k]="-splash:${SPLASH_LOCATION}" + k=$((k+1)) fi; COMMAND[k]="${LAUNCHER_BOOTCLASSPATH}" k=$((k+1)) @@ -128,94 +146,23 @@ k=$((k+1)) if [ "x$MODULAR_JDK" == "xYES" ] ; then -COMMAND[k]="--patch-module" -k=$((k+1)) -COMMAND[k]="java.desktop=@PLUGIN_JAR@:@NETX_JAR@" -k=$((k+1)) -# jsobject must be pathched separately from plugin -# otherwise netscape pkg would be shared by two modules, which is forbiden -JSOBJECT_JAR=@JSOBJECT_JAR@ -# plugin jar may not be built -if [ ! "x$JSOBJECT_JAR" == "x" ] ; then COMMAND[k]="--patch-module" k=$((k+1)) - COMMAND[k]="jdk.jsobject=$JSOBJECT_JAR" + COMMAND[k]="java.desktop=$NETX_JAR:$PLUGIN_JAR" k=$((k+1)) -fi - -COMMAND[k]="--add-reads" -k=$((k+1)) -COMMAND[k]="java.base=ALL-UNNAMED,java.desktop" -k=$((k+1)) -COMMAND[k]="--add-reads" -k=$((k+1)) -COMMAND[k]="java.desktop=ALL-UNNAMED,java.naming" -k=$((k+1)) -COMMAND[k]="--add-reads" -k=$((k+1)) -COMMAND[k]="java.naming=ALL-UNNAMED,java.desktop" -k=$((k+1)) + # jsobject must be patched separately from plugin + # otherwise netscape pkg would be shared by two modules, which is forbiden + # plugin jar may not be built + if [ ! "x$JSOBJECT_JAR" == "x" ] ; then + COMMAND[k]="--patch-module" + k=$((k+1)) + COMMAND[k]="jdk.jsobject=$JSOBJECT_JAR" + k=$((k+1)) + fi -COMMAND[k]="--add-exports" -k=$((k+1)) -COMMAND[k]="java.desktop/sun.awt=ALL-UNNAMED,java.desktop" -k=$((k+1)) -COMMAND[k]="--add-exports" -k=$((k+1)) -COMMAND[k]="java.desktop/javax.jnlp=ALL-UNNAMED,java.desktop" -k=$((k+1)) -COMMAND[k]="--add-exports" -k=$((k+1)) -COMMAND[k]="java.base/sun.security.provider=ALL-UNNAMED,java.desktop" -k=$((k+1)) -COMMAND[k]="--add-exports" -k=$((k+1)) -COMMAND[k]="java.base/sun.security.util=ALL-UNNAMED,java.desktop" -k=$((k+1)) -COMMAND[k]="--add-exports" -k=$((k+1)) -COMMAND[k]="java.base/sun.security.x509=ALL-UNNAMED,java.desktop" -k=$((k+1)) -COMMAND[k]="--add-exports" -k=$((k+1)) -COMMAND[k]="java.base/jdk.internal.util.jar=ALL-UNNAMED,java.desktop" -k=$((k+1)) -COMMAND[k]="--add-exports" -k=$((k+1)) -COMMAND[k]="java.base/sun.security.validator=ALL-UNNAMED,java.desktop" -k=$((k+1)) -COMMAND[k]="--add-exports" -k=$((k+1)) -COMMAND[k]="java.base/com.sun.net.ssl.internal.ssl=ALL-UNNAMED,java.desktop" -k=$((k+1)) -COMMAND[k]="--add-exports" -k=$((k+1)) -COMMAND[k]="java.base/sun.net.www.protocol.jar=ALL-UNNAMED,java.desktop" -k=$((k+1)) -COMMAND[k]="--add-exports" -k=$((k+1)) -COMMAND[k]="java.desktop/sun.awt.X11=ALL-UNNAMED,java.desktop" -k=$((k+1)) -COMMAND[k]="--add-exports" -k=$((k+1)) -COMMAND[k]="java.naming/com.sun.jndi.toolkit.url=ALL-UNNAMED,java.desktop" -k=$((k+1)) -COMMAND[k]="--add-exports" -k=$((k+1)) -COMMAND[k]="java.desktop/sun.applet=ALL-UNNAMED,java.desktop" -k=$((k+1)) -COMMAND[k]="--add-exports" -k=$((k+1)) -COMMAND[k]="java.base/sun.security.action=ALL-UNNAMED,java.desktop" -k=$((k+1)) -COMMAND[k]="--add-exports" -k=$((k+1)) -COMMAND[k]="java.base/sun.net.www.protocol.http=ALL-UNNAMED,java.desktop" -k=$((k+1)) -COMMAND[k]="--add-exports" -k=$((k+1)) -COMMAND[k]="java.desktop/sun.applet=ALL-UNNAMED,jdk.jsobject" -k=$((k+1)) + # add JDK9+ arg file: + COMMAND[k]="@$RUN_ARGS_LOCATION" + k=$((k+1)) fi @@ -225,14 +172,17 @@ i=$((i+1)) k=$((k+1)) done + COMMAND[k]="-classpath" k=$((k+1)) COMMAND[k]="${CP}" k=$((k+1)) + COMMAND[k]="-Dicedtea-web.bin.name=${PROGRAM_NAME}" k=$((k+1)) COMMAND[k]="-Dicedtea-web.bin.location=${BINARY_LOCATION}" k=$((k+1)) + COMMAND[k]="${CLASSNAME}" k=$((k+1)) j=0 @@ -245,3 +195,4 @@ exec -a "$PROGRAM_NAME" "${COMMAND[@]}" exit $? +