The Java module will serve as a source for easing Java development within Meson. Currently it only supports generating native header files.pull/9154/head
parent
cd9db63bfb
commit
be92e37837
11 changed files with 130 additions and 29 deletions
@ -0,0 +1,15 @@ |
|||||||
|
# Java Module |
||||||
|
|
||||||
|
*Added 0.60.0* |
||||||
|
|
||||||
|
## Functions |
||||||
|
|
||||||
|
### `generate_native_header()` |
||||||
|
|
||||||
|
This function will generate a header file for use in Java native module |
||||||
|
development by reading the supplied Java file for `native` method declarations. |
||||||
|
|
||||||
|
Keyword arguments: |
||||||
|
|
||||||
|
- `package`: The [package](https://en.wikipedia.org/wiki/Java_package) of the |
||||||
|
file. If left empty, Meson will assume that there is no package. |
@ -0,0 +1,18 @@ |
|||||||
|
## Java Module |
||||||
|
|
||||||
|
The Java module has been added to Meson. The Java module allows users to |
||||||
|
generate native header files without needing to use a `custom_target()`. |
||||||
|
|
||||||
|
```meson |
||||||
|
jmod = import('java') |
||||||
|
|
||||||
|
native_header = jmod.generate_native_header('File.java', package: 'com.mesonbuild') |
||||||
|
native_header_includes = include_directories('.') |
||||||
|
|
||||||
|
jdkjava = shared_module( |
||||||
|
'jdkjava', |
||||||
|
[native_header_includes, other_sources], |
||||||
|
dependencies : [jdk], |
||||||
|
include_directories : [native_header_includes] |
||||||
|
) |
||||||
|
``` |
@ -0,0 +1,76 @@ |
|||||||
|
# Copyright 2021 The Meson development team |
||||||
|
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
# you may not use this file except in compliance with the License. |
||||||
|
# You may obtain a copy of the License at |
||||||
|
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0 |
||||||
|
|
||||||
|
# Unless required by applicable law or agreed to in writing, software |
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
# See the License for the specific language governing permissions and |
||||||
|
# limitations under the License. |
||||||
|
|
||||||
|
import os |
||||||
|
import pathlib |
||||||
|
import typing as T |
||||||
|
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.interpreter.interpreterobjects import FileHolder |
||||||
|
from mesonbuild.mesonlib import version_compare, MachineChoice |
||||||
|
from . import ExtensionModule, ModuleReturnValue, ModuleState |
||||||
|
from ..interpreter import Interpreter |
||||||
|
|
||||||
|
class JavaModule(ExtensionModule): |
||||||
|
@FeatureNew('Java Module', '0.59.0') |
||||||
|
def __init__(self, interpreter: Interpreter): |
||||||
|
super().__init__(interpreter) |
||||||
|
self.methods.update({ |
||||||
|
'generate_native_header': self.generate_native_header, |
||||||
|
}) |
||||||
|
|
||||||
|
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'] |
||||||
|
|
||||||
|
@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( |
||||||
|
[a.held_object if isinstance(a, FileHolder) else a for a in args])[0] |
||||||
|
|
||||||
|
if package: |
||||||
|
header = f'{package.replace(".", "_")}_{pathlib.Path(file.fname).stem}.h' |
||||||
|
else: |
||||||
|
header = f'{pathlib.Path(file.fname).stem}.h' |
||||||
|
|
||||||
|
ct_kwargs = { |
||||||
|
'input': file, |
||||||
|
'output': header, |
||||||
|
'command': [ |
||||||
|
self.javac.exelist[0], |
||||||
|
'-d', |
||||||
|
'@PRIVATE_DIR@', |
||||||
|
'-h', |
||||||
|
state.subdir, |
||||||
|
'@INPUT@', |
||||||
|
] |
||||||
|
} |
||||||
|
|
||||||
|
target = CustomTarget(os.path.basename(header), state.subdir, state.subproject, backend=state.backend, kwargs=ct_kwargs) |
||||||
|
# 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) |
@ -1,21 +0,0 @@ |
|||||||
/* DO NOT EDIT THIS FILE - it is machine generated */ |
|
||||||
#include <jni.h> |
|
||||||
/* Header for class com_mesonbuild_JdkTest */ |
|
||||||
|
|
||||||
#ifndef _Included_com_mesonbuild_JdkTest |
|
||||||
#define _Included_com_mesonbuild_JdkTest |
|
||||||
#ifdef __cplusplus |
|
||||||
extern "C" { |
|
||||||
#endif |
|
||||||
/*
|
|
||||||
* Class: com_mesonbuild_JdkTest |
|
||||||
* Method: jdk_test |
|
||||||
* Signature: ()I |
|
||||||
*/ |
|
||||||
JNIEXPORT jint JNICALL Java_com_mesonbuild_JdkTest_jdk_1test |
|
||||||
(JNIEnv *, jclass); |
|
||||||
|
|
||||||
#ifdef __cplusplus |
|
||||||
} |
|
||||||
#endif |
|
||||||
#endif |
|
@ -0,0 +1,2 @@ |
|||||||
|
native_header = javamod.generate_native_header('JdkTest.java', package: 'com.mesonbuild') |
||||||
|
native_header_includes = include_directories('.') |
Loading…
Reference in new issue