diff options
| -rw-r--r-- | clang/tools/ccc/ccclib/Driver.py | 11 | ||||
| -rw-r--r-- | clang/tools/ccc/ccclib/HostInfo.py | 15 | ||||
| -rw-r--r-- | clang/tools/ccc/ccclib/ToolChain.py | 9 | ||||
| -rw-r--r-- | clang/tools/ccc/ccclib/Tools.py | 45 | 
4 files changed, 58 insertions, 22 deletions
| diff --git a/clang/tools/ccc/ccclib/Driver.py b/clang/tools/ccc/ccclib/Driver.py index afc7cf58543..983a52bd185 100644 --- a/clang/tools/ccc/ccclib/Driver.py +++ b/clang/tools/ccc/ccclib/Driver.py @@ -58,6 +58,12 @@ class Driver(object):          return platform.system().lower() +    def getHostReleaseName(self): +        if self.cccHostRelease: +            return self.cccHostRelease +         +        return platform.release() +      ###      def run(self, argv): @@ -74,7 +80,8 @@ class Driver(object):          # FIXME: How to handle override of host? ccc specific options?          # Abuse -b? -        self.cccHostBits = self.cccHostMachine = self.cccHostSystem = None +        self.cccHostBits = self.cccHostMachine = None +        self.cccHostSystem = self.cccHostRelease = None          while argv and argv[0].startswith('-ccc-'):              opt,argv = argv[0][5:],argv[1:] @@ -88,6 +95,8 @@ class Driver(object):                  self.cccHostMachine,argv = argv[0],argv[1:]              elif opt == 'host-system':                  self.cccHostSystem,argv = argv[0],argv[1:] +            elif opt == 'host-release': +                self.cccHostRelease,argv = argv[0],argv[1:]              else:                  raise ValueError,"Invalid ccc option: %r" % cccPrintOptions diff --git a/clang/tools/ccc/ccclib/HostInfo.py b/clang/tools/ccc/ccclib/HostInfo.py index a12d57295c2..12fdfef404a 100644 --- a/clang/tools/ccc/ccclib/HostInfo.py +++ b/clang/tools/ccc/ccclib/HostInfo.py @@ -23,6 +23,17 @@ class HostInfo(object):  # Darwin  class DarwinHostInfo(HostInfo): +    def __init__(self, driver): +        super(DarwinHostInfo, self).__init__(driver) +         +        # FIXME: Find right regex for this. +        import re +        m = re.match(r'([0-9]+)\.([0-9]+)\.([0-9]+)', driver.getHostReleaseName()) +        if not m: +            raise RuntimeError,"Unable to determine Darwin version." +        self.darwinVersion = tuple(map(int, m.groups())) +        self.gccVersion = (4,2,1) +      def useDriverDriver(self):          return True @@ -31,7 +42,9 @@ class DarwinHostInfo(HostInfo):      def getToolChainForArch(self, arch):          if arch in ('i386', 'x86_64'): -            return ToolChain.Darwin10_X86_ToolChain(self.driver) +            return ToolChain.Darwin_X86_ToolChain(self.driver, +                                                  self.darwinVersion, +                                                  self.gccVersion)          return ToolChain.Generic_GCC_ToolChain(self.driver) diff --git a/clang/tools/ccc/ccclib/ToolChain.py b/clang/tools/ccc/ccclib/ToolChain.py index e80bb089cfb..db8dd0e414a 100644 --- a/clang/tools/ccc/ccclib/ToolChain.py +++ b/clang/tools/ccc/ccclib/ToolChain.py @@ -14,15 +14,16 @@ class ToolChain(object):          some particular action."""          abstract -class Darwin10_X86_ToolChain(ToolChain): -    def __init__(self, driver): -        super(Darwin10_X86_ToolChain, self).__init__(driver) +class Darwin_X86_ToolChain(ToolChain): +    def __init__(self, driver, darwinVersion, gccVersion): +        super(Darwin_X86_ToolChain, self).__init__(driver)          self.toolMap = {              Phases.PreprocessPhase : Tools.GCC_PreprocessTool(),              Phases.CompilePhase : Tools.GCC_CompileTool(),              Phases.PrecompilePhase : Tools.GCC_PrecompileTool(),              Phases.AssemblePhase : Tools.DarwinAssembleTool(), -            Phases.LinkPhase : Tools.Darwin10_X86_LinkTool(), +            Phases.LinkPhase : Tools.Darwin_X86_LinkTool(darwinVersion, +                                                         gccVersion),              Phases.LipoPhase : Tools.LipoTool(),              } diff --git a/clang/tools/ccc/ccclib/Tools.py b/clang/tools/ccc/ccclib/Tools.py index 100344131fb..c5568e3c91f 100644 --- a/clang/tools/ccc/ccclib/Tools.py +++ b/clang/tools/ccc/ccclib/Tools.py @@ -144,10 +144,24 @@ class GCC_LinkTool(GCC_Common_Tool):                                                        output, outputType, args, arglist,                                                        []) -class Darwin10_X86_LinkTool(Tool): -    kCollect2Path = '/usr/libexec/gcc/i686-apple-darwin10/4.2.1/collect2' -    def __init__(self): -        super(Darwin10_X86_LinkTool, self).__init__('collect2') +class Darwin_X86_LinkTool(Tool): +    def __init__(self, darwinVersion, gccVersion): +        super(Darwin_X86_LinkTool, self).__init__('collect2') +        assert isinstance(darwinVersion, tuple) and len(darwinVersion) == 3 +        assert isinstance(gccVersion, tuple) and len(gccVersion) == 3 +        self.darwinVersion = darwinVersion +        self.gccVersion = gccVersion + +    def getCollect2Path(self): +        return '/usr/libexec/gcc/%s/collect2' % self.getToolChainDir() +         +    def getToolChainDir(self): +        return 'i686-apple-darwin%d/%s' % (self.darwinVersion[0], +                                           '.'.join(map(str,self.gccVersion))) + +    def getMacosxVersionMin(self): +        major,minor,minorminor = self.darwinVersion +        return '%d.%d.%d' % (10, major-4, minor)      def addDarwinArch(self, cmd_args, arch, arglist):          # Derived from darwin_arch spec. @@ -279,9 +293,7 @@ class Darwin10_X86_LinkTool(Tool):                  # following that; it must be getting over-ridden                  # somewhere.                  cmd_args.append('-macosx_version_min') -                # FIXME: De-hardcode. -                cmd_args.append('10.6.0') -                pass +                cmd_args.append(self.getMacosxVersionMin())          else:              # addAll doesn't make sense here but this is what gcc              # does. @@ -467,14 +479,15 @@ class Darwin10_X86_LinkTool(Tool):              cmd_args.append('-lgomp')          # FIXME: Derive these correctly. -        if arglist.getValue(arch) == 'x86_64': -            cmd_args.extend(["-L/usr/lib/gcc/i686-apple-darwin10/4.2.1/x86_64", -                             "-L/usr/lib/gcc/i686-apple-darwin10/4.2.1/x86_64"]) -        cmd_args.extend(["-L/usr/lib/i686-apple-darwin10/4.2.1", -                         "-L/usr/lib/gcc/i686-apple-darwin10/4.2.1", -                         "-L/usr/lib/gcc/i686-apple-darwin10/4.2.1", -                         "-L/usr/lib/gcc/i686-apple-darwin10/4.2.1/../../../i686-apple-darwin10/4.2.1", -                         "-L/usr/lib/gcc/i686-apple-darwin10/4.2.1/../../.."]) +        tcDir = self.getToolChainDir() +        if arglist.getValue(arch) == 'x86_64':             +            cmd_args.extend(["-L/usr/lib/gcc/%s/x86_64" % tcDir, +                             "-L/usr/lib/gcc/%s/x86_64" % tcDir]) +        cmd_args.extend(["-L/usr/lib/%s" % tcDir, +                         "-L/usr/lib/gcc/%s" % tcDir, +                         "-L/usr/lib/gcc/%s" % tcDir, +                         "-L/usr/lib/gcc/%s/../../../%s" % (tcDir,tcDir), +                         "-L/usr/lib/gcc/%s/../../.." % tcDir])          for input in inputs:              cmd_args.extend(arglist.renderAsInput(input.source)) @@ -531,7 +544,7 @@ class Darwin10_X86_LinkTool(Tool):          arglist.addAllArgs(cmd_args, arglist.parser.TOption)          arglist.addAllArgs(cmd_args, arglist.parser.FOption) -        jobs.addJob(Jobs.Command(self.kCollect2Path, cmd_args)) +        jobs.addJob(Jobs.Command(self.getCollect2Path(), cmd_args))          # FIXME: We need to add a dsymutil job here in some particular          # cases (basically whenever we have a c-family input we are | 

