Merge pull request #11071 from tristan957/java-module

Java module 1.0.0 updates
pull/11159/head
Jussi Pakkanen 2 years ago committed by GitHub
commit 248c1d9bd5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 45
      docs/markdown/Java-module.md
  2. 4
      docs/markdown/snippets/java_native_headers.md
  3. 66
      mesonbuild/modules/java.py
  4. 2
      test cases/java/9 jni/src/com/mesonbuild/meson.build

@ -7,6 +7,7 @@
### `generate_native_header()`
*(deprecated in 0.62.0, use `generate_native_headers()`)*
*(removed in 1.0.0)*
This function will generate a header file for use in Java native module
development by reading the supplied Java file for `native` method declarations.
@ -19,6 +20,50 @@ file. If left empty, Meson will assume that there is no package.
### `generate_native_headers()`
*(added in 0.62.0)*
*(deprecated in 1.0.0, use `native_headers()`)*
This function will generate native header files for use in Java native module
development by reading the supplied Java files for `native` method declarations.
Keyword arguments:
- `classes`: The list of class names relative to the `package`, if it exists,
which contain `native` method declarations. Use `.` separated class names.
- `package`: The [package](https://en.wikipedia.org/wiki/Java_package) of the
file. If left empty, Meson will assume that there is no package.
Example:
```java
// Outer.java
package com.mesonbuild;
public class Outer {
private static native void outer();
public static class Inner {
private static native void inner();
}
}
```
With the above file, an invocation would look like the following:
```meson
java = import('java')
native_headers = java.generate_native_headers(
'Outer.java',
package: 'com.mesonbuild',
classes: ['Outer', 'Outer.Inner']
)
```
### `native_headers()`
*(added in 1.0.0)*
This function will generate native header files for use in Java native module
development by reading the supplied Java files for `native` method declarations.

@ -0,0 +1,4 @@
## Deprecate `java.generate_native_headers`, rename to `java.native_headers`
The functions operate in the exact same way. The new name matches more with
Meson function name styling.

@ -13,7 +13,6 @@
# limitations under the License.
from __future__ import annotations
import os
import pathlib
import typing as T
@ -23,6 +22,7 @@ from mesonbuild.compilers import detect_compiler_for
from mesonbuild.interpreterbase.decorators import ContainerTypeInfo, FeatureDeprecated, FeatureNew, KwargInfo, typed_pos_args, typed_kwargs
from mesonbuild.mesonlib import version_compare, MachineChoice
from . import NewExtensionModule, ModuleReturnValue, ModuleInfo
from ..interpreter.type_checking import NoneType
if T.TYPE_CHECKING:
from . import ModuleState
@ -36,8 +36,8 @@ class JavaModule(NewExtensionModule):
def __init__(self, interpreter: Interpreter):
super().__init__()
self.methods.update({
'generate_native_header': self.generate_native_header,
'generate_native_headers': self.generate_native_headers,
'native_headers': self.native_headers,
})
def __get_java_compiler(self, state: ModuleState) -> Compiler:
@ -45,59 +45,33 @@ class JavaModule(NewExtensionModule):
detect_compiler_for(state.environment, 'java', MachineChoice.BUILD)
return state.environment.coredata.compilers[MachineChoice.BUILD]['java']
@FeatureDeprecated('java.generate_native_header', '0.62.0', 'Use java.generate_native_headers instead')
@typed_pos_args('java.generate_native_header', (str, mesonlib.File))
@typed_kwargs('java.generate_native_header', KwargInfo('package', str, default=None))
def generate_native_header(self, state: ModuleState, args: T.Tuple[T.Union[str, mesonlib.File]],
kwargs: T.Dict[str, T.Optional[str]]) -> ModuleReturnValue:
package = kwargs.get('package')
if isinstance(args[0], mesonlib.File):
file = args[0]
else:
file = mesonlib.File.from_source_file(state.source_root, state.subdir, args[0])
if package:
header = f'{package.replace(".", "_")}_{pathlib.Path(file.fname).stem}.h'
else:
header = f'{pathlib.Path(file.fname).stem}.h'
javac = self.__get_java_compiler(state)
target = CustomTarget(
os.path.basename(header),
state.subdir,
state.subproject,
state.environment,
mesonlib.listify([
javac.exelist,
'-d',
'@PRIVATE_DIR@',
'-h',
state.subdir,
'@INPUT@',
]),
[file],
[header],
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(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])
@FeatureNew('java.generate_native_headers', '0.62.0')
@FeatureDeprecated('java.generate_native_headers', '1.0.0')
@typed_pos_args(
'java.generate_native_headers',
varargs=(str, mesonlib.File, Target, CustomTargetIndex, GeneratedList))
@typed_kwargs(
'java.generate_native_headers',
KwargInfo('classes', ContainerTypeInfo(list, str), default=[], listify=True, required=True),
KwargInfo('package', str, default=None))
KwargInfo('package', (str, NoneType), default=None))
def generate_native_headers(self, state: ModuleState, args: T.Tuple[T.List[mesonlib.FileOrString]],
kwargs: T.Dict[str, T.Optional[str]]) -> ModuleReturnValue:
return self.__native_headers(state, args, kwargs)
@FeatureNew('java.native_headers', '1.0.0')
@typed_pos_args(
'java.native_headers',
varargs=(str, mesonlib.File, Target, CustomTargetIndex, GeneratedList))
@typed_kwargs(
'java.native_headers',
KwargInfo('classes', ContainerTypeInfo(list, str), default=[], listify=True, required=True),
KwargInfo('package', (str, NoneType), default=None))
def native_headers(self, state: ModuleState, args: T.Tuple[T.List[mesonlib.FileOrString]],
kwargs: T.Dict[str, T.Optional[str]]) -> ModuleReturnValue:
return self.__native_headers(state, args, kwargs)
def __native_headers(self, state: ModuleState, args: T.Tuple[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')

@ -6,6 +6,6 @@ configured = configure_file(
sources += configured
native_headers = javamod.generate_native_headers(
native_headers = javamod.native_headers(
sources, package: 'com.mesonbuild', classes: ['JniTest'])
native_header_includes = include_directories('.')

Loading…
Cancel
Save