diff options
author | Tristan Partin <tristan@partin.io> | 2022-01-26 02:01:52 -0600 |
---|---|---|
committer | Dylan Baker <dylan@pnwbakers.com> | 2022-03-01 13:18:50 -0800 |
commit | 18147b91ff33d0ec03bfb04205d54316070c3fc8 (patch) | |
tree | 4cf7562e30c6ef898c21cd6564ace2986a4371f7 /mesonbuild | |
parent | 7702d46dd1fa1c57b1d16f407e80061191cbdfa0 (diff) | |
download | meson-18147b91ff33d0ec03bfb04205d54316070c3fc8.zip meson-18147b91ff33d0ec03bfb04205d54316070c3fc8.tar.gz meson-18147b91ff33d0ec03bfb04205d54316070c3fc8.tar.bz2 |
Deprecate java.generate_native_header() in favor of java.generate_native_headers()
After implementing a much more extensive Java native module than what
currently exists in the tests, I found shortcomings.
1. You need to be able to pass multiple Java files.
2. Meson needs more information to better track the generated native
headers.
3. Meson wasn't tracking the header files generated from inner classes.
This new function should fix all the issues the old function had with
room to grow should more functionality need to be added. What I
implemented here in this new function is essentially what I have done in
the Heterogeneous-Memory Storage Engine's Java bindings.
Diffstat (limited to 'mesonbuild')
-rw-r--r-- | mesonbuild/modules/java.py | 47 |
1 files changed, 44 insertions, 3 deletions
diff --git a/mesonbuild/modules/java.py b/mesonbuild/modules/java.py index 20cf3fd..dc660a7 100644 --- a/mesonbuild/modules/java.py +++ b/mesonbuild/modules/java.py @@ -15,9 +15,10 @@ import os import pathlib import typing as T +from mesonbuild import mesonlib from mesonbuild.build import CustomTarget from mesonbuild.compilers import detect_compiler_for -from mesonbuild.interpreterbase.decorators import FeatureNew, KwargInfo, typed_pos_args, typed_kwargs +from mesonbuild.interpreterbase.decorators import ContainerTypeInfo, FeatureDeprecated, FeatureNew, KwargInfo, typed_pos_args, typed_kwargs from mesonbuild.interpreter.interpreterobjects import FileHolder from mesonbuild.mesonlib import version_compare, MachineChoice from . import ExtensionModule, ModuleReturnValue, ModuleState @@ -29,18 +30,18 @@ class JavaModule(ExtensionModule): super().__init__(interpreter) self.methods.update({ 'generate_native_header': self.generate_native_header, + 'generate_native_headers': self.generate_native_headers, }) if 'java' not in interpreter.environment.coredata.compilers[MachineChoice.BUILD]: detect_compiler_for(interpreter.environment, 'java', MachineChoice.BUILD) self.javac = interpreter.environment.coredata.compilers[MachineChoice.BUILD]['java'] + @FeatureDeprecated('java.generate_native_header', '0.62.0', 'Use java.generate_native_headers instead') @typed_pos_args('generate_native_header', (str, FileHolder)) @typed_kwargs('java.generate_native_header', KwargInfo('package', str, default=None)) def generate_native_header(self, state: ModuleState, args: T.Tuple[T.Union[str, FileHolder]], kwargs: T.Dict[str, T.Optional[str]]) -> ModuleReturnValue: - assert state.backend - package = kwargs.get('package') file = self.interpreter.source_strings_to_files( @@ -74,5 +75,45 @@ class JavaModule(ExtensionModule): return ModuleReturnValue(target, [target]) + @FeatureNew('java.generate_native_headers', '0.62.0') + @typed_pos_args('generate_native_headers', (str, mesonlib.File), min_varargs=1) + @typed_kwargs('java.generate_native_headers', + KwargInfo('classes', (ContainerTypeInfo(list, str)), default=[], listify=True, + required=True), + KwargInfo('package', str, default=None)) + def generate_native_headers(self, state: ModuleState, args: T.List[mesonlib.FileOrString], + kwargs: T.Dict[str, T.Optional[str]]) -> ModuleReturnValue: + classes = T.cast(T.List[str], kwargs.get('classes')) + package = kwargs.get('package') + + headers: T.List[str] = [] + for clazz in classes: + underscore_clazz = clazz.replace(".", "_") + if package: + headers.append(f'{package.replace(".", "_")}_{underscore_clazz}.h') + else: + headers.append(f'{underscore_clazz}.h') + + command = mesonlib.listify([ + self.javac.exelist, + '-d', + '@PRIVATE_DIR@', + '-h', + state.subdir, + '@INPUT@', + ]) + + prefix = classes[0] if not package else package + + target = CustomTarget(f'{prefix}-native-headers', state.subdir, state.subproject, command, + sources=list(args), outputs=headers, backend=state.backend) + + # It is only known that 1.8.0 won't pre-create the directory. 11 and 16 + # do not exhibit this behavior. + if version_compare(self.javac.version, '1.8.0'): + pathlib.Path(state.backend.get_target_private_dir_abs(target)).mkdir(parents=True, exist_ok=True) + + return ModuleReturnValue(target, [target]) + def initialize(*args: T.Any, **kwargs: T.Any) -> JavaModule: return JavaModule(*args, **kwargs) |