Rewrite `for_*` machine checks in terms of MachineInfo and phase out

It's much better to directly query the machine in question rather than
do some roundabout "is_cross" thing. This is the first step for much
natve- and cross- code path deduplication.
pull/4326/head
John Ericson 6 years ago
parent 0b1fb51b66
commit 68d0adf4d2
  1. 62
      mesonbuild/environment.py
  2. 62
      mesonbuild/mesonlib.py

@ -1161,6 +1161,68 @@ class MachineInfo:
literal['cpu'],
literal['endian'])
def is_windows(self):
"""
Machine is windows?
"""
return self.system == 'windows'
def is_cygwin(self):
"""
Machine is cygwin?
"""
return self.system == 'cygwin'
def is_linux(self):
"""
Machine is linux?
"""
return self.system == 'linux'
def is_darwin(self):
"""
Machine is Darwin (iOS/OS X)?
"""
return self.system in ('darwin', 'ios')
def is_android(self):
"""
Machine is Android?
"""
return self.system == 'android'
def is_haiku(self):
"""
Machine is Haiku?
"""
return self.system == 'haiku'
def is_openbsd(self):
"""
Machine is OpenBSD?
"""
return self.system == 'openbsd'
# Various prefixes and suffixes for import libraries, shared libraries,
# static libraries, and executables.
# Versioning is added to these names in the backends as-needed.
def get_exe_suffix(self):
if self.is_windows() or self.is_cygwin():
return 'exe'
else:
return ''
def get_object_suffix(self):
if self.is_windows():
return 'obj'
else:
return 'o'
def libdir_layout_is_win(self):
return self.is_windows() \
or self.is_cygwin()
class MachineInfos(PerMachine):
def __init__(self):
super().__init__(None, None, None)

@ -358,77 +358,93 @@ def is_dragonflybsd():
def is_freebsd():
return platform.system().lower() == 'freebsd'
def _get_machine_is_cross(env, is_cross):
"""
This is not morally correct, but works for now. For cross builds the build
and host machines differ. `is_cross == true` means the host machine, while
`is_cross == false` means the build machine. Both are used in practice,
even though the documentation refers to the host machine implying we should
hard-code it. For non-cross builds `is_cross == false` is passed but the
host and build machines are identical so it doesn't matter.
Users for `for_*` should instead specify up front which machine they want
and query that like:
env.machines[MachineChoice.HOST].is_haiku()
"""
for_machine = MachineChoice.HOST if is_cross else MachineChoice.BUILD
return env.machines[for_machine]
def for_windows(is_cross, env):
"""
Host machine is windows?
Deprecated: Please use `env.machines[for_machine].is_windows()`.
Note: 'host' is the machine on which compiled binaries will run
"""
if not is_cross:
return is_windows()
return env.cross_info.get_host_system() == 'windows'
return _get_machine_is_cross(env, is_cross).is_windows()
def for_cygwin(is_cross, env):
"""
Host machine is cygwin?
Deprecated: Please use `env.machines[for_machine].is_cygwin()`.
Note: 'host' is the machine on which compiled binaries will run
"""
if not is_cross:
return is_cygwin()
return env.cross_info.get_host_system() == 'cygwin'
return _get_machine_is_cross(env, is_cross).is_cygwin()
def for_linux(is_cross, env):
"""
Host machine is linux?
Deprecated: Please use `env.machines[for_machine].is_linux()`.
Note: 'host' is the machine on which compiled binaries will run
"""
if not is_cross:
return is_linux()
return env.cross_info.get_host_system() == 'linux'
return _get_machine_is_cross(env, is_cross).is_linux()
def for_darwin(is_cross, env):
"""
Host machine is Darwin (iOS/OS X)?
Deprecated: Please use `env.machines[for_machine].is_darwin()`.
Note: 'host' is the machine on which compiled binaries will run
"""
if not is_cross:
return is_osx()
return env.cross_info.get_host_system() in ('darwin', 'ios')
return _get_machine_is_cross(env, is_cross).is_darwin()
def for_android(is_cross, env):
"""
Host machine is Android?
Deprecated: Please use `env.machines[for_machine].is_android()`.
Note: 'host' is the machine on which compiled binaries will run
"""
if not is_cross:
return is_android()
return env.cross_info.get_host_system() == 'android'
return _get_machine_is_cross(env, is_cross).is_android()
def for_haiku(is_cross, env):
"""
Host machine is Haiku?
Deprecated: Please use `env.machines[for_machine].is_haiku()`.
Note: 'host' is the machine on which compiled binaries will run
"""
if not is_cross:
return is_haiku()
return env.cross_info.get_host_system() == 'haiku'
return _get_machine_is_cross(env, is_cross).is_haiku()
def for_openbsd(is_cross, env):
"""
Host machine is OpenBSD?
Deprecated: Please use `env.machines[for_machine].is_openbsd()`.
Note: 'host' is the machine on which compiled binaries will run
"""
if not is_cross:
return is_openbsd()
elif env.cross_info.has_host():
return env.cross_info.config['host_machine']['system'] == 'openbsd'
return False
return _get_machine_is_cross(env, is_cross).is_openbsd()
def exe_exists(arglist):
try:

Loading…
Cancel
Save