1a290770fSMircea Trofinimport os 2*a5b79717SMircea Trofin 3a290770fSMircea Trofinimport ycm_core 4a290770fSMircea Trofin 5a290770fSMircea Trofin# These are the compilation flags that will be used in case there's no 6a290770fSMircea Trofin# compilation database set (by default, one is not set). 7a290770fSMircea Trofin# CHANGE THIS LIST OF FLAGS. YES, THIS IS THE DROID YOU HAVE BEEN LOOKING FOR. 8a290770fSMircea Trofinflags = [ 9f98ee40fSTobias Hieta "-Wall", 10f98ee40fSTobias Hieta "-Werror", 11f98ee40fSTobias Hieta "-pedantic-errors", 12f98ee40fSTobias Hieta "-std=c++0x", 13f98ee40fSTobias Hieta "-fno-strict-aliasing", 14f98ee40fSTobias Hieta "-O3", 15f98ee40fSTobias Hieta "-DNDEBUG", 16a290770fSMircea Trofin # ...and the same thing goes for the magic -x option which specifies the 17a290770fSMircea Trofin # language that the files to be compiled are written in. This is mostly 18a290770fSMircea Trofin # relevant for c++ headers. 19a290770fSMircea Trofin # For a C project, you would set this to 'c' instead of 'c++'. 20f98ee40fSTobias Hieta "-x", 21f98ee40fSTobias Hieta "c++", 22f98ee40fSTobias Hieta "-I", 23f98ee40fSTobias Hieta "include", 24f98ee40fSTobias Hieta "-isystem", 25f98ee40fSTobias Hieta "/usr/include", 26f98ee40fSTobias Hieta "-isystem", 27f98ee40fSTobias Hieta "/usr/local/include", 28a290770fSMircea Trofin] 29a290770fSMircea Trofin 30a290770fSMircea Trofin 31a290770fSMircea Trofin# Set this to the absolute path to the folder (NOT the file!) containing the 32a290770fSMircea Trofin# compile_commands.json file to use that instead of 'flags'. See here for 33a290770fSMircea Trofin# more details: http://clang.llvm.org/docs/JSONCompilationDatabase.html 34a290770fSMircea Trofin# 35a290770fSMircea Trofin# Most projects will NOT need to set this to anything; you can just change the 36a290770fSMircea Trofin# 'flags' list of compilation flags. Notice that YCM itself uses that approach. 37f98ee40fSTobias Hietacompilation_database_folder = "" 38a290770fSMircea Trofin 39a290770fSMircea Trofinif os.path.exists(compilation_database_folder): 40a290770fSMircea Trofin database = ycm_core.CompilationDatabase(compilation_database_folder) 41a290770fSMircea Trofinelse: 42a290770fSMircea Trofin database = None 43a290770fSMircea Trofin 44f98ee40fSTobias HietaSOURCE_EXTENSIONS = [".cc"] 45f98ee40fSTobias Hieta 46a290770fSMircea Trofin 47a290770fSMircea Trofindef DirectoryOfThisScript(): 48a290770fSMircea Trofin return os.path.dirname(os.path.abspath(__file__)) 49a290770fSMircea Trofin 50a290770fSMircea Trofin 51a290770fSMircea Trofindef MakeRelativePathsInFlagsAbsolute(flags, working_directory): 52a290770fSMircea Trofin if not working_directory: 53a290770fSMircea Trofin return list(flags) 54a290770fSMircea Trofin new_flags = [] 55a290770fSMircea Trofin make_next_absolute = False 56f98ee40fSTobias Hieta path_flags = ["-isystem", "-I", "-iquote", "--sysroot="] 57a290770fSMircea Trofin for flag in flags: 58a290770fSMircea Trofin new_flag = flag 59a290770fSMircea Trofin 60a290770fSMircea Trofin if make_next_absolute: 61a290770fSMircea Trofin make_next_absolute = False 62f98ee40fSTobias Hieta if not flag.startswith("/"): 63a290770fSMircea Trofin new_flag = os.path.join(working_directory, flag) 64a290770fSMircea Trofin 65a290770fSMircea Trofin for path_flag in path_flags: 66a290770fSMircea Trofin if flag == path_flag: 67a290770fSMircea Trofin make_next_absolute = True 68a290770fSMircea Trofin break 69a290770fSMircea Trofin 70a290770fSMircea Trofin if flag.startswith(path_flag): 71a290770fSMircea Trofin path = flag[len(path_flag) :] 72a290770fSMircea Trofin new_flag = path_flag + os.path.join(working_directory, path) 73a290770fSMircea Trofin break 74a290770fSMircea Trofin 75a290770fSMircea Trofin if new_flag: 76a290770fSMircea Trofin new_flags.append(new_flag) 77a290770fSMircea Trofin return new_flags 78a290770fSMircea Trofin 79a290770fSMircea Trofin 80a290770fSMircea Trofindef IsHeaderFile(filename): 81a290770fSMircea Trofin extension = os.path.splitext(filename)[1] 82f98ee40fSTobias Hieta return extension in [".h", ".hxx", ".hpp", ".hh"] 83a290770fSMircea Trofin 84a290770fSMircea Trofin 85a290770fSMircea Trofindef GetCompilationInfoForFile(filename): 86a290770fSMircea Trofin # The compilation_commands.json file generated by CMake does not have entries 87a290770fSMircea Trofin # for header files. So we do our best by asking the db for flags for a 88a290770fSMircea Trofin # corresponding source file, if any. If one exists, the flags for that file 89a290770fSMircea Trofin # should be good enough. 90a290770fSMircea Trofin if IsHeaderFile(filename): 91a290770fSMircea Trofin basename = os.path.splitext(filename)[0] 92a290770fSMircea Trofin for extension in SOURCE_EXTENSIONS: 93a290770fSMircea Trofin replacement_file = basename + extension 94a290770fSMircea Trofin if os.path.exists(replacement_file): 95*a5b79717SMircea Trofin compilation_info = database.GetCompilationInfoForFile( 96*a5b79717SMircea Trofin replacement_file 97*a5b79717SMircea Trofin ) 98a290770fSMircea Trofin if compilation_info.compiler_flags_: 99a290770fSMircea Trofin return compilation_info 100a290770fSMircea Trofin return None 101a290770fSMircea Trofin return database.GetCompilationInfoForFile(filename) 102a290770fSMircea Trofin 103a290770fSMircea Trofin 104a290770fSMircea Trofindef FlagsForFile(filename, **kwargs): 105a290770fSMircea Trofin if database: 106a290770fSMircea Trofin # Bear in mind that compilation_info.compiler_flags_ does NOT return a 107a290770fSMircea Trofin # python list, but a "list-like" StringVec object 108a290770fSMircea Trofin compilation_info = GetCompilationInfoForFile(filename) 109a290770fSMircea Trofin if not compilation_info: 110a290770fSMircea Trofin return None 111a290770fSMircea Trofin 112a290770fSMircea Trofin final_flags = MakeRelativePathsInFlagsAbsolute( 113*a5b79717SMircea Trofin compilation_info.compiler_flags_, 114*a5b79717SMircea Trofin compilation_info.compiler_working_dir_, 115f98ee40fSTobias Hieta ) 116a290770fSMircea Trofin else: 117a290770fSMircea Trofin relative_to = DirectoryOfThisScript() 118a290770fSMircea Trofin final_flags = MakeRelativePathsInFlagsAbsolute(flags, relative_to) 119a290770fSMircea Trofin 120f98ee40fSTobias Hieta return {"flags": final_flags, "do_cache": True} 121