blob: 1468fe899c10a7877993f9d930be286f69be9499 [file] [log] [blame]
import Arguments
import Jobs
import Types
class Tool(object):
"""Tool - A concrete implementation of an action."""
eFlagsPipedInput = 1 << 0
eFlagsPipedOutput = 1 << 1
eFlagsIntegratedCPP = 1 << 2
def __init__(self, name, flags = 0):
self.name = name
self.flags = flags
def acceptsPipedInput(self):
return not not (self.flags & Tool.eFlagsPipedInput)
def canPipeOutput(self):
return not not (self.flags & Tool.eFlagsPipedOutput)
def hasIntegratedCPP(self):
return not not (self.flags & Tool.eFlagsIntegratedCPP)
class GCC_Common_Tool(Tool):
def constructJob(self, phase, arch, jobs, inputs,
output, outputType, args,
extraArgs):
assert len(inputs) == 1
input = inputs[0]
cmd_args = args + extraArgs
if arch:
# FIXME: Clean this up.
if isinstance(arch, Arguments.DerivedArg):
cmd_args.extend([Arguments.DerivedArg('-arch'),
arch])
else:
cmd_args.append(arch)
if isinstance(output, Jobs.PipedJob):
cmd_args.extend([Arguments.DerivedArg('-o'), Arguments.DerivedArg('-')])
elif output is None:
cmd_args.append(Arguments.DerivedArg('-fsyntax-only'))
else:
# FIXME: Ditch this hack.
if isinstance(output, Arguments.DerivedArg):
cmd_args.extend([Arguments.DerivedArg('-o'), output])
else:
cmd_args.append(output)
cmd_args.extend([Arguments.DerivedArg('-x'),
Arguments.DerivedArg(input.type.name)])
if isinstance(input.source, Jobs.PipedJob):
cmd_args.append(Arguments.DerivedArg('-'))
else:
cmd_args.append(input.source)
jobs.addJob(Jobs.Command('gcc', cmd_args))
class GCC_PreprocessTool(GCC_Common_Tool):
def __init__(self):
super(GCC_PreprocessTool, self).__init__('gcc',
(Tool.eFlagsPipedInput |
Tool.eFlagsPipedOutput))
def constructJob(self, phase, arch, jobs, inputs,
output, outputType, args):
return super(GCC_PreprocessTool, self).constructJob(phase, arch, jobs, inputs,
output, outputType, args,
[Arguments.DerivedArg('-E')])
class GCC_CompileTool(GCC_Common_Tool):
def __init__(self):
super(GCC_CompileTool, self).__init__('gcc',
(Tool.eFlagsPipedInput |
Tool.eFlagsPipedOutput |
Tool.eFlagsIntegratedCPP))
def constructJob(self, phase, arch, jobs, inputs,
output, outputType, args):
return super(GCC_CompileTool, self).constructJob(phase, arch, jobs, inputs,
output, outputType, args,
[Arguments.DerivedArg('-S')])
class GCC_PrecompileTool(GCC_Common_Tool):
def __init__(self):
super(GCC_PrecompileTool, self).__init__('gcc',
(Tool.eFlagsPipedInput |
Tool.eFlagsIntegratedCPP))
def constructJob(self, phase, arch, jobs, inputs,
output, outputType, args):
return super(GCC_PrecompileTool, self).constructJob(phase, arch, jobs, inputs,
output, outputType, args,
[])
class DarwinAssemblerTool(Tool):
def __init__(self):
super(DarwinAssemblerTool, self).__init__('as',
Tool.eFlagsPipedInput)
def constructJob(self, phase, arch, jobs, inputs,
output, outputType, args):
assert len(inputs) == 1
assert outputType is Types.ObjectType
input = inputs[0]
cmd_args = []
if arch:
# FIXME: Clean this up.
if isinstance(arch, Arguments.DerivedArg):
cmd_args.extend([Arguments.DerivedArg('-arch'),
arch])
else:
cmd_args.append(arch)
cmd_args.append(Arguments.DerivedArg('-force_cpusubtype_ALL'))
if isinstance(output, Arguments.DerivedArg):
cmd_args.extend([Arguments.DerivedArg('-o'), output])
else:
cmd_args.append(output)
if isinstance(input.source, Jobs.PipedJob):
cmd_args.append(Arguments.DerivedArg('-'))
else:
cmd_args.append(input.source)
jobs.addJob(Jobs.Command('as', cmd_args))
class Collect2Tool(Tool):
kCollect2Path = '/usr/libexec/gcc/i686-apple-darwin10/4.2.1/collect2'
def __init__(self):
super(Collect2Tool, self).__init__('collect2')
def constructJob(self, phase, arch, jobs, inputs,
output, outputType, args):
assert outputType is Types.ImageType
cmd_args = []
for arg in args:
if arg.opt:
if arg.opt.name in ('-framework',):
cmd_args.append(arg)
for input in inputs:
cmd_args.append(input.source)
if isinstance(output, Arguments.DerivedArg):
cmd_args.extend([Arguments.DerivedArg('-o'), output])
else:
cmd_args.append(output)
cmd_args.extend([Arguments.DerivedArg('-L/usr/lib/gcc/i686-apple-darwin10/4.2.1'),
Arguments.DerivedArg('-lcrt1.10.5.o'),
Arguments.DerivedArg('-lgcc_s.10.5'),
Arguments.DerivedArg('-lgcc'),
Arguments.DerivedArg('-lSystem')])
jobs.addJob(Jobs.Command(self.kCollect2Path, cmd_args))
class LipoTool(Tool):
def __init__(self):
super(LipoTool, self).__init__('lipo')
def constructJob(self, phase, arch, jobs, inputs,
output, outputType, args):
assert outputType is Types.ImageType
cmd_args = [Arguments.DerivedArg('-create')]
if isinstance(output, Arguments.DerivedArg):
cmd_args.extend([Arguments.DerivedArg('-o'), output])
else:
cmd_args.append(output)
for input in inputs:
cmd_args.append(input.source)
jobs.addJob(Jobs.Command('lipo', cmd_args))