]> granicus.if.org Git - clang/commitdiff
ccc: Implement file & path searching.
authorDaniel Dunbar <daniel@zuster.org>
Wed, 21 Jan 2009 02:03:52 +0000 (02:03 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Wed, 21 Jan 2009 02:03:52 +0000 (02:03 +0000)
 - Toolchain is responsible for providing list of prefixes to search.

 - Implement -print-file-name=xxx and -print-prog-name=xxx driver options.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@62659 91177308-0d34-0410-b5e6-96231b3b80d8

tools/ccc/ccclib/Arguments.py
tools/ccc/ccclib/Driver.py
tools/ccc/ccclib/ToolChain.py
tools/ccc/ccclib/Tools.py

index d9fd11d389729440a5b77cfd293ebf70de337682..c79161ebae9e676440ee98f6b4a493b23a9250cd 100644 (file)
@@ -475,7 +475,7 @@ class OptionParser:
         self.dumpversionOption = self.addOption(FlagOption('-dumpversion'))
         self.dumpmachineOption = self.addOption(FlagOption('-dumpmachine'))
         self.printSearchDirsOption = self.addOption(FlagOption('-print-search-dirs'))
-        self.printLibgccFilenameOption = self.addOption(FlagOption('-print-libgcc-file-name'))
+        self.printLibgccFileNameOption = self.addOption(FlagOption('-print-libgcc-file-name'))
         # FIXME: Hrm, where does this come from? It isn't always true that
         # we take both - and --. For example, gcc --S ... ends up sending
         # -fS to cc1. Investigate.
index de4596bf2c0df3d343f7121ae312ca1fc61f3a57..7f6082d953ce64905a18d76fb2cbee48e35ac583 100644 (file)
@@ -78,6 +78,24 @@ class Driver(object):
 
     ###
 
+    def getFilePath(self, name, toolChain=None):
+        tc = toolChain or self.toolChain
+        for p in tc.filePathPrefixes:
+            path = os.path.join(p, name)
+            if os.path.exists(path):
+                return path
+        return name
+
+    def getProgramPath(self, name, toolChain=None):
+        tc = toolChain or self.toolChain
+        for p in tc.programPathPrefixes:
+            path = os.path.join(p, name)
+            if os.path.exists(path):
+                return path
+        return name
+
+    ###
+
     def run(self, argv):
         # FIXME: Things to support from environment: GCC_EXEC_PREFIX,
         # COMPILER_PATH, LIBRARY_PATH, LPATH, CC_PRINT_OPTIONS,
@@ -287,50 +305,32 @@ class Driver(object):
         # FIXME: Do we want to report "argument unused" type errors in the
         # presence of things like -dumpmachine and -print-search-dirs?
         # Probably not.
-        arg = args.getLastArg(self.parser.dumpmachineOption)
+        arg = (args.getLastArg(self.parser.dumpmachineOption) or
+               args.getLastArg(self.parser.dumpversionOption) or
+               args.getLastArg(self.parser.printSearchDirsOption))
         if arg:
-            print 'FIXME: %s' % arg.opt.name
-            sys.exit(1)
+            raise NotImplementedError('%s unsupported' % arg.opt.name)
 
-        arg = args.getLastArg(self.parser.dumpspecsOption)
+        arg = (args.getLastArg(self.parser.dumpspecsOption) or
+               args.getLastArg(self.parser.printMultiDirectoryOption) or
+               args.getLastArg(self.parser.printMultiLibOption))
         if arg:
-            print 'FIXME: %s' % arg.opt.name
-            sys.exit(1)
-
-        arg = args.getLastArg(self.parser.dumpversionOption)
-        if arg:
-            print 'FIXME: %s' % arg.opt.name
-            sys.exit(1)
+            raise Arguments.InvalidArgumentsError('%s unsupported by this driver' % arg.opt.name)
 
         arg = args.getLastArg(self.parser.printFileNameOption)
         if arg:
-            print 'FIXME: %s' % arg.opt.name
-            sys.exit(1)
-
-        arg = args.getLastArg(self.parser.printMultiDirectoryOption)
-        if arg:
-            print 'FIXME: %s' % arg.opt.name
-            sys.exit(1)
-
-        arg = args.getLastArg(self.parser.printMultiLibOption)
-        if arg:
-            print 'FIXME: %s' % arg.opt.name
-            sys.exit(1)
+            print self.getFilePath(args.getValue(arg))
+            sys.exit(0)
 
         arg = args.getLastArg(self.parser.printProgNameOption)
         if arg:
-            print 'FIXME: %s' % arg.opt.name
-            sys.exit(1)
-
-        arg = args.getLastArg(self.parser.printLibgccFilenameOption)
-        if arg:
-            print 'FIXME: %s' % arg.opt.name
-            sys.exit(1)
+            print self.getProgramPath(args.getValue(arg))
+            sys.exit(0)
 
-        arg = args.getLastArg(self.parser.printSearchDirsOption)
+        arg = args.getLastArg(self.parser.printLibgccFileNameOption)
         if arg:
-            print 'FIXME: %s' % arg.opt.name
-            sys.exit(1)
+            print self.getFilePath('libgcc.a')
+            sys.exit(0)
 
     def buildNormalPipeline(self, args):
         hasAnalyze = args.getLastArg(self.parser.analyzeOption)
index ee244d7ec0bc4b3668cc12b5ba3792b651e3af27..20582a2b2675598f5acf02670cee9744dd065f31 100644 (file)
@@ -1,3 +1,5 @@
+import os
+
 import Arguments
 import Phases
 import Tools
@@ -8,8 +10,18 @@ import Types
 class ToolChain(object):
     """ToolChain - Provide mappings of Actions to Tools."""
 
-    def __init__(self, driver):
+    def __init__(self, driver, 
+                 filePathPrefixes=[],
+                 programPathPrefixes=[]):
         self.driver = driver
+        self.filePathPrefixes = list(filePathPrefixes)
+        self.programPathPrefixes = list(programPathPrefixes)
+
+    def getFilePath(self, name):
+        return self.driver.getFilePath(name, self)
+        
+    def getProgramPath(self, name):
+        return self.driver.getProgramPath(name, self)
 
     def selectTool(self, action):
         """selectTool - Return a Tool instance to use for handling
@@ -63,14 +75,25 @@ class Darwin_X86_ToolChain(ToolChain):
             Phases.LipoPhase : Tools.LipoTool(),
             }
 
+        self.filePathPrefixes.append(os.path.join(self.driver.driverDir,
+                                                  '../lib/gcc',
+                                                  self.getToolChainDir()))
+        self.filePathPrefixes.append(os.path.join(self.driver.driverDir,
+                                                  '/usr/lib/gcc',
+                                                  self.getToolChainDir()))
+
+        self.programPathPrefixes.append(os.path.join(self.driver.driverDir,
+                                                  '../libexec/gcc',
+                                                  self.getToolChainDir()))
+        self.programPathPrefixes.append(os.path.join(self.driver.driverDir,
+                                                  '/usr/libexec/gcc',
+                                                  self.getToolChainDir()))
+        self.programPathPrefixes.append(self.driver.driverDir)
+
     def getToolChainDir(self):
         return 'i686-apple-darwin%d/%s' % (self.darwinVersion[0],
                                            '.'.join(map(str,self.gccVersion)))
 
-    def getProgramPath(self, name):
-        # FIXME: Implement proper search.
-        return '/usr/libexec/gcc/%s/%s' % (self.getToolChainDir(), name)
-
     def getMacosxVersionMin(self):
         major,minor,minorminor = self.darwinVersion
         return '%d.%d.%d' % (10, major-4, minor)
index 11a6047182a04e7bf3b4fd351381be93d3b3c479..ae170d8ac2f98fa0eb33d72a211bc4377e26fbd7 100644 (file)
@@ -285,7 +285,8 @@ class Clang_CompileTool(Tool):
             else:
                 cmd_args.extend(arglist.renderAsInput(input.source))
             
-        jobs.addJob(Jobs.Command('clang', cmd_args))
+        jobs.addJob(Jobs.Command(self.toolChain.getProgramPath('clang'), 
+                                 cmd_args))
         
 class Darwin_X86_CC1Tool(Tool):
     def getCC1Name(self, type):