blob: 12fdfef404afb8aafca8fcf6fa8ad71931849bc7 [file] [log] [blame]
Daniel Dunbar43124722009-01-10 02:07:54 +00001import ToolChain
2
Daniel Dunbar9066af82009-01-09 01:00:40 +00003class HostInfo(object):
4 """HostInfo - Config information about a particular host which may
5 interact with driver behavior. This can be very different from the
6 target(s) of a particular driver invocation."""
7
Daniel Dunbar43124722009-01-10 02:07:54 +00008 def __init__(self, driver):
9 self.driver = driver
Daniel Dunbar9066af82009-01-09 01:00:40 +000010
11 def getArchName(self):
12 abstract
13
14 def useDriverDriver(self):
15 abstract
16
Daniel Dunbarbee1f0d2009-01-11 22:06:22 +000017 def getToolChain(self):
18 abstract
19
20 def getToolChainForArch(self, arch):
21 raise RuntimeError,"getToolChainForArch() unsupported on this host."
22
Daniel Dunbar9066af82009-01-09 01:00:40 +000023# Darwin
24
25class DarwinHostInfo(HostInfo):
Daniel Dunbar9c257c32009-01-12 04:21:12 +000026 def __init__(self, driver):
27 super(DarwinHostInfo, self).__init__(driver)
28
29 # FIXME: Find right regex for this.
30 import re
31 m = re.match(r'([0-9]+)\.([0-9]+)\.([0-9]+)', driver.getHostReleaseName())
32 if not m:
33 raise RuntimeError,"Unable to determine Darwin version."
34 self.darwinVersion = tuple(map(int, m.groups()))
35 self.gccVersion = (4,2,1)
36
Daniel Dunbar9066af82009-01-09 01:00:40 +000037 def useDriverDriver(self):
38 return True
39
Daniel Dunbar43124722009-01-10 02:07:54 +000040 def getToolChain(self):
Daniel Dunbarbee1f0d2009-01-11 22:06:22 +000041 return self.getToolChainForArch(self.getArchName())
42
43 def getToolChainForArch(self, arch):
44 if arch in ('i386', 'x86_64'):
Daniel Dunbar9c257c32009-01-12 04:21:12 +000045 return ToolChain.Darwin_X86_ToolChain(self.driver,
46 self.darwinVersion,
47 self.gccVersion)
Daniel Dunbarbee1f0d2009-01-11 22:06:22 +000048
49 return ToolChain.Generic_GCC_ToolChain(self.driver)
Daniel Dunbar43124722009-01-10 02:07:54 +000050
Daniel Dunbar9066af82009-01-09 01:00:40 +000051class DarwinPPCHostInfo(DarwinHostInfo):
52 def getArchName(self):
53 return 'ppc'
54
55class DarwinPPC_64HostInfo(DarwinHostInfo):
56 def getArchName(self):
57 return 'ppc64'
58
59class DarwinX86HostInfo(DarwinHostInfo):
60 def getArchName(self):
61 return 'i386'
62
63class DarwinX86_64HostInfo(DarwinHostInfo):
64 def getArchName(self):
65 return 'x86_64'
66
Daniel Dunbara75ea3d2009-01-09 22:21:24 +000067def getDarwinHostInfo(driver):
68 machine = driver.getHostMachine()
69 bits = driver.getHostBits()
Daniel Dunbar9066af82009-01-09 01:00:40 +000070 if machine == 'i386':
71 if bits == '32':
Daniel Dunbar43124722009-01-10 02:07:54 +000072 return DarwinX86HostInfo(driver)
Daniel Dunbar9066af82009-01-09 01:00:40 +000073 if bits == '64':
Daniel Dunbar43124722009-01-10 02:07:54 +000074 return DarwinX86_64HostInfo(driver)
Daniel Dunbar9066af82009-01-09 01:00:40 +000075 elif machine == 'ppc':
76 if bits == '32':
Daniel Dunbar43124722009-01-10 02:07:54 +000077 return DarwinPPCHostInfo(driver)
Daniel Dunbar9066af82009-01-09 01:00:40 +000078 if bits == '64':
Daniel Dunbar43124722009-01-10 02:07:54 +000079 return DarwinPPC_64HostInfo(driver)
Daniel Dunbar9066af82009-01-09 01:00:40 +000080
Daniel Dunbara75ea3d2009-01-09 22:21:24 +000081 raise RuntimeError,'Unrecognized Darwin platform: %r:%r' % (machine, bits)
Daniel Dunbar9066af82009-01-09 01:00:40 +000082
83# Unknown
84
85class UnknownHostInfo(HostInfo):
86 def getArchName(self):
87 raise RuntimeError,'getArchName() unsupported on unknown host.'
88
89 def useDriverDriver(self):
90 return False
91
Daniel Dunbar43124722009-01-10 02:07:54 +000092 def getToolChain(self):
93 return ToolChain.Generic_GCC_ToolChain(self.driver)
94
Daniel Dunbara75ea3d2009-01-09 22:21:24 +000095def getUnknownHostInfo(driver):
Daniel Dunbar43124722009-01-10 02:07:54 +000096 return UnknownHostInfo(driver)
Daniel Dunbar9066af82009-01-09 01:00:40 +000097
98####
99
100kSystems = {
101 'darwin' : getDarwinHostInfo,
102 'unknown' : getUnknownHostInfo,
103 }
104
Daniel Dunbara75ea3d2009-01-09 22:21:24 +0000105def getHostInfo(driver):
106 system = driver.getHostSystemName()
Daniel Dunbar9066af82009-01-09 01:00:40 +0000107 handler = kSystems.get(system)
108 if handler:
Daniel Dunbara75ea3d2009-01-09 22:21:24 +0000109 return handler(driver)
Daniel Dunbar9066af82009-01-09 01:00:40 +0000110
111 driver.warning('Unknown host %r, using generic host information.' % system)
Daniel Dunbar43124722009-01-10 02:07:54 +0000112 return UnknownHostInfo(driver)