blob: d976138eec095738ec41362a3bd5875684644499 [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
Daniel Dunbar1f73ecb2009-01-13 04:05:40 +000011 def getArchName(self, args):
Daniel Dunbar9066af82009-01-09 01:00:40 +000012 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 Dunbar1f73ecb2009-01-13 04:05:40 +000041 return self.getToolChainForArch(self.getArchName(None))
Daniel Dunbarbee1f0d2009-01-11 22:06:22 +000042
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):
Daniel Dunbar1f73ecb2009-01-13 04:05:40 +000052 def getArchName(self, args):
53 if args and args.getLastArg(args.parser.m_64Option):
54 return 'ppc64'
Daniel Dunbar9066af82009-01-09 01:00:40 +000055 return 'ppc'
56
57class DarwinPPC_64HostInfo(DarwinHostInfo):
Daniel Dunbar1f73ecb2009-01-13 04:05:40 +000058 def getArchName(self, args):
59 if args and args.getLastArg(args.parser.m_32Option):
60 return 'ppc'
Daniel Dunbar9066af82009-01-09 01:00:40 +000061 return 'ppc64'
62
63class DarwinX86HostInfo(DarwinHostInfo):
Daniel Dunbar1f73ecb2009-01-13 04:05:40 +000064 def getArchName(self, args):
65 if args and args.getLastArg(args.parser.m_64Option):
66 return 'x86_64'
Daniel Dunbar9066af82009-01-09 01:00:40 +000067 return 'i386'
68
69class DarwinX86_64HostInfo(DarwinHostInfo):
Daniel Dunbar1f73ecb2009-01-13 04:05:40 +000070 def getArchName(self, args):
71 if args and args.getLastArg(args.parser.m_32Option):
72 return 'i386'
Daniel Dunbar9066af82009-01-09 01:00:40 +000073 return 'x86_64'
74
Daniel Dunbara75ea3d2009-01-09 22:21:24 +000075def getDarwinHostInfo(driver):
76 machine = driver.getHostMachine()
77 bits = driver.getHostBits()
Daniel Dunbar9066af82009-01-09 01:00:40 +000078 if machine == 'i386':
79 if bits == '32':
Daniel Dunbar43124722009-01-10 02:07:54 +000080 return DarwinX86HostInfo(driver)
Daniel Dunbar9066af82009-01-09 01:00:40 +000081 if bits == '64':
Daniel Dunbar43124722009-01-10 02:07:54 +000082 return DarwinX86_64HostInfo(driver)
Daniel Dunbar9066af82009-01-09 01:00:40 +000083 elif machine == 'ppc':
84 if bits == '32':
Daniel Dunbar43124722009-01-10 02:07:54 +000085 return DarwinPPCHostInfo(driver)
Daniel Dunbar9066af82009-01-09 01:00:40 +000086 if bits == '64':
Daniel Dunbar43124722009-01-10 02:07:54 +000087 return DarwinPPC_64HostInfo(driver)
Daniel Dunbar9066af82009-01-09 01:00:40 +000088
Daniel Dunbara75ea3d2009-01-09 22:21:24 +000089 raise RuntimeError,'Unrecognized Darwin platform: %r:%r' % (machine, bits)
Daniel Dunbar9066af82009-01-09 01:00:40 +000090
91# Unknown
92
93class UnknownHostInfo(HostInfo):
94 def getArchName(self):
95 raise RuntimeError,'getArchName() unsupported on unknown host.'
96
97 def useDriverDriver(self):
98 return False
99
Daniel Dunbar43124722009-01-10 02:07:54 +0000100 def getToolChain(self):
101 return ToolChain.Generic_GCC_ToolChain(self.driver)
102
Daniel Dunbara75ea3d2009-01-09 22:21:24 +0000103def getUnknownHostInfo(driver):
Daniel Dunbar43124722009-01-10 02:07:54 +0000104 return UnknownHostInfo(driver)
Daniel Dunbar9066af82009-01-09 01:00:40 +0000105
106####
107
108kSystems = {
109 'darwin' : getDarwinHostInfo,
110 'unknown' : getUnknownHostInfo,
111 }
112
Daniel Dunbara75ea3d2009-01-09 22:21:24 +0000113def getHostInfo(driver):
114 system = driver.getHostSystemName()
Daniel Dunbar9066af82009-01-09 01:00:40 +0000115 handler = kSystems.get(system)
116 if handler:
Daniel Dunbara75ea3d2009-01-09 22:21:24 +0000117 return handler(driver)
Daniel Dunbar9066af82009-01-09 01:00:40 +0000118
119 driver.warning('Unknown host %r, using generic host information.' % system)
Daniel Dunbar43124722009-01-10 02:07:54 +0000120 return UnknownHostInfo(driver)