From 65b730bd59790338a6bfad6f976ff74b12d6bc13 Mon Sep 17 00:00:00 2001 From: Robert Bragg Date: Thu, 8 Feb 2018 00:25:33 +0000 Subject: ninja: pass separated paths to javac -sourcepath The -sourcepath option can't be passed multiple times to javac, since it simply overrides prior arguments. Instead -sourcepath takes a colon (or semi-colon on windows) separated list of paths. --- mesonbuild/backend/ninjabackend.py | 5 ++++- test cases/java/5 includedirs/com/mesonbuild/Simple.java | 8 ++++++++ .../java/5 includedirs/com/mesonbuild/TextPrinter.java | 14 ++++++++++++++ test cases/java/5 includedirs/meson.build | 15 +++++++++++++++ 4 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 test cases/java/5 includedirs/com/mesonbuild/Simple.java create mode 100644 test cases/java/5 includedirs/com/mesonbuild/TextPrinter.java create mode 100644 test cases/java/5 includedirs/meson.build diff --git a/mesonbuild/backend/ninjabackend.py b/mesonbuild/backend/ninjabackend.py index c508cec..cb51f3b 100644 --- a/mesonbuild/backend/ninjabackend.py +++ b/mesonbuild/backend/ninjabackend.py @@ -1029,9 +1029,12 @@ int dummy; args += self.build.get_project_args(compiler, target.subproject) args += target.get_java_args() args += compiler.get_output_args(self.get_target_private_dir(target)) + sourcepath = '' for i in target.include_dirs: for idir in i.get_incdirs(): - args += ['-sourcepath', os.path.join(self.build_to_src, i.curdir, idir)] + sourcepath += os.path.join(self.build_to_src, i.curdir, idir) + os.pathsep + if sourcepath != '': + args += ['-sourcepath', sourcepath] rel_src = src.rel_to_builddir(self.build_to_src) plain_class_path = src.fname[:-4] + 'class' rel_obj = os.path.join(self.get_target_private_dir(target), plain_class_path) diff --git a/test cases/java/5 includedirs/com/mesonbuild/Simple.java b/test cases/java/5 includedirs/com/mesonbuild/Simple.java new file mode 100644 index 0000000..05a73ac --- /dev/null +++ b/test cases/java/5 includedirs/com/mesonbuild/Simple.java @@ -0,0 +1,8 @@ +package com.mesonbuild; + +class Simple { + public static void main(String [] args) { + TextPrinter t = new TextPrinter("Printing from Java."); + t.print(); + } +} diff --git a/test cases/java/5 includedirs/com/mesonbuild/TextPrinter.java b/test cases/java/5 includedirs/com/mesonbuild/TextPrinter.java new file mode 100644 index 0000000..7e330a6 --- /dev/null +++ b/test cases/java/5 includedirs/com/mesonbuild/TextPrinter.java @@ -0,0 +1,14 @@ +package com.mesonbuild; + +class TextPrinter { + + private String msg; + + TextPrinter(String s) { + msg = s; + } + + public void print() { + System.out.println(msg); + } +} diff --git a/test cases/java/5 includedirs/meson.build b/test cases/java/5 includedirs/meson.build new file mode 100644 index 0000000..0b2942d --- /dev/null +++ b/test cases/java/5 includedirs/meson.build @@ -0,0 +1,15 @@ +# The Ninja backend used to try and pass -sourcepath repeatedly for +# multiple includes which would discard prior includes. Since this +# won't compile without the '.' include, this ensures that multiple +# paths are passed in a [semi-]colon separated list instead... + +project('includedirsjava', 'java') + +javaprog = jar('myprog', + 'com/mesonbuild/Simple.java', + 'com/mesonbuild/TextPrinter.java', + main_class : 'com.mesonbuild.Simple', + include_directories : [ include_directories('com'), + include_directories('.'), + include_directories('com/mesonbuild') ]) +test('subdirtest', javaprog) -- cgit v1.1 From 61dd46811b324a070c9a5007ac9b92a58fce9bb4 Mon Sep 17 00:00:00 2001 From: Robert Bragg Date: Thu, 8 Feb 2018 00:11:26 +0000 Subject: ninja: avoid needing include_directory('.') with jar() Although only one file is passed to javac at a time, if your code has any inter-file dependencies javac still needs to know how to find other source files for its -implicit:class feature to work whereby it will automatically also compile files that the given file depends on. -implicit:class is the default, practical, behaviour of javac since otherwise it would be necessary to declare the class dependencies for parallel java builds to be feasible. Passing "include_directory: include_directory('.')" to jar() causes -souredir to be passed to javac which then enables your source code to have inter-file class dependencies - assuming none of your source code is generated. This ensures that '.' is included by default. --- mesonbuild/backend/ninjabackend.py | 6 +++--- .../java/6 no includedirs/com/mesonbuild/Simple.java | 8 ++++++++ .../java/6 no includedirs/com/mesonbuild/TextPrinter.java | 14 ++++++++++++++ test cases/java/6 no includedirs/meson.build | 14 ++++++++++++++ 4 files changed, 39 insertions(+), 3 deletions(-) create mode 100644 test cases/java/6 no includedirs/com/mesonbuild/Simple.java create mode 100644 test cases/java/6 no includedirs/com/mesonbuild/TextPrinter.java create mode 100644 test cases/java/6 no includedirs/meson.build diff --git a/mesonbuild/backend/ninjabackend.py b/mesonbuild/backend/ninjabackend.py index cb51f3b..8ac7658 100644 --- a/mesonbuild/backend/ninjabackend.py +++ b/mesonbuild/backend/ninjabackend.py @@ -1029,12 +1029,12 @@ int dummy; args += self.build.get_project_args(compiler, target.subproject) args += target.get_java_args() args += compiler.get_output_args(self.get_target_private_dir(target)) - sourcepath = '' + curdir = target.get_subdir() + sourcepath = os.path.join(self.build_to_src, curdir) + os.pathsep for i in target.include_dirs: for idir in i.get_incdirs(): sourcepath += os.path.join(self.build_to_src, i.curdir, idir) + os.pathsep - if sourcepath != '': - args += ['-sourcepath', sourcepath] + args += ['-sourcepath', sourcepath] rel_src = src.rel_to_builddir(self.build_to_src) plain_class_path = src.fname[:-4] + 'class' rel_obj = os.path.join(self.get_target_private_dir(target), plain_class_path) diff --git a/test cases/java/6 no includedirs/com/mesonbuild/Simple.java b/test cases/java/6 no includedirs/com/mesonbuild/Simple.java new file mode 100644 index 0000000..05a73ac --- /dev/null +++ b/test cases/java/6 no includedirs/com/mesonbuild/Simple.java @@ -0,0 +1,8 @@ +package com.mesonbuild; + +class Simple { + public static void main(String [] args) { + TextPrinter t = new TextPrinter("Printing from Java."); + t.print(); + } +} diff --git a/test cases/java/6 no includedirs/com/mesonbuild/TextPrinter.java b/test cases/java/6 no includedirs/com/mesonbuild/TextPrinter.java new file mode 100644 index 0000000..7e330a6 --- /dev/null +++ b/test cases/java/6 no includedirs/com/mesonbuild/TextPrinter.java @@ -0,0 +1,14 @@ +package com.mesonbuild; + +class TextPrinter { + + private String msg; + + TextPrinter(String s) { + msg = s; + } + + public void print() { + System.out.println(msg); + } +} diff --git a/test cases/java/6 no includedirs/meson.build b/test cases/java/6 no includedirs/meson.build new file mode 100644 index 0000000..b399211 --- /dev/null +++ b/test cases/java/6 no includedirs/meson.build @@ -0,0 +1,14 @@ +# It used to be necessary to pass: +# +# include_directories: include_directories('.') +# +# to any use of jar() to compile source code with inter-file class +# dependencies. This is now the default behaviour. + +project('noincludedirsjava', 'java') + +javaprog = jar('myprog', + 'com/mesonbuild/Simple.java', + 'com/mesonbuild/TextPrinter.java', + main_class : 'com.mesonbuild.Simple') +test('subdirtest', javaprog) -- cgit v1.1 From ec7b834b6e76aac8cc64b37a9cad643d556139c5 Mon Sep 17 00:00:00 2001 From: Robert Bragg Date: Thu, 8 Feb 2018 00:33:17 +0000 Subject: ninja: add build dir to javac -sourcepath To allow the javac -implicit:class behaviour to know where to find generated .java files then the build directory for the target is also added to the -sourcefile path. --- mesonbuild/backend/ninjabackend.py | 1 + test cases/java/7 codegen/com/mesonbuild/Config.java.in | 5 +++++ test cases/java/7 codegen/com/mesonbuild/Simple.java | 12 ++++++++++++ test cases/java/7 codegen/com/mesonbuild/TextPrinter.java | 14 ++++++++++++++ test cases/java/7 codegen/com/mesonbuild/meson.build | 6 ++++++ test cases/java/7 codegen/meson.build | 15 +++++++++++++++ 6 files changed, 53 insertions(+) create mode 100644 test cases/java/7 codegen/com/mesonbuild/Config.java.in create mode 100644 test cases/java/7 codegen/com/mesonbuild/Simple.java create mode 100644 test cases/java/7 codegen/com/mesonbuild/TextPrinter.java create mode 100644 test cases/java/7 codegen/com/mesonbuild/meson.build create mode 100644 test cases/java/7 codegen/meson.build diff --git a/mesonbuild/backend/ninjabackend.py b/mesonbuild/backend/ninjabackend.py index 8ac7658..c7e194e 100644 --- a/mesonbuild/backend/ninjabackend.py +++ b/mesonbuild/backend/ninjabackend.py @@ -1031,6 +1031,7 @@ int dummy; args += compiler.get_output_args(self.get_target_private_dir(target)) curdir = target.get_subdir() sourcepath = os.path.join(self.build_to_src, curdir) + os.pathsep + sourcepath += os.path.normpath(curdir) + os.pathsep for i in target.include_dirs: for idir in i.get_incdirs(): sourcepath += os.path.join(self.build_to_src, i.curdir, idir) + os.pathsep diff --git a/test cases/java/7 codegen/com/mesonbuild/Config.java.in b/test cases/java/7 codegen/com/mesonbuild/Config.java.in new file mode 100644 index 0000000..fcc8811 --- /dev/null +++ b/test cases/java/7 codegen/com/mesonbuild/Config.java.in @@ -0,0 +1,5 @@ +package com.mesonbuild; + +public class Config { + public static final boolean FOOBAR = @foobar@; +} diff --git a/test cases/java/7 codegen/com/mesonbuild/Simple.java b/test cases/java/7 codegen/com/mesonbuild/Simple.java new file mode 100644 index 0000000..df3c53d --- /dev/null +++ b/test cases/java/7 codegen/com/mesonbuild/Simple.java @@ -0,0 +1,12 @@ +package com.mesonbuild; + +import com.mesonbuild.Config; + +class Simple { + public static void main(String [] args) { + if (Config.FOOBAR) { + TextPrinter t = new TextPrinter("Printing from Java."); + t.print(); + } + } +} diff --git a/test cases/java/7 codegen/com/mesonbuild/TextPrinter.java b/test cases/java/7 codegen/com/mesonbuild/TextPrinter.java new file mode 100644 index 0000000..7e330a6 --- /dev/null +++ b/test cases/java/7 codegen/com/mesonbuild/TextPrinter.java @@ -0,0 +1,14 @@ +package com.mesonbuild; + +class TextPrinter { + + private String msg; + + TextPrinter(String s) { + msg = s; + } + + public void print() { + System.out.println(msg); + } +} diff --git a/test cases/java/7 codegen/com/mesonbuild/meson.build b/test cases/java/7 codegen/com/mesonbuild/meson.build new file mode 100644 index 0000000..188bedf --- /dev/null +++ b/test cases/java/7 codegen/com/mesonbuild/meson.build @@ -0,0 +1,6 @@ + +conf_data = configuration_data() +conf_data.set('foobar', 'true') +config_file = configure_file(input : 'Config.java.in', + output : 'Config.java', + configuration : conf_data) diff --git a/test cases/java/7 codegen/meson.build b/test cases/java/7 codegen/meson.build new file mode 100644 index 0000000..f85d45a --- /dev/null +++ b/test cases/java/7 codegen/meson.build @@ -0,0 +1,15 @@ +# If we generate code under the build directory then the backend needs to add +# the build directory to the -sourcepath passed to javac otherwise the compiler +# won't be able to handle the -implicit:class behaviour of automatically +# compiling dependency classes. + +project('codegenjava', 'java') + +subdir('com/mesonbuild') + +javaprog = jar('myprog', + config_file, + 'com/mesonbuild/Simple.java', + 'com/mesonbuild/TextPrinter.java', + main_class : 'com.mesonbuild.Simple') +test('subdirtest', javaprog) -- cgit v1.1 From ef16fb2e973cf7d5aa4850decdc404be5389b8f3 Mon Sep 17 00:00:00 2001 From: Niclas Moeslund Overby Date: Wed, 16 May 2018 14:52:23 +0200 Subject: tests: Remove redundant test and include_directories('.') --- test cases/java/2 subdir/sub/meson.build | 3 +-- test cases/java/5 includedirs/meson.build | 1 - test cases/java/6 codegen/com/mesonbuild/Config.java.in | 5 +++++ test cases/java/6 codegen/com/mesonbuild/Simple.java | 12 ++++++++++++ test cases/java/6 codegen/com/mesonbuild/TextPrinter.java | 14 ++++++++++++++ test cases/java/6 codegen/com/mesonbuild/meson.build | 6 ++++++ test cases/java/6 codegen/meson.build | 15 +++++++++++++++ .../java/6 no includedirs/com/mesonbuild/Simple.java | 8 -------- .../java/6 no includedirs/com/mesonbuild/TextPrinter.java | 14 -------------- test cases/java/6 no includedirs/meson.build | 14 -------------- test cases/java/7 codegen/com/mesonbuild/Config.java.in | 5 ----- test cases/java/7 codegen/com/mesonbuild/Simple.java | 12 ------------ test cases/java/7 codegen/com/mesonbuild/TextPrinter.java | 14 -------------- test cases/java/7 codegen/com/mesonbuild/meson.build | 6 ------ test cases/java/7 codegen/meson.build | 15 --------------- 15 files changed, 53 insertions(+), 91 deletions(-) create mode 100644 test cases/java/6 codegen/com/mesonbuild/Config.java.in create mode 100644 test cases/java/6 codegen/com/mesonbuild/Simple.java create mode 100644 test cases/java/6 codegen/com/mesonbuild/TextPrinter.java create mode 100644 test cases/java/6 codegen/com/mesonbuild/meson.build create mode 100644 test cases/java/6 codegen/meson.build delete mode 100644 test cases/java/6 no includedirs/com/mesonbuild/Simple.java delete mode 100644 test cases/java/6 no includedirs/com/mesonbuild/TextPrinter.java delete mode 100644 test cases/java/6 no includedirs/meson.build delete mode 100644 test cases/java/7 codegen/com/mesonbuild/Config.java.in delete mode 100644 test cases/java/7 codegen/com/mesonbuild/Simple.java delete mode 100644 test cases/java/7 codegen/com/mesonbuild/TextPrinter.java delete mode 100644 test cases/java/7 codegen/com/mesonbuild/meson.build delete mode 100644 test cases/java/7 codegen/meson.build diff --git a/test cases/java/2 subdir/sub/meson.build b/test cases/java/2 subdir/sub/meson.build index 807ca51..2111c06 100644 --- a/test cases/java/2 subdir/sub/meson.build +++ b/test cases/java/2 subdir/sub/meson.build @@ -1,6 +1,5 @@ javaprog = jar('myprog', 'com/mesonbuild/Simple.java', 'com/mesonbuild/TextPrinter.java', - main_class : 'com.mesonbuild.Simple', - include_directories : include_directories('.')) + main_class : 'com.mesonbuild.Simple') test('subdirtest', javaprog) diff --git a/test cases/java/5 includedirs/meson.build b/test cases/java/5 includedirs/meson.build index 0b2942d..cf0b565 100644 --- a/test cases/java/5 includedirs/meson.build +++ b/test cases/java/5 includedirs/meson.build @@ -10,6 +10,5 @@ javaprog = jar('myprog', 'com/mesonbuild/TextPrinter.java', main_class : 'com.mesonbuild.Simple', include_directories : [ include_directories('com'), - include_directories('.'), include_directories('com/mesonbuild') ]) test('subdirtest', javaprog) diff --git a/test cases/java/6 codegen/com/mesonbuild/Config.java.in b/test cases/java/6 codegen/com/mesonbuild/Config.java.in new file mode 100644 index 0000000..fcc8811 --- /dev/null +++ b/test cases/java/6 codegen/com/mesonbuild/Config.java.in @@ -0,0 +1,5 @@ +package com.mesonbuild; + +public class Config { + public static final boolean FOOBAR = @foobar@; +} diff --git a/test cases/java/6 codegen/com/mesonbuild/Simple.java b/test cases/java/6 codegen/com/mesonbuild/Simple.java new file mode 100644 index 0000000..df3c53d --- /dev/null +++ b/test cases/java/6 codegen/com/mesonbuild/Simple.java @@ -0,0 +1,12 @@ +package com.mesonbuild; + +import com.mesonbuild.Config; + +class Simple { + public static void main(String [] args) { + if (Config.FOOBAR) { + TextPrinter t = new TextPrinter("Printing from Java."); + t.print(); + } + } +} diff --git a/test cases/java/6 codegen/com/mesonbuild/TextPrinter.java b/test cases/java/6 codegen/com/mesonbuild/TextPrinter.java new file mode 100644 index 0000000..7e330a6 --- /dev/null +++ b/test cases/java/6 codegen/com/mesonbuild/TextPrinter.java @@ -0,0 +1,14 @@ +package com.mesonbuild; + +class TextPrinter { + + private String msg; + + TextPrinter(String s) { + msg = s; + } + + public void print() { + System.out.println(msg); + } +} diff --git a/test cases/java/6 codegen/com/mesonbuild/meson.build b/test cases/java/6 codegen/com/mesonbuild/meson.build new file mode 100644 index 0000000..188bedf --- /dev/null +++ b/test cases/java/6 codegen/com/mesonbuild/meson.build @@ -0,0 +1,6 @@ + +conf_data = configuration_data() +conf_data.set('foobar', 'true') +config_file = configure_file(input : 'Config.java.in', + output : 'Config.java', + configuration : conf_data) diff --git a/test cases/java/6 codegen/meson.build b/test cases/java/6 codegen/meson.build new file mode 100644 index 0000000..f85d45a --- /dev/null +++ b/test cases/java/6 codegen/meson.build @@ -0,0 +1,15 @@ +# If we generate code under the build directory then the backend needs to add +# the build directory to the -sourcepath passed to javac otherwise the compiler +# won't be able to handle the -implicit:class behaviour of automatically +# compiling dependency classes. + +project('codegenjava', 'java') + +subdir('com/mesonbuild') + +javaprog = jar('myprog', + config_file, + 'com/mesonbuild/Simple.java', + 'com/mesonbuild/TextPrinter.java', + main_class : 'com.mesonbuild.Simple') +test('subdirtest', javaprog) diff --git a/test cases/java/6 no includedirs/com/mesonbuild/Simple.java b/test cases/java/6 no includedirs/com/mesonbuild/Simple.java deleted file mode 100644 index 05a73ac..0000000 --- a/test cases/java/6 no includedirs/com/mesonbuild/Simple.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.mesonbuild; - -class Simple { - public static void main(String [] args) { - TextPrinter t = new TextPrinter("Printing from Java."); - t.print(); - } -} diff --git a/test cases/java/6 no includedirs/com/mesonbuild/TextPrinter.java b/test cases/java/6 no includedirs/com/mesonbuild/TextPrinter.java deleted file mode 100644 index 7e330a6..0000000 --- a/test cases/java/6 no includedirs/com/mesonbuild/TextPrinter.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.mesonbuild; - -class TextPrinter { - - private String msg; - - TextPrinter(String s) { - msg = s; - } - - public void print() { - System.out.println(msg); - } -} diff --git a/test cases/java/6 no includedirs/meson.build b/test cases/java/6 no includedirs/meson.build deleted file mode 100644 index b399211..0000000 --- a/test cases/java/6 no includedirs/meson.build +++ /dev/null @@ -1,14 +0,0 @@ -# It used to be necessary to pass: -# -# include_directories: include_directories('.') -# -# to any use of jar() to compile source code with inter-file class -# dependencies. This is now the default behaviour. - -project('noincludedirsjava', 'java') - -javaprog = jar('myprog', - 'com/mesonbuild/Simple.java', - 'com/mesonbuild/TextPrinter.java', - main_class : 'com.mesonbuild.Simple') -test('subdirtest', javaprog) diff --git a/test cases/java/7 codegen/com/mesonbuild/Config.java.in b/test cases/java/7 codegen/com/mesonbuild/Config.java.in deleted file mode 100644 index fcc8811..0000000 --- a/test cases/java/7 codegen/com/mesonbuild/Config.java.in +++ /dev/null @@ -1,5 +0,0 @@ -package com.mesonbuild; - -public class Config { - public static final boolean FOOBAR = @foobar@; -} diff --git a/test cases/java/7 codegen/com/mesonbuild/Simple.java b/test cases/java/7 codegen/com/mesonbuild/Simple.java deleted file mode 100644 index df3c53d..0000000 --- a/test cases/java/7 codegen/com/mesonbuild/Simple.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.mesonbuild; - -import com.mesonbuild.Config; - -class Simple { - public static void main(String [] args) { - if (Config.FOOBAR) { - TextPrinter t = new TextPrinter("Printing from Java."); - t.print(); - } - } -} diff --git a/test cases/java/7 codegen/com/mesonbuild/TextPrinter.java b/test cases/java/7 codegen/com/mesonbuild/TextPrinter.java deleted file mode 100644 index 7e330a6..0000000 --- a/test cases/java/7 codegen/com/mesonbuild/TextPrinter.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.mesonbuild; - -class TextPrinter { - - private String msg; - - TextPrinter(String s) { - msg = s; - } - - public void print() { - System.out.println(msg); - } -} diff --git a/test cases/java/7 codegen/com/mesonbuild/meson.build b/test cases/java/7 codegen/com/mesonbuild/meson.build deleted file mode 100644 index 188bedf..0000000 --- a/test cases/java/7 codegen/com/mesonbuild/meson.build +++ /dev/null @@ -1,6 +0,0 @@ - -conf_data = configuration_data() -conf_data.set('foobar', 'true') -config_file = configure_file(input : 'Config.java.in', - output : 'Config.java', - configuration : conf_data) diff --git a/test cases/java/7 codegen/meson.build b/test cases/java/7 codegen/meson.build deleted file mode 100644 index f85d45a..0000000 --- a/test cases/java/7 codegen/meson.build +++ /dev/null @@ -1,15 +0,0 @@ -# If we generate code under the build directory then the backend needs to add -# the build directory to the -sourcepath passed to javac otherwise the compiler -# won't be able to handle the -implicit:class behaviour of automatically -# compiling dependency classes. - -project('codegenjava', 'java') - -subdir('com/mesonbuild') - -javaprog = jar('myprog', - config_file, - 'com/mesonbuild/Simple.java', - 'com/mesonbuild/TextPrinter.java', - main_class : 'com.mesonbuild.Simple') -test('subdirtest', javaprog) -- cgit v1.1