diff options
Diffstat (limited to 'ycm_extra_conf.py')
-rw-r--r-- | ycm_extra_conf.py | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/ycm_extra_conf.py b/ycm_extra_conf.py new file mode 100644 index 0000000..99c858d --- /dev/null +++ b/ycm_extra_conf.py @@ -0,0 +1,100 @@ +import os +import string +import re +import subprocess +import ycm_core + +def IsHeaderFile( filename ): + extension = os.path.splitext( filename )[ 1 ] + return extension in [ '.h', '.hxx', '.hpp', '.hh' ] + +def ContainsJamfile(path): + for file in os.listdir(path): + if file == 'Jamfile.jam': + return True + return False + +def FindOwningJamfile(filename): + path = os.path.dirname(filename) + while (not ContainsJamfile(path)) or (path == '/'): + path = os.path.dirname(path) + return path + +def ExpandBackTicks(line): + bts = re.search("^([^`]*)`([^`]*)`(.*)$", line) + if bts and (len(bts.groups()) >= 3): + p = subprocess.Popen(bts.group(2), shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + line = bts.group(1) + p.stdout.read() + bts.group(3); + return ExpandBackTicks(line) + return line + +def GetBJamCommandFlags(rtarget, target): + flags = [] + p = subprocess.Popen(['b2', '-and2', rtarget], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + for line in p.stdout.readlines(): + if string.lstrip(line).startswith('"g++"') and string.find(line, '"'+target+'"') > 0: + flags = [] + line = ExpandBackTicks(line) + args = string.split(line) + idx = 1 + while args[idx] != '-c': + flags.append(args[idx]) + idx += 1 + return flags + +def ApplyFlagQuirks(flags): + newflags = [] + for flag in flags: + qs = re.search('([^"]+)"([^"]*)"$', flag) + if qs: + flag = qs.group(1) + value = qs.group(2) + newflags.append(flag) + if (flag == '-I'): + newflags.append(os.path.abspath(value)) + else: + newflags.append(value) + elif flag != '-Werror': + newflags.append(flag) + return newflags + +def GuessAnIncluder(filename): + cpp = str.replace(filename, ".h", ".cpp") + if os.path.exists(cpp): + return cpp + + filename = os.path.abspath(filename) + basename = os.path.basename(filename) + dirname = os.path.dirname(filename) + p = subprocess.Popen(['grep', '-Ilrw', basename, dirname], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + f = p.stdout.readlines()[0].strip() + if IsHeaderFile(f): + return GuessAnIncluder(f) + return f + +def FlagsForFile( filename, **kwargs ): + if (IsHeaderFile(filename)): + filename = GuessAnIncluder(filename) + + filename = os.path.abspath(filename) + rootDir = FindOwningJamfile(filename) + target = str.replace(filename, rootDir + "/", "") + rtarget = str.replace(target, ".cpp", ".o") + + cwd = os.getcwd() + os.chdir(rootDir) + + flags = GetBJamCommandFlags(rtarget, target) + flags = ApplyFlagQuirks(flags) + + # Fall back to . for finding precompiled headers + flags.append("-I") + flags.append(os.path.dirname(filename)) + + os.chdir(cwd) + + return { + 'flags': flags, + 'do_cache': False + } + |