4 # These are the compilation flags that will be used in case there's no
5 # compilation database set (by default, one is not set).
6 # CHANGE THIS LIST OF FLAGS. YES, THIS IS THE DROID YOU HAVE BEEN LOOKING FOR.
12 "-fno-strict-aliasing",
15 # ...and the same thing goes for the magic -x option which specifies the
16 # language that the files to be compiled are written in. This is mostly
17 # relevant for c++ headers.
18 # For a C project, you would set this to 'c' instead of 'c++'.
30 # Set this to the absolute path to the folder (NOT the file!) containing the
31 # compile_commands.json file to use that instead of 'flags'. See here for
32 # more details: http://clang.llvm.org/docs/JSONCompilationDatabase.html
34 # Most projects will NOT need to set this to anything; you can just change the
35 # 'flags' list of compilation flags. Notice that YCM itself uses that approach.
36 compilation_database_folder
= ""
38 if os
.path
.exists(compilation_database_folder
):
39 database
= ycm_core
.CompilationDatabase(compilation_database_folder
)
43 SOURCE_EXTENSIONS
= [".cc"]
46 def DirectoryOfThisScript():
47 return os
.path
.dirname(os
.path
.abspath(__file__
))
50 def MakeRelativePathsInFlagsAbsolute(flags
, working_directory
):
51 if not working_directory
:
54 make_next_absolute
= False
55 path_flags
= ["-isystem", "-I", "-iquote", "--sysroot="]
59 if make_next_absolute
:
60 make_next_absolute
= False
61 if not flag
.startswith("/"):
62 new_flag
= os
.path
.join(working_directory
, flag
)
64 for path_flag
in path_flags
:
66 make_next_absolute
= True
69 if flag
.startswith(path_flag
):
70 path
= flag
[len(path_flag
) :]
71 new_flag
= path_flag
+ os
.path
.join(working_directory
, path
)
75 new_flags
.append(new_flag
)
79 def IsHeaderFile(filename
):
80 extension
= os
.path
.splitext(filename
)[1]
81 return extension
in [".h", ".hxx", ".hpp", ".hh"]
84 def GetCompilationInfoForFile(filename
):
85 # The compilation_commands.json file generated by CMake does not have entries
86 # for header files. So we do our best by asking the db for flags for a
87 # corresponding source file, if any. If one exists, the flags for that file
88 # should be good enough.
89 if IsHeaderFile(filename
):
90 basename
= os
.path
.splitext(filename
)[0]
91 for extension
in SOURCE_EXTENSIONS
:
92 replacement_file
= basename
+ extension
93 if os
.path
.exists(replacement_file
):
94 compilation_info
= database
.GetCompilationInfoForFile(replacement_file
)
95 if compilation_info
.compiler_flags_
:
96 return compilation_info
98 return database
.GetCompilationInfoForFile(filename
)
101 def FlagsForFile(filename
, **kwargs
):
103 # Bear in mind that compilation_info.compiler_flags_ does NOT return a
104 # python list, but a "list-like" StringVec object
105 compilation_info
= GetCompilationInfoForFile(filename
)
106 if not compilation_info
:
109 final_flags
= MakeRelativePathsInFlagsAbsolute(
110 compilation_info
.compiler_flags_
, compilation_info
.compiler_working_dir_
113 relative_to
= DirectoryOfThisScript()
114 final_flags
= MakeRelativePathsInFlagsAbsolute(flags
, relative_to
)
116 return {"flags": final_flags
, "do_cache": True}