Merge pull request #11181 from tristan957/backends

JNISystemDependency fixes
pull/11186/head
Jussi Pakkanen 2 years ago committed by GitHub
commit 6c26cb96b8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 44
      mesonbuild/dependencies/dev.py
  2. 2
      run_project_tests.py
  3. 6
      test cases/java/9 jni/meson.build

@ -22,6 +22,7 @@ import os
import re
import pathlib
import shutil
import subprocess
import typing as T
from mesonbuild.interpreterbase.decorators import FeatureDeprecated
@ -546,6 +547,17 @@ class JNISystemDependency(SystemDependency):
self.java_home = environment.properties[self.for_machine].get_java_home()
if not self.java_home:
self.java_home = pathlib.Path(shutil.which(self.javac.exelist[0])).resolve().parents[1]
if m.is_darwin():
problem_java_prefix = pathlib.Path('/System/Library/Frameworks/JavaVM.framework/Versions')
if problem_java_prefix in self.java_home.parents:
res = subprocess.run(['/usr/libexec/java_home', '--failfast', '--arch', m.cpu_family],
stdout=subprocess.PIPE)
if res.returncode != 0:
log = mlog.error if self.required else mlog.debug
log('JAVA_HOME could not be discovered on the system. Please set it explicitly.')
self.is_found = False
return
self.java_home = pathlib.Path(res.stdout.decode().strip())
platform_include_dir = self.__machine_info_to_platform_include_dir(m)
if platform_include_dir is None:
@ -563,21 +575,11 @@ class JNISystemDependency(SystemDependency):
java_home_lib_server = java_home_lib
else:
if version_compare(self.version, '<= 1.8.0'):
# The JDK and Meson have a disagreement here, so translate it
# over. In the event more translation needs to be done, add to
# following dict.
def cpu_translate(cpu: str) -> str:
java_cpus = {
'x86_64': 'amd64',
}
return java_cpus.get(cpu, cpu)
java_home_lib = self.java_home / 'jre' / 'lib' / cpu_translate(m.cpu_family)
java_home_lib_server = java_home_lib / "server"
java_home_lib = self.java_home / 'jre' / 'lib' / self.__cpu_translate(m.cpu_family)
else:
java_home_lib = self.java_home / 'lib'
java_home_lib_server = java_home_lib / "server"
java_home_lib_server = java_home_lib / 'server'
if 'jvm' in modules:
jvm = self.clib_compiler.find_library('jvm', environment, extra_dirs=[str(java_home_lib_server)])
@ -596,14 +598,26 @@ class JNISystemDependency(SystemDependency):
self.is_found = True
@staticmethod
def __cpu_translate(cpu: str) -> str:
'''
The JDK and Meson have a disagreement here, so translate it over. In the event more
translation needs to be done, add to following dict.
'''
java_cpus = {
'x86_64': 'amd64',
}
return java_cpus.get(cpu, cpu)
@staticmethod
def __machine_info_to_platform_include_dir(m: 'MachineInfo') -> T.Optional[str]:
"""Translates the machine information to the platform-dependent include directory
'''Translates the machine information to the platform-dependent include directory
When inspecting a JDK release tarball or $JAVA_HOME, inside the `include/` directory is a
platform-dependent directory that must be on the target's include path in addition to the
parent `include/` directory.
"""
'''
if m.is_linux():
return 'linux'
elif m.is_windows():

@ -1091,7 +1091,7 @@ def detect_tests_to_run(only: T.Dict[str, T.List[str]], use_tmp: bool) -> T.List
TestCategory('platform-osx', 'osx', not mesonlib.is_osx()),
TestCategory('platform-windows', 'windows', not mesonlib.is_windows() and not mesonlib.is_cygwin()),
TestCategory('platform-linux', 'linuxlike', mesonlib.is_osx() or mesonlib.is_windows()),
TestCategory('java', 'java', backend is not Backend.ninja or mesonlib.is_osx() or not have_java()),
TestCategory('java', 'java', backend is not Backend.ninja or not have_java()),
TestCategory('C#', 'csharp', skip_csharp(backend)),
TestCategory('vala', 'vala', backend is not Backend.ninja or not shutil.which(os.environ.get('VALAC', 'valac'))),
TestCategory('cython', 'cython', backend is not Backend.ninja or not shutil.which(os.environ.get('CYTHON', 'cython'))),

@ -11,10 +11,16 @@ endif
fs = import('fs')
javamod = import('java')
cc = meson.get_compiler('c')
java = find_program('java')
jni_dep = dependency('jni', version : '>=1.8', modules: ['jvm', 'awt'])
# Assert that the header can actually be found with the dependency.
cc.has_header('jni.h', dependencies: [jni_dep])
# Assert that the platform-specific include directory is included in the compiler arguments.
cc.has_header('jni_md.h', dependencies: [jni_dep])
# generate native headers
subdir('src')
subdir('lib')

Loading…
Cancel
Save