From: Daniel Dunbar Date: Wed, 21 Jan 2009 02:03:52 +0000 (+0000) Subject: ccc: Implement file & path searching. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=768be1c162b8b22b625dac81b36a0a00ba4faf04;p=clang ccc: Implement file & path searching. - 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 --- diff --git a/tools/ccc/ccclib/Arguments.py b/tools/ccc/ccclib/Arguments.py index d9fd11d389..c79161ebae 100644 --- a/tools/ccc/ccclib/Arguments.py +++ b/tools/ccc/ccclib/Arguments.py @@ -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. diff --git a/tools/ccc/ccclib/Driver.py b/tools/ccc/ccclib/Driver.py index de4596bf2c..7f6082d953 100644 --- a/tools/ccc/ccclib/Driver.py +++ b/tools/ccc/ccclib/Driver.py @@ -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) diff --git a/tools/ccc/ccclib/ToolChain.py b/tools/ccc/ccclib/ToolChain.py index ee244d7ec0..20582a2b26 100644 --- a/tools/ccc/ccclib/ToolChain.py +++ b/tools/ccc/ccclib/ToolChain.py @@ -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) diff --git a/tools/ccc/ccclib/Tools.py b/tools/ccc/ccclib/Tools.py index 11a6047182..ae170d8ac2 100644 --- a/tools/ccc/ccclib/Tools.py +++ b/tools/ccc/ccclib/Tools.py @@ -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):