aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mesonbuild/environment.py8
-rw-r--r--mesonbuild/mesonlib.py49
2 files changed, 52 insertions, 5 deletions
diff --git a/mesonbuild/environment.py b/mesonbuild/environment.py
index f01ba38..fe06c36 100644
--- a/mesonbuild/environment.py
+++ b/mesonbuild/environment.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.
diff --git a/mesonbuild/mesonlib.py b/mesonbuild/mesonlib.py
index 33900b6..0094a92 100644
--- a/mesonbuild/mesonlib.py
+++ b/mesonbuild/mesonlib.py
@@ -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'