[m-rev.] for review: make it possible to run the installed Java version of the compiler

Peter Wang novalazy at gmail.com
Fri Sep 4 12:36:59 AEST 2015


On Fri, 4 Sep 2015 11:42:14 +1000 (AEST), Julien Fischer <jfischer at opturion.com> wrote:
> 
> For review by anyone
> 
> ----------------
> 
> Make it possible to run the installed Java version of the compiler.
> 
> Make it possible to run the installed Java version of the compiler by
> installing versions of the wrapper scripts for 'mercury_compile' and
> 'mfilterjavac' that have the CLASSPATH set to point to the installed versions
> of the standard library Java archives.
> 
> The wrapper script generated in the compiler directory is not suitable for this
> because as generated it sets the CLASSPATH relative to the compiler directory,
> not the installation directory.  Modifying that file is not a good idea since
> that will mean that then the compiler cannot be executed in situ.  Instead we
> provide a handwritten version of the wrapper script in the scripts directory
> that is installed in place of the generated one.  Ditto for mfilterjavac.
> 
> While this does create a small maintenance problem, I think that any other
> approach, for example, modifying the generation of wrapper scripts to account
> for this, is going to be a larger maintenance problem.
> 
> TODO:
>     - handle batch file launchers for Windows.
>     - handle other exectuables in the Mercury system (although most of
>       these are not so important in this context).
> 
> compiler/Mmakefile:
> mfilterjavac/Mmakefile:
>      Do not install generated wrapper scripts from these directories in the Java
>      grade.
> 
> scripts/mercury_compile.sh-java:
> scripts/mfilterjavac.sh-java:
>      Java wrappers scripts for the installed versions of the compiler
>      and mfilterjavac.
> 
> scripts/Mmakefile:
>      In the Java grade install the wrapper scripts for the compiler and
>      mfilterjavac from this directory.
> 
> Julien.
> 
> diff --git a/compiler/Mmakefile b/compiler/Mmakefile
> index 9b00027..0e2fce7 100644
> --- a/compiler/Mmakefile
> +++ b/compiler/Mmakefile
> @@ -261,11 +261,21 @@ install_mercury: install_compiler
>   install_dirs:
>   	-[ -d $(INSTALL_MERC_BIN_DIR) ] || mkdir -p $(INSTALL_MERC_BIN_DIR)
> 
> +# If the compiler is built in the Java grade then we need to install Java
> +# archive containing its class files (currently called top_level.jar), but
> +# *not* the generated wrapper script 'mercury_compile' from this directory.
> +# The latter will set the CLASSPATH variable relative to this directory and
> +# won't work when moved to the installation directory.  Instead we use the
> +# version of the wrapper script from the scripts directory and leave the
> +# one here alone.
> +#
>   .PHONY: install_compiler
> -install_compiler: mercury_compile install_dirs
> -	cp `vpath_find mercury_compile$(EXT_FOR_EXE)` $(INSTALL_MERC_BIN_DIR)
>   ifeq ($(findstring java,$(GRADE)),java)
> +install_compiler: mercury_compile install_dirs
>   	cp `vpath_find top_level.jar` $(INSTALL_MERC_BIN_DIR)
> +else
> +install_compiler: mercury_compile install_dirs
> +	cp `vpath_find mercury_compile$(EXT_FOR_EXE)` $(INSTALL_MERC_BIN_DIR)
>   endif
> 
>   #-----------------------------------------------------------------------------#

Use a variable of files to install instead of duplicating the rule.

> diff --git a/mfilterjavac/Mmakefile b/mfilterjavac/Mmakefile
> index 01122af..f758c0c 100644
> --- a/mfilterjavac/Mmakefile
> +++ b/mfilterjavac/Mmakefile
> @@ -135,13 +135,19 @@ realclean_local:
> 
>   # Installation target
> 
> +# See the comment above the 'install_compiler' target in compiler/Mmakefile
> +# for the reasons why we handle the java grade specially here.
> +#
>   .PHONY: install
> +ifeq ($(findstring java,$(GRADE)),java)
> +install: mfilterjavac
> +	-[ -d $(INSTALL_MERC_BIN_DIR) ] || mkdir -p $(INSTALL_MERC_BIN_DIR)
> +	cp `vpath_find mfilterjavac.jar` $(INSTALL_MERC_BIN_DIR)
> +else
>   install: mfilterjavac
>   	-[ -d $(INSTALL_MERC_BIN_DIR) ] || mkdir -p $(INSTALL_MERC_BIN_DIR)
>   	cp `vpath_find mfilterjavac$(EXT_FOR_EXE)` \
>   		$(INSTALL_MERC_BIN_DIR)/mfilterjavac$(EXT_FOR_EXE)
> -ifeq ($(findstring java,$(GRADE)),java)
> -	cp `vpath_find mfilterjavac.jar` $(INSTALL_MERC_BIN_DIR)
>   endif
> 
>   #-----------------------------------------------------------------------------#

Also here.

> diff --git a/scripts/Mmakefile b/scripts/Mmakefile
> index bbf2813..8cd6bf6 100644
> --- a/scripts/Mmakefile
> +++ b/scripts/Mmakefile
> @@ -137,6 +137,12 @@ install_scripts: $(SCRIPTS) install_dirs
>   	done
>   	cp *.in *.sh-subr $(SCRIPTS) $(INSTALL_RECONF_DIR)/scripts
>   	-rm -f $(INSTALL_BINDIR)/mmake.old
> +ifeq ($(findstring java,$(GRADE)),java)
> +	cp mercury_compile.sh-java $(INSTALL_MERC_BIN_DIR)/mercury_compile
> +	cp mfilterjavac.sh-java $(INSTALL_MERC_BIN_DIR)/mfilterjavac
> +	chmod a+x $(INSTALL_MERC_BIN_DIR)/mercury_compile \
> +		$(INSTALL_MERC_BIN_DIR)/mfilterjavac
> +endif

Do we need the chmod if the files have the executable bit set in the
repository?

> diff --git a/scripts/mercury_compile.sh-java b/scripts/mercury_compile.sh-java
> index e69de29..9d31834 100755
> --- a/scripts/mercury_compile.sh-java
> +++ b/scripts/mercury_compile.sh-java
> @@ -0,0 +1,16 @@
> +#!/bin/sh
> +
> +# This script invokes the _installed_ version of the Mercury compiler when it
> +# is built in the Java grade.
> +
> +DIR=${0%/*}
> +DIR=$( cd "${DIR}" && pwd -P )
> +case $WINDIR in
> +   '') SEP=':' ;;
> +   *)  SEP=';' ;;
> +esac
> +JARDIR="$DIR/../lib/mercury/lib/java"
> +CLASSPATH="$DIR/top_level.jar"${SEP}$CLASSPATH${SEP}$JARDIR/mer_rt.jar${SEP}$JARDIR/mer_std.jar${SEP}$JARDIR/mer_browser.jar${SEP}$JARDIR/mer_mdbcomp.jar
> +export CLASSPATH
> +JAVA=${JAVA:-/usr/bin/java}
> +exec "$JAVA" jmercury.top_level "$@"
> diff --git a/scripts/mfilterjavac.sh-java b/scripts/mfilterjavac.sh-java
> index e69de29..f818364 100755
> --- a/scripts/mfilterjavac.sh-java
> +++ b/scripts/mfilterjavac.sh-java
> @@ -0,0 +1,16 @@
> +#!/bin/sh
> +
> +# This script invokes the _installed_ version of the mfilterjavac when it
> +# is built in the Java grade.
> +
> +DIR=${0%/*}
> +DIR=$( cd "${DIR}" && pwd -P )
> +case $WINDIR in
> +   '') SEP=':' ;;
> +   *)  SEP=';' ;;
> +esac
> +JARDIR="$DIR/../lib/mercury/lib/java"
> +CLASSPATH="$DIR/mfilterjavac.jar"${SEP}$CLASSPATH${SEP}$JARDIR/mer_rt.jar${SEP}$JARDIR/mer_std.jar${SEP}$JARDIR/mer_browser.jar${SEP}$JARDIR/mer_mdbcomp.jar
> +export CLASSPATH
> +JAVA=${JAVA:-/usr/bin/java}
> +exec "$JAVA" jmercury.mfilterjavac "$@"

Default to JAVA=java.

Peter



More information about the reviews mailing list