Pull out essence total map essence of MachineInfos into PerMachine

We'll eventually have many other data structure duplicated for each
build, host, and target machines. This sets up the infrastructure for
that.
pull/4326/head
John Ericson 6 years ago
parent 2ff69b20df
commit d69d2697cd
  1. 8
      mesonbuild/environment.py
  2. 49
      mesonbuild/mesonlib.py

@ -17,7 +17,7 @@ import configparser, os, platform, re, sys, shlex, shutil, subprocess
from . import coredata
from .linkers import ArLinker, ArmarLinker, VisualStudioLinker, DLinker
from . import mesonlib
from .mesonlib import EnvironmentException, Popen_safe
from .mesonlib import EnvironmentException, PerMachine, Popen_safe
from . import mlog
from . import compilers
@ -1147,11 +1147,9 @@ class MachineInfo:
literal['cpu'],
literal['endian'])
class MachineInfos:
class MachineInfos(PerMachine):
def __init__(self):
self.build = None
self.host = None
self.target = None
super().__init__(None, None, None)
def default_missing(self):
"""Default host to buid and target to host.

@ -20,6 +20,8 @@ import stat
import time
import platform, subprocess, operator, os, shutil, re
import collections
from enum import Enum
from mesonbuild import mlog
have_fcntl = False
@ -277,6 +279,53 @@ def classify_unity_sources(compilers, sources):
compsrclist[comp].append(src)
return compsrclist
class OrderedEnum(Enum):
"""
An Enum which additionally offers homogeneous ordered comparison.
"""
def __ge__(self, other):
if self.__class__ is other.__class__:
return self.value >= other.value
return NotImplemented
def __gt__(self, other):
if self.__class__ is other.__class__:
return self.value > other.value
return NotImplemented
def __le__(self, other):
if self.__class__ is other.__class__:
return self.value <= other.value
return NotImplemented
def __lt__(self, other):
if self.__class__ is other.__class__:
return self.value < other.value
return NotImplemented
MachineChoice = OrderedEnum('MachineChoice', ['BUILD', 'HOST', 'TARGET'])
class PerMachine:
def __init__(self, build, host, target):
self.build = build,
self.host = host
self.target = target
def __getitem__(self, machine: MachineChoice):
return {
MachineChoice.BUILD: self.build,
MachineChoice.HOST: self.host,
MachineChoice.TARGET: self.target
}[machine]
def __setitem__(self, machine: MachineChoice, val):
key = {
MachineChoice.BUILD: 'build',
MachineChoice.HOST: 'host',
MachineChoice.TARGET: 'target'
}[machine]
setattr(self, key, val)
def is_osx():
return platform.system().lower() == 'darwin'

Loading…
Cancel
Save