aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/modules/java.py
diff options
context:
space:
mode:
Diffstat (limited to 'mesonbuild/modules/java.py')
-rw-r--r--mesonbuild/modules/java.py47
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)