blob: 7c94cbaf50c42e585f83e8efdafe50e0048620a6 [file] [log] [blame]
Daniel Dunbar08dea462009-01-10 02:07:54 +00001import ToolChain
2
Daniel Dunbar4ed45ea2009-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 Dunbar08dea462009-01-10 02:07:54 +00008 def __init__(self, driver):
9 self.driver = driver
Daniel Dunbar4ed45ea2009-01-09 01:00:40 +000010
Daniel Dunbarf3d5ca02009-01-13 04:05:40 +000011 def getArchName(self, args):
Daniel Dunbar4ed45ea2009-01-09 01:00:40 +000012 abstract
13
14 def useDriverDriver(self):
15 abstract
16
Daniel Dunbar758cf642009-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 Dunbar4ed45ea2009-01-09 01:00:40 +000023# Darwin
24
25class DarwinHostInfo(HostInfo):
Daniel Dunbarc2148562009-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 Dunbar4ed45ea2009-01-09 01:00:40 +000037 def useDriverDriver(self):
38 return True
39
Daniel Dunbar08dea462009-01-10 02:07:54 +000040 def getToolChain(self):
Daniel Dunbarf3d5ca02009-01-13 04:05:40 +000041 return self.getToolChainForArch(self.getArchName(None))
Daniel Dunbar758cf642009-01-11 22:06:22 +000042
43 def getToolChainForArch(self, arch):
44 if arch in ('i386', 'x86_64'):
Daniel Dunbarc2148562009-01-12 04:21:12 +000045 return ToolChain.Darwin_X86_ToolChain(self.driver,
46 self.darwinVersion,
Daniel Dunbar7c2f91b2009-01-14 01:03:36 +000047 self.gccVersion,
48 arch)
Daniel Dunbar758cf642009-01-11 22:06:22 +000049
50 return ToolChain.Generic_GCC_ToolChain(self.driver)
Daniel Dunbar08dea462009-01-10 02:07:54 +000051
Daniel Dunbar4ed45ea2009-01-09 01:00:40 +000052class DarwinPPCHostInfo(DarwinHostInfo):
Daniel Dunbarf3d5ca02009-01-13 04:05:40 +000053 def getArchName(self, args):
54 if args and args.getLastArg(args.parser.m_64Option):
55 return 'ppc64'
Daniel Dunbar4ed45ea2009-01-09 01:00:40 +000056 return 'ppc'
57
58class DarwinPPC_64HostInfo(DarwinHostInfo):
Daniel Dunbarf3d5ca02009-01-13 04:05:40 +000059 def getArchName(self, args):
60 if args and args.getLastArg(args.parser.m_32Option):
61 return 'ppc'
Daniel Dunbar4ed45ea2009-01-09 01:00:40 +000062 return 'ppc64'
63
64class DarwinX86HostInfo(DarwinHostInfo):
Daniel Dunbarf3d5ca02009-01-13 04:05:40 +000065 def getArchName(self, args):
66 if args and args.getLastArg(args.parser.m_64Option):
67 return 'x86_64'
Daniel Dunbar4ed45ea2009-01-09 01:00:40 +000068 return 'i386'
69
70class DarwinX86_64HostInfo(DarwinHostInfo):
Daniel Dunbarf3d5ca02009-01-13 04:05:40 +000071 def getArchName(self, args):
72 if args and args.getLastArg(args.parser.m_32Option):
73 return 'i386'
Daniel Dunbar4ed45ea2009-01-09 01:00:40 +000074 return 'x86_64'
75
Daniel Dunbardbc9ee92009-01-09 22:21:24 +000076def getDarwinHostInfo(driver):
77 machine = driver.getHostMachine()
78 bits = driver.getHostBits()
Daniel Dunbar4ed45ea2009-01-09 01:00:40 +000079 if machine == 'i386':
80 if bits == '32':
Daniel Dunbar08dea462009-01-10 02:07:54 +000081 return DarwinX86HostInfo(driver)
Daniel Dunbar4ed45ea2009-01-09 01:00:40 +000082 if bits == '64':
Daniel Dunbar08dea462009-01-10 02:07:54 +000083 return DarwinX86_64HostInfo(driver)
Daniel Dunbar4ed45ea2009-01-09 01:00:40 +000084 elif machine == 'ppc':
85 if bits == '32':
Daniel Dunbar08dea462009-01-10 02:07:54 +000086 return DarwinPPCHostInfo(driver)
Daniel Dunbar4ed45ea2009-01-09 01:00:40 +000087 if bits == '64':
Daniel Dunbar08dea462009-01-10 02:07:54 +000088 return DarwinPPC_64HostInfo(driver)
Daniel Dunbar4ed45ea2009-01-09 01:00:40 +000089
Daniel Dunbardbc9ee92009-01-09 22:21:24 +000090 raise RuntimeError,'Unrecognized Darwin platform: %r:%r' % (machine, bits)
Daniel Dunbar4ed45ea2009-01-09 01:00:40 +000091
92# Unknown
93
94class UnknownHostInfo(HostInfo):
95 def getArchName(self):
96 raise RuntimeError,'getArchName() unsupported on unknown host.'
97
98 def useDriverDriver(self):
99 return False
100
Daniel Dunbar08dea462009-01-10 02:07:54 +0000101 def getToolChain(self):
102 return ToolChain.Generic_GCC_ToolChain(self.driver)
103
Daniel Dunbardbc9ee92009-01-09 22:21:24 +0000104def getUnknownHostInfo(driver):
Daniel Dunbar08dea462009-01-10 02:07:54 +0000105 return UnknownHostInfo(driver)
Daniel Dunbar4ed45ea2009-01-09 01:00:40 +0000106
107####
108
109kSystems = {
110 'darwin' : getDarwinHostInfo,
111 'unknown' : getUnknownHostInfo,
112 }
113
Daniel Dunbardbc9ee92009-01-09 22:21:24 +0000114def getHostInfo(driver):
115 system = driver.getHostSystemName()
Daniel Dunbar4ed45ea2009-01-09 01:00:40 +0000116 handler = kSystems.get(system)
117 if handler:
Daniel Dunbardbc9ee92009-01-09 22:21:24 +0000118 return handler(driver)
Daniel Dunbar4ed45ea2009-01-09 01:00:40 +0000119
120 driver.warning('Unknown host %r, using generic host information.' % system)
Daniel Dunbar08dea462009-01-10 02:07:54 +0000121 return UnknownHostInfo(driver)