summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJussi Pakkanen <jpakkane@gmail.com>2022-12-16 20:30:53 +0200
committerGitHub <noreply@github.com>2022-12-16 20:30:53 +0200
commit6c26cb96b8a34a583fca023effd31a397c7f106e (patch)
treec555d30bdac5e3e05296413e0d933b26db070280
parent2ef94a71f8072567e39f22bfed7bcae0ca2038c2 (diff)
parent71cddebf2c6093fe52de01329847926801f87f35 (diff)
downloadmeson-6c26cb96b8a34a583fca023effd31a397c7f106e.tar.gz
Merge pull request #11181 from tristan957/backends
JNISystemDependency fixes
-rw-r--r--mesonbuild/dependencies/dev.py44
-rwxr-xr-xrun_project_tests.py2
-rw-r--r--test cases/java/9 jni/meson.build6
3 files changed, 36 insertions, 16 deletions
diff --git a/mesonbuild/dependencies/dev.py b/mesonbuild/dependencies/dev.py
index 0c4690b47..cc0284272 100644
--- a/mesonbuild/dependencies/dev.py
+++ b/mesonbuild/dependencies/dev.py
@@ -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)])
@@ -597,13 +599,25 @@ 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():
diff --git a/run_project_tests.py b/run_project_tests.py
index 47acb2169..ce913f951 100755
--- a/run_project_tests.py
+++ b/run_project_tests.py
@@ -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'))),
diff --git a/test cases/java/9 jni/meson.build b/test cases/java/9 jni/meson.build
index 90a8485e5..7a6816591 100644
--- a/test cases/java/9 jni/meson.build
+++ b/test cases/java/9 jni/meson.build
@@ -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')