aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild
diff options
context:
space:
mode:
Diffstat (limited to 'mesonbuild')
-rw-r--r--mesonbuild/envconfig.py8
-rw-r--r--mesonbuild/environment.py30
-rw-r--r--mesonbuild/interpreter/interpreterobjects.py17
3 files changed, 52 insertions, 3 deletions
diff --git a/mesonbuild/envconfig.py b/mesonbuild/envconfig.py
index 50c974b..964e352 100644
--- a/mesonbuild/envconfig.py
+++ b/mesonbuild/envconfig.py
@@ -260,6 +260,8 @@ class MachineInfo(HoldableObject):
cpu_family: str
cpu: str
endian: str
+ kernel: T.Optional[str]
+ userland: T.Optional[str]
def __post_init__(self) -> None:
self.is_64_bit: bool = self.cpu_family in CPU_FAMILIES_64_BIT
@@ -283,7 +285,11 @@ class MachineInfo(HoldableObject):
if endian not in ('little', 'big'):
mlog.warning(f'Unknown endian {endian}')
- return cls(literal['system'], cpu_family, literal['cpu'], endian)
+ system = literal['system']
+ kernel = literal.get('kernel', None)
+ userland = literal.get('userland', None)
+
+ return cls(system, cpu_family, literal['cpu'], endian, kernel, userland)
def is_windows(self) -> bool:
"""
diff --git a/mesonbuild/environment.py b/mesonbuild/environment.py
index 36aa94e..9b67137 100644
--- a/mesonbuild/environment.py
+++ b/mesonbuild/environment.py
@@ -395,6 +395,29 @@ def detect_cpu(compilers: CompilersDict) -> str:
# detect_cpu_family() above.
return trial
+kernel_mappings = {'freebsd': 'freebsd',
+ 'openbsd': 'openbsd',
+ 'windows': 'windows',
+ 'android': 'linux',
+ 'cygwin': 'windows',
+ 'darwin': 'xnu',
+ }
+
+userland_mappings = {'freebsd': 'freebsd',
+ 'openbsd': 'openbsd',
+ 'windows': 'windows',
+ 'darwin': 'macos',
+ 'gnu': 'gnu',
+ }
+
+def detect_kernel(system: str) -> T.Optional[str]:
+ return kernel_mappings.get(system, None)
+
+def detect_userland(system: str) -> T.Optional[str]:
+ if system == 'linux':
+ return 'gnu' # Fixme, check whether we are on a glibc system.
+ return userland_mappings.get(system, None)
+
def detect_system() -> str:
if sys.platform == 'cygwin':
return 'cygwin'
@@ -411,11 +434,14 @@ def detect_machine_info(compilers: T.Optional[CompilersDict] = None) -> MachineI
underlying ''detect_*'' method can be called to explicitly use the
partial information.
"""
+ system = detect_system()
return MachineInfo(
- detect_system(),
+ system,
detect_cpu_family(compilers) if compilers is not None else None,
detect_cpu(compilers) if compilers is not None else None,
- sys.byteorder)
+ sys.byteorder,
+ detect_kernel(system),
+ detect_userland(system))
# TODO make this compare two `MachineInfo`s purely. How important is the
# `detect_cpu_family({})` distinction? It is the one impediment to that.
diff --git a/mesonbuild/interpreter/interpreterobjects.py b/mesonbuild/interpreter/interpreterobjects.py
index fa91714..6807321 100644
--- a/mesonbuild/interpreter/interpreterobjects.py
+++ b/mesonbuild/interpreter/interpreterobjects.py
@@ -639,6 +639,8 @@ class MachineHolder(ObjectHolder['MachineInfo']):
'cpu': self.cpu_method,
'cpu_family': self.cpu_family_method,
'endian': self.endian_method,
+ 'kernel': self.kernel_method,
+ 'userland': self.userland_method,
})
@noPosargs
@@ -661,6 +663,21 @@ class MachineHolder(ObjectHolder['MachineInfo']):
def endian_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> str:
return self.held_object.endian
+ @noPosargs
+ @noKwargs
+ def kernel_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> str:
+ if self.held_object.kernel is not None:
+ return self.held_object.kernel
+ raise InterpreterException('Kernel not defined or could not be autodetected.')
+
+ @noPosargs
+ @noKwargs
+ def userland_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> str:
+ if self.held_object.userland is not None:
+ return self.held_object.userland
+ raise InterpreterException('Userland not defined or could not be autodetected.')
+
+
class IncludeDirsHolder(ObjectHolder[build.IncludeDirs]):
pass