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()` ### `generate_native_header()`
*(deprecated in 0.62.0, use `generate_native_headers()`)* *(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 This function will generate a header file for use in Java native module
development by reading the supplied Java file for `native` method declarations. 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()` ### `generate_native_headers()`
*(added in 0.62.0)* *(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 This function will generate native header files for use in Java native module
development by reading the supplied Java files for `native` method declarations. 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. # limitations under the License.
from __future__ import annotations from __future__ import annotations
import os
import pathlib import pathlib
import typing as T 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.interpreterbase.decorators import ContainerTypeInfo, FeatureDeprecated, FeatureNew, KwargInfo, typed_pos_args, typed_kwargs
from mesonbuild.mesonlib import version_compare, MachineChoice from mesonbuild.mesonlib import version_compare, MachineChoice
from . import NewExtensionModule, ModuleReturnValue, ModuleInfo from . import NewExtensionModule, ModuleReturnValue, ModuleInfo
from ..interpreter.type_checking import NoneType
if T.TYPE_CHECKING: if T.TYPE_CHECKING:
from . import ModuleState from . import ModuleState
@ -36,8 +36,8 @@ class JavaModule(NewExtensionModule):
def __init__(self, interpreter: Interpreter): def __init__(self, interpreter: Interpreter):
super().__init__() super().__init__()
self.methods.update({ self.methods.update({
'generate_native_header': self.generate_native_header,
'generate_native_headers': self.generate_native_headers, 'generate_native_headers': self.generate_native_headers,
'native_headers': self.native_headers,
}) })
def __get_java_compiler(self, state: ModuleState) -> Compiler: def __get_java_compiler(self, state: ModuleState) -> Compiler:
@ -45,59 +45,33 @@ class JavaModule(NewExtensionModule):
detect_compiler_for(state.environment, 'java', MachineChoice.BUILD) detect_compiler_for(state.environment, 'java', MachineChoice.BUILD)
return state.environment.coredata.compilers[MachineChoice.BUILD]['java'] 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') @FeatureNew('java.generate_native_headers', '0.62.0')
@FeatureDeprecated('java.generate_native_headers', '1.0.0')
@typed_pos_args( @typed_pos_args(
'java.generate_native_headers', 'java.generate_native_headers',
varargs=(str, mesonlib.File, Target, CustomTargetIndex, GeneratedList)) varargs=(str, mesonlib.File, Target, CustomTargetIndex, GeneratedList))
@typed_kwargs( @typed_kwargs(
'java.generate_native_headers', 'java.generate_native_headers',
KwargInfo('classes', ContainerTypeInfo(list, str), default=[], listify=True, required=True), 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]], def generate_native_headers(self, state: ModuleState, args: T.Tuple[T.List[mesonlib.FileOrString]],
kwargs: T.Dict[str, T.Optional[str]]) -> ModuleReturnValue: 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')) classes = T.cast('T.List[str]', kwargs.get('classes'))
package = kwargs.get('package') package = kwargs.get('package')

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

Loading…
Cancel
Save