| 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)) |