2 changed files with 87 additions and 3 deletions
@ -0,0 +1,84 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
|
||||
|
import os |
||||
|
import subprocess |
||||
|
import re |
||||
|
|
||||
|
|
||||
|
def LoadSystemIncludes( filetype ): |
||||
|
regex = re.compile(r'(?:\#include \<...\> search starts here\:)(?P<list>.*?)(?:End of search list)', re.DOTALL) |
||||
|
process = subprocess.Popen(['clang', '-v', '-E', '-x', filetype, '-'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) |
||||
|
process_out, process_err = process.communicate('') |
||||
|
output = process_out + process_err |
||||
|
includes = [] |
||||
|
for p in re.search(regex, output.decode('utf-8')).group('list').split('\n'): |
||||
|
p = p.strip() |
||||
|
if len(p) > 0 and p.find('(framework directory)') < 0: |
||||
|
includes.append('-isystem') |
||||
|
includes.append(p) |
||||
|
return includes |
||||
|
|
||||
|
|
||||
|
def DirectoryOfThisScript(): |
||||
|
return os.path.dirname( os.path.abspath( __file__ ) ) |
||||
|
|
||||
|
|
||||
|
def MakeRelativePathsInFlagsAbsolute( flags, working_directory ): |
||||
|
if not working_directory: |
||||
|
return list( flags ) |
||||
|
new_flags = [] |
||||
|
make_next_absolute = False |
||||
|
path_flags = [ '-isystem', '-I', '-iquote', '--sysroot=' ] |
||||
|
for flag in flags: |
||||
|
new_flag = flag |
||||
|
|
||||
|
if make_next_absolute: |
||||
|
make_next_absolute = False |
||||
|
if not flag.startswith( '/' ): |
||||
|
new_flag = os.path.join( working_directory, flag ) |
||||
|
|
||||
|
for path_flag in path_flags: |
||||
|
if flag == path_flag: |
||||
|
make_next_absolute = True |
||||
|
break |
||||
|
|
||||
|
if flag.startswith( path_flag ): |
||||
|
path = flag[ len( path_flag ): ] |
||||
|
new_flag = path_flag + os.path.join( working_directory, path ) |
||||
|
break |
||||
|
|
||||
|
if new_flag: |
||||
|
new_flags.append( new_flag ) |
||||
|
return new_flags |
||||
|
|
||||
|
|
||||
|
def FlagsForFile(filename, **kwargs): |
||||
|
base_flags = [ |
||||
|
'-Wall', |
||||
|
'-Wextra', |
||||
|
'-Werror' |
||||
|
'-pedantic', |
||||
|
'-I', |
||||
|
'.' |
||||
|
] |
||||
|
extra_flags = [] |
||||
|
|
||||
|
data = kwargs['client_data'] |
||||
|
filetype = data['&filetype'] |
||||
|
|
||||
|
if filetype == 'c': |
||||
|
language = 'c' |
||||
|
elif filetype == 'cpp': |
||||
|
language = 'c++' |
||||
|
extra_flags += ['-std=c++11'] |
||||
|
elif filetype == 'objc': |
||||
|
language = 'objective-c' |
||||
|
|
||||
|
flags = base_flags + extra_flags + ['-x', language] + LoadSystemIncludes(language) |
||||
|
|
||||
|
relative_to = DirectoryOfThisScript() |
||||
|
final_flags = MakeRelativePathsInFlagsAbsolute( flags, relative_to ) |
||||
|
|
||||
|
return { |
||||
|
'flags': final_flags |
||||
|
} |
||||
Loading…
Reference in new issue