diff --git a/mesonbuild/dependencies/dev.py b/mesonbuild/dependencies/dev.py index 448d68291..732ac8c7c 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,17 +575,7 @@ 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 = self.java_home / 'jre' / 'lib' / self.__cpu_translate(m.cpu_family) else: java_home_lib = self.java_home / 'lib' @@ -596,6 +598,18 @@ 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 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')