[m-rev.] diff: fix bug #339: --restricted-command-line broken with recent Java compilers
Sebastian Godelet
sebastian.godelet at outlook.com
Thu Jul 16 18:47:02 AEST 2015
Hi Julien,
> -----Original Message-----
> From: Julien Fischer [mailto:jfischer at opturion.com]
> Sent: Wednesday, July 15, 2015 3:11 PM
> To: Julien Fischer
> Cc: Sebastian Godelet; reviews at lists.mercurylang.org
> Subject: RE: [m-rev.] diff: fix bug #339: --restricted-command-line broken with
> recent Java compilers
>
>
> On Wed, 15 Jul 2015, Julien Fischer wrote:
>
> > On Wed, 15 Jul 2015, Sebastian Godelet wrote:
> >
> >> The compiler is compiled in a msys environment,
> >> But I tested it in a normal Windows command shell.
> >> In my Mercury.config file I have --env-type windows.
> >> Nevertheless, if I open an msys shell and use:
> >>
> >> $ mmc --use-grade-subdirs --env-type msys -s java -m fmt_bug
> >> cp: cannot stat `Mercury\\java\\i686-pc-mingw32\\Mercury\\bin\\fmt_bug':
> No
> >> such file or directory
> >> Made symlink/copy of Mercury\java\i686-pc-
> mingw32\Mercury\jars\fmt_bug.jar
> >> mercury_compile.exe: error copying
> >> `Mercury\java\i686-pc-mingw32\Mercury\bin\fmt_bug' to `fmt_bug', can't
> open
> >> input file: No such file or directory
> >>
> >> The same problem applies.
> >
> > Ok, I'll take a look at it.
>
> I haven't been able to reproduce this one.
I think the problem was introduced in commit f903c238fb283f7e4047fbf06c62e8c9307cc5c8:
Fix problems with --use-grade-subdirs with C# and Java backends.
There Windows batch files where made subdir dependent:
@@ -1181,7 +1192,7 @@
create_launcher_batch_file(Globals, MainModuleName, Pred, Succeeded, !IO) :-
Extension = ".bat",
module_name_to_file_name(Globals, MainModuleName, Extension,
- do_not_create_dirs, FileName, !IO),
+ do_create_dirs, FileName, !IO),
But in the compile_target_code module in the post_link_make_symlink_or_copy predicate
module_name_to_file_name is called with an empty "" extension,
thus yielding the "bin" directory instead of the "bats" sub-directory (this is how the internals work for module_name_to_file_name afaik).
So when not compiling with --target-env windows this bug had no effect,
only the combination of --use(-grade)-subdirs and Windows causes this.
diff --git a/compiler/compile_target_code.m b/compiler/compile_target_code.m
index 82f4a91..eb2c280 100644
--- a/compiler/compile_target_code.m
+++ b/compiler/compile_target_code.m
@@ -2652,12 +2652,10 @@ post_link_make_symlink_or_copy(ErrorStream, LinkTargetType, ModuleName,
)
then
ScriptExt = get_launcher_script_extension(Globals),
- module_name_to_file_name(Globals, ModuleName, "",
- do_not_create_dirs, OutputScriptName0, !IO),
- OutputScriptName = OutputScriptName0 ++ ScriptExt,
- module_name_to_file_name(NoSubdirGlobals, ModuleName, "",
- do_not_create_dirs, UserDirScriptName0, !IO),
- UserDirScriptName = UserDirScriptName0 ++ ScriptExt,
+ module_name_to_file_name(Globals, ModuleName, ScriptExt,
+ do_not_create_dirs, OutputScriptName, !IO),
+ module_name_to_file_name(NoSubdirGlobals, ModuleName, ScriptExt,
+ do_not_create_dirs, UserDirScriptName, !IO),
same_timestamp(OutputScriptName, UserDirScriptName,
ScriptSameTimestamp, !IO),
>
> >> Again, without the --use-grade-subdirs the correct file gets copid.
> >> I should mention that in the former case (Windows cmd), the subdir
> >> Mercury\java\i686-pc-mingw32\Mercury\bats
> >> Does contain the bat file, just it seems that the `cp' command is not
> >> looking in that folder.
> >>
> >> On a side note, if I use --env-type msys, the java class path still uses
> >> the c:/ Windows path convention in the
> >> Shell script and thus cannot be executed (though I think that is a
> >> different problem).
> >
> > I don't think the MSYS use case was really considered when we added
> > support for launcher scripts. (The reason is probably that it's
> > somewhat awkward as it requires Unix conventions in some spots and
> > Windows ones in others -- also, at the time I don't think the Mercury
> > compiler had sufficient information about the environment to actually
> > handle it properly anyway.) I'll take a look at this one as well
>
> The following patch should fix the latter problem, although I don't have
> a Windows machine at hand to test it at the moment.
I haven't yet tried your inline patch for this, it takes quite a while to compile the compiler on my machine (using Windows).
On the same machine using Fedora, it builds much faster (x2-x3), my bet is all this shell script forking is much slower in msys 32-bit.
I have not been able to build with any version of msys 64 bit on Windows, always failing while configuring Boehm GC not knowing about the target architecture.
>
> Cheers,
> Julien.
>
> diff --git a/compiler/module_cmds.m b/compiler/module_cmds.m
> index 72fff72..bc68591 100644
> --- a/compiler/module_cmds.m
> +++ b/compiler/module_cmds.m
> @@ -768,12 +768,16 @@ create_java_shell_script(Globals, MainModuleName,
> Succeeded, !IO) :-
> (
> ( TargetEnvType = env_type_posix
> ; TargetEnvType = env_type_cygwin
> - ; TargetEnvType = env_type_msys
> ),
> create_launcher_shell_script(Globals, MainModuleName,
> write_java_shell_script(Globals, MainModuleName, JarFileName),
> Succeeded, !IO)
> ;
> + TargetEnvType = env_type_msys,
> + create_launcher_shell_script(Globals, MainModuleName,
> + write_java_msys_shell_script(Globals, MainModuleName,
> JarFileName),
> + Succeeded, !IO)
> + ;
> % XXX should create a .ps1 file on PowerShell.
> ( TargetEnvType = env_type_win_cmd
> ; TargetEnvType = env_type_powershell
> @@ -812,6 +816,44 @@ write_java_shell_script(Globals, MainModuleName,
> JarFileName, Stream, !IO) :-
> "exec \"$JAVA\" jmercury.", ClassName, " \"$@\"\n"
> ], !IO).
>
> + % For the MSYS version of the Java launcher script, there are a few
> + % differences:
> + %
> + % 1. The value of the CLASSPATH environment variable we construct for
> + % the Java interpreter must contain Windows style paths.
> + %
> + % 2. We use forward slashes as directory separators rather than back
> + % slashes since the latter require escaping inside the shell script.
> + %
> + % 3. The path of the Java interpreter must be a Unix style path as it
> + % will be invoked directly from the MSYS shell.
> + %
> +:- pred write_java_msys_shell_script(globals::in, module_name::in,
> + file_name::in, io.text_output_stream::in, io::di, io::uo) is det.
> +
> +write_java_msys_shell_script(Globals, MainModuleName, JarFileName,
> Stream, !IO) :-
> + get_mercury_std_libs_for_java(Globals, MercuryStdLibs),
> + globals.lookup_accumulating_option(Globals, java_classpath,
> + UserClasspath),
> + % We prepend the .class files' directory and the current CLASSPATH.
> + Java_Incl_Dirs = ["\"$DIR/" ++ JarFileName ++ "\""] ++
> + MercuryStdLibs ++ ["$CLASSPATH" | UserClasspath],
> + ClassPath0 = string.join_list(";", Java_Incl_Dirs),
> + ClassPath = string.replace_all(ClassPath0, "\\", "/"),
> +
> + globals.lookup_string_option(Globals, java_interpreter, Java),
> + mangle_sym_name_for_java(MainModuleName, module_qual, ".",
> ClassName),
> +
> + io.write_strings(Stream, [
> + "#!/bin/sh\n",
> + "DIR=${0%/*}\n",
> + "DIR=$( cd \"${DIR}\" && pwd -W )\n",
> + "CLASSPATH=", ClassPath, "\n",
> + "export CLASSPATH\n",
> + "JAVA=${JAVA:-", Java, "}\n",
> + "exec \"$JAVA\" jmercury.", ClassName, " \"$@\"\n"
> + ], !IO).
> +
> :- pred write_java_batch_file(globals::in, module_name::in, file_name::in,
> io.text_output_stream::in, io::di, io::uo) is det.
>
>
>
>
>
>
>
>
>
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: fix-java-batch-creation.diff
Type: application/octet-stream
Size: 1142 bytes
Desc: not available
URL: <http://lists.mercurylang.org/archives/reviews/attachments/20150716/295eda57/attachment.obj>
More information about the reviews
mailing list