From 31abe6c20100c318ad9d3e5117c0e3db0f34ad79 Mon Sep 17 00:00:00 2001 From: djh <1810493+djh82@users.noreply.github.com> Date: Fri, 13 Jan 2023 15:02:15 +0000 Subject: feat: adds JAVAPROCESSORPATH construction variable; updates JavaScanner to scan JAVAPROCESSORPATH --- CHANGES.txt | 4 ++ SCons/Scanner/Java.py | 9 ++-- SCons/Scanner/JavaTests.py | 64 ++++++++++++++++++++++++++++ SCons/Tool/javac.py | 4 +- SCons/Tool/javac.xml | 25 +++++++++++ test/Java/JAVAPROCESSORPATH.py | 95 ++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 196 insertions(+), 5 deletions(-) create mode 100644 test/Java/JAVAPROCESSORPATH.py diff --git a/CHANGES.txt b/CHANGES.txt index ecc82a4..55cf185 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -42,6 +42,10 @@ RELEASE VERSION/DATE TO BE FILLED IN LATER command lines using the generated tempfile for long command lines, instead of the full command line for the compilation step for the source/target pair. + From David H: + - Added JAVAPROCESSORPATH construction variable which populates -processorpath. + - Updated JavaScanner to scan JAVAPROCESSORPATH. + From Dan Mezhiborsky: - Add newline to end of compilation db (compile_commands.json). diff --git a/SCons/Scanner/Java.py b/SCons/Scanner/Java.py index 8c31bc1..e6c2db9 100644 --- a/SCons/Scanner/Java.py +++ b/SCons/Scanner/Java.py @@ -59,9 +59,9 @@ def _collect_classes(classlist, dirname, files): def scan(node, env, libpath=()) -> list: - """Scan for files on the JAVACLASSPATH. + """Scan for files both on JAVACLASSPATH and JAVAPROCESSORPATH. - JAVACLASSPATH path can contain: + JAVACLASSPATH/JAVAPROCESSORPATH path can contain: - Explicit paths to JAR/Zip files - Wildcards (*) - Directories which contain classes in an unnamed package @@ -70,8 +70,9 @@ def scan(node, env, libpath=()) -> list: Class path entries that are neither directories nor archives (.zip or JAR files) nor the asterisk (*) wildcard character are ignored. """ - classpath = env.get('JAVACLASSPATH', []) - classpath = _subst_paths(env, classpath) + classpath = [] + for var in ['JAVACLASSPATH', 'JAVAPROCESSORPATH']: + classpath += _subst_paths(env, env.get(var, [])) result = [] for path in classpath: diff --git a/SCons/Scanner/JavaTests.py b/SCons/Scanner/JavaTests.py index 77cd560..faa0c49 100644 --- a/SCons/Scanner/JavaTests.py +++ b/SCons/Scanner/JavaTests.py @@ -179,6 +179,70 @@ class JavaScannerSearchPathClasspath(unittest.TestCase): deps_match(self, deps, expected) +class JavaScannerEmptyProcessorpath(unittest.TestCase): + def runTest(self): + path = [] + env = DummyEnvironment(JAVASUFFIXES=['.java'], JAVAPROCESSORPATH=path) + s = SCons.Scanner.Java.JavaScanner() + deps = s(DummyNode('dummy'), env) + expected = [] + deps_match(self, deps, expected) + + +class JavaScannerProcessorpath(unittest.TestCase): + def runTest(self): + env = DummyEnvironment(JAVASUFFIXES=['.java'], + JAVAPROCESSORPATH=[test.workpath('classpath.jar')]) + s = SCons.Scanner.Java.JavaScanner() + deps = s(DummyNode('dummy'), env) + expected = ['classpath.jar'] + deps_match(self, deps, expected) + + +class JavaScannerWildcardProcessorpath(unittest.TestCase): + def runTest(self): + env = DummyEnvironment(JAVASUFFIXES=['.java'], + JAVAPROCESSORPATH=[test.workpath('*')]) + s = SCons.Scanner.Java.JavaScanner() + deps = s(DummyNode('dummy'), env) + expected = ['bootclasspath.jar', 'classpath.jar', 'Test.class'] + deps_match(self, deps, expected) + + +class JavaScannerDirProcessorpath(unittest.TestCase): + def runTest(self): + env = DummyEnvironment(JAVASUFFIXES=['.java'], + JAVAPROCESSORPATH=[test.workpath()]) + s = SCons.Scanner.Java.JavaScanner() + deps = s(DummyNode('dummy'), env) + expected = ['Test.class', 'com/Test.class', 'java space/Test.class'] + deps_match(self, deps, expected) + + +class JavaScannerNamedDirProcessorpath(unittest.TestCase): + def runTest(self): + env = DummyEnvironment( + JAVASUFFIXES=['.java'], + JAVAPROCESSORPATH=[test.workpath('com'), test.workpath('java space')], + ) + s = SCons.Scanner.Java.JavaScanner() + deps = s(DummyNode('dummy'), env) + expected = ['com/Test.class', 'java space/Test.class'] + deps_match(self, deps, expected) + + +class JavaScannerSearchPathProcessorpath(unittest.TestCase): + def runTest(self): + env = DummyEnvironment( + JAVASUFFIXES=['.java'], + JAVAPROCESSORPATH=os.pathsep.join([test.workpath('com'), test.workpath('java space')]), + ) + s = SCons.Scanner.Java.JavaScanner() + deps = s(DummyNode('dummy'), env) + expected = ['com/Test.class', 'java space/Test.class'] + deps_match(self, deps, expected) + + if __name__ == "__main__": unittest.main() diff --git a/SCons/Tool/javac.py b/SCons/Tool/javac.py index 9e18964..1b33125 100644 --- a/SCons/Tool/javac.py +++ b/SCons/Tool/javac.py @@ -231,13 +231,15 @@ def generate(env): JAVABOOTCLASSPATH=[], JAVACLASSPATH=[], JAVASOURCEPATH=[], + JAVAPROCESSORPATH=[], ) env['_javapathopt'] = pathopt env['_JAVABOOTCLASSPATH'] = '${_javapathopt("-bootclasspath", "JAVABOOTCLASSPATH")} ' + env['_JAVAPROCESSORPATH'] = '${_javapathopt("-processorpath", "JAVAPROCESSORPATH")} ' env['_JAVACLASSPATH'] = '${_javapathopt("-classpath", "JAVACLASSPATH")} ' env['_JAVASOURCEPATH'] = '${_javapathopt("-sourcepath", "JAVASOURCEPATH", "_JAVASOURCEPATHDEFAULT")} ' env['_JAVASOURCEPATHDEFAULT'] = '${TARGET.attributes.java_sourcedir}' - env['_JAVACCOM'] = '$JAVAC $JAVACFLAGS $_JAVABOOTCLASSPATH $_JAVACLASSPATH -d ${TARGET.attributes.java_classdir} $_JAVASOURCEPATH $SOURCES' + env['_JAVACCOM'] = '$JAVAC $JAVACFLAGS $_JAVABOOTCLASSPATH $_JAVAPROCESSORPATH $_JAVACLASSPATH -d ${TARGET.attributes.java_classdir} $_JAVASOURCEPATH $SOURCES' env['JAVACCOM'] = "${TEMPFILE('$_JAVACCOM','$JAVACCOMSTR')}" def exists(env): diff --git a/SCons/Tool/javac.xml b/SCons/Tool/javac.xml index 014d905..9001e64 100644 --- a/SCons/Tool/javac.xml +++ b/SCons/Tool/javac.xml @@ -152,6 +152,31 @@ env['ENV']['LANG'] = 'en_GB.UTF-8' + + + + Specifies the location of the annotation processor class files. + Can be specified as a string or Node object, + or as a list of strings or Node objects. + + + The value will be added to the JDK command lines + via the option, + which requires a system-specific search path separator. + This will be supplied by &SCons; as needed when it + constructs the command line if &cv-JAVAPROCESSORPATH; is + provided in list form. + If &cv-JAVAPROCESSORPATH; is a single string containing + search path separator characters + (: for POSIX systems or + ; for Windows), it will not be modified; + and so is inherently system-specific; + to supply the path in a system-independent manner, + give &cv-JAVAPROCESSORPATH; as a list of paths instead. + + + + diff --git a/test/Java/JAVAPROCESSORPATH.py b/test/Java/JAVAPROCESSORPATH.py new file mode 100644 index 0000000..2b8f04d --- /dev/null +++ b/test/Java/JAVAPROCESSORPATH.py @@ -0,0 +1,95 @@ +#!/usr/bin/env python +# +# MIT License +# +# Copyright The SCons Foundation +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +""" +Verify that use of $JAVAPROCESSORPATH sets the -processorpath option +on javac compilations. +""" + +import os + +import TestSCons + +test = TestSCons.TestSCons() + +where_javac, java_version = test.java_where_javac() + +test.write('SConstruct', """ +DefaultEnvironment(tools=[]) +env = Environment(tools=['javac'], JAVAPROCESSORPATH=['dir1', 'dir2']) +j1 = env.Java(target='class', source='com/Example1.java') +j2 = env.Java(target='class', source='com/Example2.java') +""") + +test.subdir('com') + +test.write(['com', 'Example1.java'], """\ +package com; + +public class Example1 +{ + + public static void main(String[] args) + { + + } + +} +""") + +test.write(['com', 'Example2.java'], """\ +package com; + +public class Example2 +{ + + public static void main(String[] args) + { + + } + +} +""") + +# Setting -processorpath messes with the Java runtime environment, so +# we'll just take the easy way out and examine the -n output to see if +# the expected option shows up on the command line. + +processorpath = os.pathsep.join(['dir1', 'dir2']) + +expect = """\ +javac -processorpath %(processorpath)s -d class -sourcepath com com.Example1\\.java +javac -processorpath %(processorpath)s -d class -sourcepath com com.Example2\\.java +""" % locals() + +test.run(arguments = '-Q -n .', stdout = expect, match=TestSCons.match_re) + +test.pass_test() + +# Local Variables: +# tab-width:4 +# indent-tabs-mode:nil +# End: +# vim: set expandtab tabstop=4 shiftwidth=4: -- cgit v0.12 From 20614c573806d5c651d772bec7767f50d16645c3 Mon Sep 17 00:00:00 2001 From: William Deegan Date: Mon, 16 Jan 2023 18:37:52 -0500 Subject: [ci skip] Add notation that JAVAPROCESSORPATH is new in version 4.5.0 (The next planned release version string) --- SCons/Tool/javac.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/SCons/Tool/javac.xml b/SCons/Tool/javac.xml index 9001e64..6f48356 100644 --- a/SCons/Tool/javac.xml +++ b/SCons/Tool/javac.xml @@ -174,6 +174,9 @@ env['ENV']['LANG'] = 'en_GB.UTF-8' to supply the path in a system-independent manner, give &cv-JAVAPROCESSORPATH; as a list of paths instead. + + New in version 4.5.0 + -- cgit v0.12