Add kernel and userland properties to machine objects.
diff --git a/mesonbuild/envconfig.py b/mesonbuild/envconfig.py
index 50c974b..b3a5905 100644
--- a/mesonbuild/envconfig.py
+++ b/mesonbuild/envconfig.py
@@ -260,6 +260,8 @@
     cpu_family: str
     cpu: str
     endian: str
+    kernel: str
+    userland: str
 
     def __post_init__(self) -> None:
         self.is_64_bit: bool = self.cpu_family in CPU_FAMILIES_64_BIT
@@ -283,7 +285,11 @@
         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', system)
+        userland = literal.get('userland', system)
+
+        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 ccd31eb..91f58ef 100644
--- a/mesonbuild/environment.py
+++ b/mesonbuild/environment.py
@@ -387,6 +387,18 @@
     # detect_cpu_family() above.
     return trial
 
+def detect_kernel(system: str) -> str:
+    if system == 'android':
+        return 'linux'
+    return system
+
+def detect_userland(system: str) -> str:
+    if system == 'linux':
+        return 'gnu' # Fixme, check whether we are on a glibc system.
+    if system == 'darwin':
+        return 'macos'
+    return system
+
 def detect_system() -> str:
     if sys.platform == 'cygwin':
         return 'cygwin'
@@ -403,11 +415,14 @@
     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..52b4bdb 100644
--- a/mesonbuild/interpreter/interpreterobjects.py
+++ b/mesonbuild/interpreter/interpreterobjects.py
@@ -639,6 +639,8 @@
                              '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,17 @@
     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:
+        return self.held_object.kernel
+
+    @noPosargs
+    @noKwargs
+    def userland_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> str:
+        return self.held_object.userland
+
+
 class IncludeDirsHolder(ObjectHolder[build.IncludeDirs]):
     pass