blob: 07ac926af1eaeb875ccc8148426579baf9a2b026 [file] [log] [blame]
Daniel Dunbar11672ec2009-01-13 18:51:26 +00001import Arguments
Daniel Dunbar43124722009-01-10 02:07:54 +00002import Phases
3import Tools
4
5###
6
7class ToolChain(object):
8 """ToolChain - Provide mappings of Actions to Tools."""
9
10 def __init__(self, driver):
11 self.driver = driver
12
13 def selectTool(self, action):
14 """selectTool - Return a Tool instance to use for handling
15 some particular action."""
16 abstract
17
Daniel Dunbar11672ec2009-01-13 18:51:26 +000018 def translateArgs(self, args, arch):
19 """translateArgs - Callback to allow argument translation for
20 an entire toolchain."""
21
22 # FIXME: Would be nice to move arch handling out of generic
23 # code.
24 if arch:
25 archName = args.getValue(arch)
26 al = Arguments.DerivedArgList(args)
27 for arg in args.args:
28 if arg.opt is args.parser.archOption:
29 if arg is arch:
30 al.append(arg)
31 elif arg.opt is args.parser.XarchOption:
32 if args.getJoinedValue(arg) == archName:
33 # FIXME: Fix this.
34 arg = args.parser.lookupOptForArg(Arguments.InputIndex(0, arg.index.pos + 1),
35 args.getSeparateValue(arg),
36 iter([]))
37 al.append(arg)
38 else:
39 al.append(arg)
40 return al
41 else:
42 return args
43
Daniel Dunbar9c257c32009-01-12 04:21:12 +000044class Darwin_X86_ToolChain(ToolChain):
45 def __init__(self, driver, darwinVersion, gccVersion):
46 super(Darwin_X86_ToolChain, self).__init__(driver)
Daniel Dunbar9cb22532009-01-12 07:45:49 +000047 assert isinstance(darwinVersion, tuple) and len(darwinVersion) == 3
48 assert isinstance(gccVersion, tuple) and len(gccVersion) == 3
49 self.darwinVersion = darwinVersion
50 self.gccVersion = gccVersion
51
Daniel Dunbar43124722009-01-10 02:07:54 +000052 self.toolMap = {
53 Phases.PreprocessPhase : Tools.GCC_PreprocessTool(),
Daniel Dunbar11672ec2009-01-13 18:51:26 +000054 Phases.CompilePhase : Tools.Darwin_X86_CompileTool(self),
Daniel Dunbar43124722009-01-10 02:07:54 +000055 Phases.PrecompilePhase : Tools.GCC_PrecompileTool(),
Daniel Dunbar9cb22532009-01-12 07:45:49 +000056 Phases.AssemblePhase : Tools.Darwin_AssembleTool(self),
57 Phases.LinkPhase : Tools.Darwin_X86_LinkTool(self),
Daniel Dunbar43124722009-01-10 02:07:54 +000058 Phases.LipoPhase : Tools.LipoTool(),
59 }
60
Daniel Dunbar9cb22532009-01-12 07:45:49 +000061 def getToolChainDir(self):
62 return 'i686-apple-darwin%d/%s' % (self.darwinVersion[0],
63 '.'.join(map(str,self.gccVersion)))
64
65 def getProgramPath(self, name):
66 # FIXME: Implement proper search.
67 return '/usr/libexec/gcc/%s/%s' % (self.getToolChainDir(), name)
68
Daniel Dunbardff9f502009-01-12 18:51:02 +000069 def getMacosxVersionMin(self):
70 major,minor,minorminor = self.darwinVersion
71 return '%d.%d.%d' % (10, major-4, minor)
72
Daniel Dunbar43124722009-01-10 02:07:54 +000073 def selectTool(self, action):
74 assert isinstance(action, Phases.JobAction)
75 return self.toolMap[action.phase.__class__]
76
77class Generic_GCC_ToolChain(ToolChain):
78 """Generic_GCC_ToolChain - A tool chain using the 'gcc' command to
79 perform all subcommands; this relies on gcc translating the
80 options appropriately."""
81
82 def __init__(self, driver):
83 super(Generic_GCC_ToolChain, self).__init__(driver)
84 self.toolMap = {
85 Phases.PreprocessPhase : Tools.GCC_PreprocessTool(),
86 Phases.CompilePhase : Tools.GCC_CompileTool(),
87 Phases.PrecompilePhase : Tools.GCC_PrecompileTool(),
88 Phases.AssemblePhase : Tools.GCC_AssembleTool(),
89 Phases.LinkPhase : Tools.GCC_LinkTool(),
90 }
91
92 def selectTool(self, action):
93 assert isinstance(action, Phases.JobAction)
94 return self.toolMap[action.phase.__class__]