Skip to content

Commit 20f1546

Browse files
authored
Merge 4a17c8f into 17c0a7f
2 parents 17c0a7f + 4a17c8f commit 20f1546

File tree

4 files changed

+70
-47
lines changed

4 files changed

+70
-47
lines changed

docs/markdown/Java-module.md

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
### `generate_native_header()`
88

99
*(deprecated in 0.62.0, use `generate_native_headers()`)*
10+
*(removed in 1.0.0)*
1011

1112
This function will generate a header file for use in Java native module
1213
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.
1920
### `generate_native_headers()`
2021

2122
*(added in 0.62.0)*
23+
*(deprecated in 1.0.0, use `native_headers()`)*
24+
25+
This function will generate native header files for use in Java native module
26+
development by reading the supplied Java files for `native` method declarations.
27+
28+
Keyword arguments:
29+
30+
- `classes`: The list of class names relative to the `package`, if it exists,
31+
which contain `native` method declarations. Use `.` separated class names.
32+
33+
- `package`: The [package](https://en.wikipedia.org/wiki/Java_package) of the
34+
file. If left empty, Meson will assume that there is no package.
35+
36+
Example:
37+
38+
```java
39+
// Outer.java
40+
41+
package com.mesonbuild;
42+
43+
public class Outer {
44+
private static native void outer();
45+
46+
public static class Inner {
47+
private static native void inner();
48+
}
49+
}
50+
```
51+
52+
With the above file, an invocation would look like the following:
53+
54+
```meson
55+
java = import('java')
56+
57+
native_headers = java.generate_native_headers(
58+
'Outer.java',
59+
package: 'com.mesonbuild',
60+
classes: ['Outer', 'Outer.Inner']
61+
)
62+
```
63+
64+
### `native_headers()`
65+
66+
*(added in 1.0.0)*
2267

2368
This function will generate native header files for use in Java native module
2469
development by reading the supplied Java files for `native` method declarations.
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
## Deprecate `java.generate_native_headers`, rename to `java.native_headers`
2+
3+
The functions operate in the exact same way. The new name matches more with
4+
Meson function name styling.

mesonbuild/modules/java.py

Lines changed: 20 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
# limitations under the License.
1414
from __future__ import annotations
1515

16-
import os
1716
import pathlib
1817
import typing as T
1918

@@ -23,6 +22,7 @@
2322
from mesonbuild.interpreterbase.decorators import ContainerTypeInfo, FeatureDeprecated, FeatureNew, KwargInfo, typed_pos_args, typed_kwargs
2423
from mesonbuild.mesonlib import version_compare, MachineChoice
2524
from . import NewExtensionModule, ModuleReturnValue, ModuleInfo
25+
from ..interpreter.type_checking import NoneType
2626

2727
if T.TYPE_CHECKING:
2828
from . import ModuleState
@@ -36,68 +36,42 @@ class JavaModule(NewExtensionModule):
3636
def __init__(self, interpreter: Interpreter):
3737
super().__init__()
3838
self.methods.update({
39-
'generate_native_header': self.generate_native_header,
4039
'generate_native_headers': self.generate_native_headers,
40+
'native_headers': self.native_headers,
4141
})
4242

4343
def __get_java_compiler(self, state: ModuleState) -> Compiler:
4444
if 'java' not in state.environment.coredata.compilers[MachineChoice.BUILD]:
4545
detect_compiler_for(state.environment, 'java', MachineChoice.BUILD)
4646
return state.environment.coredata.compilers[MachineChoice.BUILD]['java']
4747

48-
@FeatureDeprecated('java.generate_native_header', '0.62.0', 'Use java.generate_native_headers instead')
49-
@typed_pos_args('java.generate_native_header', (str, mesonlib.File))
50-
@typed_kwargs('java.generate_native_header', KwargInfo('package', str, default=None))
51-
def generate_native_header(self, state: ModuleState, args: T.Tuple[T.Union[str, mesonlib.File]],
52-
kwargs: T.Dict[str, T.Optional[str]]) -> ModuleReturnValue:
53-
package = kwargs.get('package')
54-
55-
if isinstance(args[0], mesonlib.File):
56-
file = args[0]
57-
else:
58-
file = mesonlib.File.from_source_file(state.source_root, state.subdir, args[0])
59-
60-
if package:
61-
header = f'{package.replace(".", "_")}_{pathlib.Path(file.fname).stem}.h'
62-
else:
63-
header = f'{pathlib.Path(file.fname).stem}.h'
64-
65-
javac = self.__get_java_compiler(state)
66-
67-
target = CustomTarget(
68-
os.path.basename(header),
69-
state.subdir,
70-
state.subproject,
71-
state.environment,
72-
mesonlib.listify([
73-
javac.exelist,
74-
'-d',
75-
'@PRIVATE_DIR@',
76-
'-h',
77-
state.subdir,
78-
'@INPUT@',
79-
]),
80-
[file],
81-
[header],
82-
backend=state.backend,
83-
)
84-
# It is only known that 1.8.0 won't pre-create the directory. 11 and 16
85-
# do not exhibit this behavior.
86-
if version_compare(javac.version, '1.8.0'):
87-
pathlib.Path(state.backend.get_target_private_dir_abs(target)).mkdir(parents=True, exist_ok=True)
88-
89-
return ModuleReturnValue(target, [target])
90-
9148
@FeatureNew('java.generate_native_headers', '0.62.0')
49+
@FeatureDeprecated('java.generate_native_headers', '1.0.0')
9250
@typed_pos_args(
9351
'java.generate_native_headers',
9452
varargs=(str, mesonlib.File, Target, CustomTargetIndex, GeneratedList))
9553
@typed_kwargs(
9654
'java.generate_native_headers',
9755
KwargInfo('classes', ContainerTypeInfo(list, str), default=[], listify=True, required=True),
98-
KwargInfo('package', str, default=None))
56+
KwargInfo('package', (str, NoneType), default=None))
9957
def generate_native_headers(self, state: ModuleState, args: T.Tuple[T.List[mesonlib.FileOrString]],
10058
kwargs: T.Dict[str, T.Optional[str]]) -> ModuleReturnValue:
59+
return self.__native_headers(state, args, kwargs)
60+
61+
@FeatureNew('java.native_headers', '1.0.0')
62+
@typed_pos_args(
63+
'java.native_headers',
64+
varargs=(str, mesonlib.File, Target, CustomTargetIndex, GeneratedList))
65+
@typed_kwargs(
66+
'java.native_headers',
67+
KwargInfo('classes', ContainerTypeInfo(list, str), default=[], listify=True, required=True),
68+
KwargInfo('package', (str, NoneType), default=None))
69+
def native_headers(self, state: ModuleState, args: T.Tuple[T.List[mesonlib.FileOrString]],
70+
kwargs: T.Dict[str, T.Optional[str]]) -> ModuleReturnValue:
71+
return self.__native_headers(state, args, kwargs)
72+
73+
def __native_headers(self, state: ModuleState, args: T.Tuple[T.List[mesonlib.FileOrString]],
74+
kwargs: T.Dict[str, T.Optional[str]]) -> ModuleReturnValue:
10175
classes = T.cast('T.List[str]', kwargs.get('classes'))
10276
package = kwargs.get('package')
10377

test cases/java/9 jni/src/com/mesonbuild/meson.build

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,6 @@ configured = configure_file(
66

77
sources += configured
88

9-
native_headers = javamod.generate_native_headers(
9+
native_headers = javamod.native_headers(
1010
sources, package: 'com.mesonbuild', classes: ['JniTest'])
1111
native_header_includes = include_directories('.')

0 commit comments

Comments
 (0)