aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild
diff options
context:
space:
mode:
authorTristan Partin <tristan@partin.io>2021-01-20 21:46:55 -0600
committerDylan Baker <dylan@pnwbakers.com>2021-04-12 10:43:11 -0700
commit4c13aa30a1714b1fdbebb465f4621f332e241505 (patch)
treebf6d41521b02a024a8cd24cf10ef75e57d38a57d /mesonbuild
parent50cf8bcabaa2a9b1ae37c071c7c5f4afd47af4d0 (diff)
downloadmeson-4c13aa30a1714b1fdbebb465f4621f332e241505.zip
meson-4c13aa30a1714b1fdbebb465f4621f332e241505.tar.gz
meson-4c13aa30a1714b1fdbebb465f4621f332e241505.tar.bz2
dependency: Add JDK system dependency
The JDK system dependency is important for detecting JDK include paths that may be useful when developing a JNI interface.
Diffstat (limited to 'mesonbuild')
-rw-r--r--mesonbuild/dependencies/__init__.py5
-rw-r--r--mesonbuild/dependencies/dev.py56
-rw-r--r--mesonbuild/envconfig.py12
-rw-r--r--mesonbuild/environment.py5
4 files changed, 71 insertions, 7 deletions
diff --git a/mesonbuild/dependencies/__init__.py b/mesonbuild/dependencies/__init__.py
index afd4adc..722ede4 100644
--- a/mesonbuild/dependencies/__init__.py
+++ b/mesonbuild/dependencies/__init__.py
@@ -21,7 +21,9 @@ from .base import ( # noqa: F401
InternalDependency, PkgConfigDependency, CMakeDependency,
find_external_dependency, get_dep_identifier, packages,
_packages_accept_language, DependencyFactory)
-from .dev import ValgrindDependency, gmock_factory, gtest_factory, llvm_factory, zlib_factory
+from .dev import (
+ ValgrindDependency, JDKSystemDependency, gmock_factory, gtest_factory,
+ llvm_factory, zlib_factory)
from .coarrays import coarray_factory
from .mpi import mpi_factory
from .scalapack import scalapack_factory
@@ -196,6 +198,7 @@ packages.update({
'llvm': llvm_factory,
'valgrind': ValgrindDependency,
'zlib': zlib_factory,
+ 'jdk': JDKSystemDependency,
'boost': BoostDependency,
'cuda': CudaDependency,
diff --git a/mesonbuild/dependencies/dev.py b/mesonbuild/dependencies/dev.py
index 2ac91b1..e9181bd 100644
--- a/mesonbuild/dependencies/dev.py
+++ b/mesonbuild/dependencies/dev.py
@@ -18,6 +18,8 @@
import glob
import os
import re
+import pathlib
+import shutil
import typing as T
from .. import mesonlib, mlog
@@ -32,6 +34,7 @@ from ..compilers.c import AppleClangCCompiler
from ..compilers.cpp import AppleClangCPPCompiler
if T.TYPE_CHECKING:
+ from ..envconfig import MachineInfo
from .. environment import Environment
@@ -505,6 +508,59 @@ class ZlibSystemDependency(ExternalDependency):
return [DependencyMethods.SYSTEM]
+class JDKSystemDependency(ExternalDependency):
+ def __init__(self, environment: 'Environment', kwargs: T.Dict[str, T.Any]):
+ super().__init__('jdk', environment, kwargs)
+
+ m = self.env.machines[self.for_machine]
+
+ if 'java' not in environment.coredata.compilers[self.for_machine]:
+ environment.detect_compiler_for('java', self.for_machine)
+ self.javac = environment.coredata.compilers[self.for_machine]['java']
+ self.version = self.javac.version
+
+ if 'version' in kwargs and not version_compare(self.version, kwargs['version']):
+ mlog.error(f'Incorrect JDK version found ({self.version}), wanted {kwargs["version"]}')
+ self.is_found = False
+ return
+
+ 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]
+
+ platform_include_dir = self.__machine_info_to_platform_include_dir(m)
+ if platform_include_dir is None:
+ mlog.error("Could not find a JDK platform include directory for your OS, please open an issue or provide a pull request.")
+ self.is_found = False
+ return
+
+ java_home_include = self.java_home / 'include'
+ self.compile_args.append(f'-I{java_home_include}')
+ self.compile_args.append(f'-I{java_home_include / platform_include_dir}')
+ self.is_found = True
+
+ @staticmethod
+ def get_methods() -> T.List[DependencyMethods]:
+ return [DependencyMethods.SYSTEM]
+
+ @staticmethod
+ def __machine_info_to_platform_include_dir(m: 'MachineInfo') -> T.Optional[str]:
+ """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 folder 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():
+ return 'win32'
+ elif m.is_darwin():
+ return 'darwin'
+
+ return None
+
+
llvm_factory = DependencyFactory(
'LLVM',
[DependencyMethods.CMAKE, DependencyMethods.CONFIG_TOOL],
diff --git a/mesonbuild/envconfig.py b/mesonbuild/envconfig.py
index f2792c5..c6a4df3 100644
--- a/mesonbuild/envconfig.py
+++ b/mesonbuild/envconfig.py
@@ -136,9 +136,9 @@ class CMakeSkipCompilerTest(Enum):
class Properties:
def __init__(
self,
- properties: T.Optional[T.Dict[str, T.Union[str, bool, int, T.List[str]]]] = None,
+ properties: T.Optional[T.Dict[str, T.Optional[T.Union[str, bool, int, T.List[str]]]]] = None,
):
- self.properties = properties or {} # type: T.Dict[str, T.Union[str, bool, int, T.List[str]]]
+ self.properties = properties or {} # type: T.Dict[str, T.Optional[T.Union[str, bool, int, T.List[str]]]]
def has_stdlib(self, language: str) -> bool:
return language + '_stdlib' in self.properties
@@ -210,13 +210,17 @@ class Properties:
assert isinstance(res, bool)
return res
+ def get_java_home(self) -> T.Optional[Path]:
+ value = T.cast(T.Optional[str], self.properties.get('java_home'))
+ return Path(value) if value else None
+
def __eq__(self, other: object) -> bool:
if isinstance(other, type(self)):
return self.properties == other.properties
return NotImplemented
# TODO consider removing so Properties is less freeform
- def __getitem__(self, key: str) -> T.Union[str, bool, int, T.List[str]]:
+ def __getitem__(self, key: str) -> T.Optional[T.Union[str, bool, int, T.List[str]]]:
return self.properties[key]
# TODO consider removing so Properties is less freeform
@@ -224,7 +228,7 @@ class Properties:
return item in self.properties
# TODO consider removing, for same reasons as above
- def get(self, key: str, default: T.Union[str, bool, int, T.List[str]] = None) -> T.Union[str, bool, int, T.List[str]]:
+ def get(self, key: str, default: T.Optional[T.Union[str, bool, int, T.List[str]]] = None) -> T.Optional[T.Union[str, bool, int, T.List[str]]]:
return self.properties.get(key, default)
class MachineInfo:
diff --git a/mesonbuild/environment.py b/mesonbuild/environment.py
index 54f608d..fc9b703 100644
--- a/mesonbuild/environment.py
+++ b/mesonbuild/environment.py
@@ -881,12 +881,13 @@ class Environment:
self.binaries[for_machine].binaries.setdefault(name, mesonlib.split_args(p_env))
def _set_default_properties_from_env(self) -> None:
- """Properties which can alkso be set from the environment."""
+ """Properties which can also be set from the environment."""
# name, evar, split
opts: T.List[T.Tuple[str, T.List[str], bool]] = [
('boost_includedir', ['BOOST_INCLUDEDIR'], False),
('boost_librarydir', ['BOOST_LIBRARYDIR'], False),
('boost_root', ['BOOST_ROOT', 'BOOSTROOT'], True),
+ ('java_home', ['JAVA_HOME'], False),
]
for (name, evars, split), for_machine in itertools.product(opts, MachineChoice):
@@ -944,7 +945,7 @@ class Environment:
def is_library(self, fname):
return is_library(fname)
- def lookup_binary_entry(self, for_machine: MachineChoice, name: str) -> T.List[str]:
+ def lookup_binary_entry(self, for_machine: MachineChoice, name: str) -> T.Optional[T.List[str]]:
return self.binaries[for_machine].lookup_entry(name)
@staticmethod