| @ -0,0 +1,103 @@ | |||
| import os | |||
| import ycm_core | |||
| from clang_helpers import PrepareClangFlags | |||
| # Set this to the absolute path to the folder (NOT the file!) containing the | |||
| # compile_commands.json file to use that instead of 'flags'. See here for | |||
| # more details: http://clang.llvm.org/docs/JSONCompilationDatabase.html | |||
| # Most projects will NOT need to set this to anything; you can just change the | |||
| # 'flags' list of compilation flags. Notice that YCM itself uses that approach. | |||
| compilation_database_folder = '' | |||
| # These are the compilation flags that will be used in case there's no | |||
| # compilation database set. | |||
| flags = [ | |||
| '-g', | |||
| '-Wall', | |||
| '-pthread', | |||
| '-fno-strict-aliasing', | |||
| '-I/usr/include/glib-2.0', | |||
| '-I/usr/lib/x86_64-linux-gnu/glib-2.0/include', | |||
| '-pthread', | |||
| '-I../kernel-module/', | |||
| '-D_GNU_SOURCE', | |||
| '-DMEDIAPROXY_VERSION="dummy"', | |||
| '-DMP_PLUGIN_DIR="/usr/lib/mediaproxy-ng"', | |||
| '-O2', | |||
| '-fstack-protector', | |||
| '--param=ssp-buffer-size=4', | |||
| '-Wformat', | |||
| '-Werror=format-security', | |||
| '-D_FORTIFY_SOURCE=2', | |||
| # THIS IS IMPORTANT! Without a "-std=<something>" flag, clang won't know which | |||
| # language to use when compiling headers. So it will guess. Badly. So C++ | |||
| # headers will be compiled as C headers. You don't want that so ALWAYS specify | |||
| # a "-std=<something>". | |||
| # For a C project, you would set this to something like 'c99' instead of | |||
| # 'c++11'. | |||
| '-std=c99', | |||
| # ...and the same thing goes for the magic -x option which specifies the | |||
| # language that the files to be compiled are written in. This is mostly | |||
| # relevant for c++ headers. | |||
| # For a C project, you would set this to 'c' instead of 'c++'. | |||
| '-x', | |||
| 'c', | |||
| ] | |||
| if compilation_database_folder: | |||
| database = ycm_core.CompilationDatabase( compilation_database_folder ) | |||
| else: | |||
| database = None | |||
| def DirectoryOfThisScript(): | |||
| return os.path.dirname( os.path.abspath( __file__ ) ) | |||
| def MakeRelativePathsInFlagsAbsolute( flags, working_directory ): | |||
| if not working_directory: | |||
| return 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 ): | |||
| if database: | |||
| # Bear in mind that compilation_info.compiler_flags_ does NOT return a | |||
| # python list, but a "list-like" StringVec object | |||
| compilation_info = database.GetCompilationInfoForFile( filename ) | |||
| final_flags = PrepareClangFlags( | |||
| MakeRelativePathsInFlagsAbsolute( | |||
| compilation_info.compiler_flags_, | |||
| compilation_info.compiler_working_dir_ ), | |||
| filename ) | |||
| else: | |||
| relative_to = DirectoryOfThisScript() | |||
| final_flags = MakeRelativePathsInFlagsAbsolute( flags, relative_to ) | |||
| return { | |||
| 'flags': final_flags, | |||
| 'do_cache': True | |||
| } | |||