forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			78 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			78 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
#!/usr/bin/env python
 | 
						|
 | 
						|
import os
 | 
						|
import sys
 | 
						|
import re
 | 
						|
import tempfile
 | 
						|
import shutil
 | 
						|
import stat
 | 
						|
from AppKit import *
 | 
						|
 | 
						|
def FindClangSpecs(path):
 | 
						|
  for root, dirs, files in os.walk(path):
 | 
						|
    for f in files:
 | 
						|
      if f.endswith(".xcspec") and f.startswith("Clang LLVM"):
 | 
						|
        yield os.path.join(root, f)
 | 
						|
 | 
						|
def ModifySpec(path, pathToChecker):
 | 
						|
  t = tempfile.NamedTemporaryFile(delete=False)
 | 
						|
  foundAnalyzer = False
 | 
						|
  with open(path) as f:
 | 
						|
    for line in f:
 | 
						|
      if not foundAnalyzer:
 | 
						|
        if line.find("Static Analyzer") >= 0:
 | 
						|
          foundAnalyzer = True
 | 
						|
      else:
 | 
						|
        m = re.search('^(\s*ExecPath\s*=\s*")', line)
 | 
						|
        if m:
 | 
						|
          line = "".join([m.group(0), pathToChecker, '";\n'])
 | 
						|
      t.write(line)
 | 
						|
  t.close()
 | 
						|
  print "(+) processing:", path
 | 
						|
  try:
 | 
						|
    shutil.copy(t.name, path)
 | 
						|
    os.chmod(path, stat.S_IRUSR | stat.S_IWUSR | stat.S_IRGRP | stat.S_IROTH)
 | 
						|
  except IOError, why:
 | 
						|
    print "    (-) Cannot update file:", why, "\n"
 | 
						|
  except OSError, why:
 | 
						|
    print "    (-) Cannot update file:", why, "\n"
 | 
						|
  os.unlink(t.name)
 | 
						|
 | 
						|
def main():
 | 
						|
  from optparse import OptionParser
 | 
						|
  parser = OptionParser('usage: %prog [options]')
 | 
						|
  parser.set_description(__doc__)
 | 
						|
  parser.add_option("--use-checker-build", dest="path",
 | 
						|
                    help="Use the Clang located at the provided absolute path, e.g. /Users/foo/checker-1")
 | 
						|
  parser.add_option("--use-xcode-clang", action="store_const", 
 | 
						|
                    const="$(CLANG)", dest="default",
 | 
						|
                    help="Use the Clang bundled with Xcode")
 | 
						|
  (options, args) = parser.parse_args()
 | 
						|
  if options.path is None and options.default is None:
 | 
						|
    parser.error("You must specify a version of Clang to use for static analysis.  Specify '-h' for details")
 | 
						|
 | 
						|
  # determine if Xcode is running
 | 
						|
  for x in NSWorkspace.sharedWorkspace().runningApplications():
 | 
						|
    if x.localizedName().find("Xcode") >= 0:
 | 
						|
      print "(-) You must quit Xcode first before modifying its configuration files."
 | 
						|
      return
 | 
						|
 | 
						|
  if options.path:
 | 
						|
    # Expand tildes.
 | 
						|
    path = os.path.expanduser(options.path)
 | 
						|
    if not path.endswith("clang"):
 | 
						|
      print "(+) Using Clang bundled with checker build:", path
 | 
						|
      path = os.path.join(path, "bin", "clang");
 | 
						|
    else:
 | 
						|
      print "(+) Using Clang located at:", path
 | 
						|
  else:
 | 
						|
    print "(+) Using the Clang bundled with Xcode"
 | 
						|
    path = options.default
 | 
						|
  
 | 
						|
  for x in FindClangSpecs('/Developer'):
 | 
						|
    ModifySpec(x, path)
 | 
						|
 | 
						|
if __name__ == '__main__':
 | 
						|
  main()
 | 
						|
 |