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