LILAC
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
.ycm_extra_conf.py
Go to the documentation of this file.
1 # This file is NOT licensed under the GPLv3, which is the license for the rest
2 # of YouCompleteMe.
3 #
4 # Here's the license text for this file:
5 #
6 # This is free and unencumbered software released into the public domain.
7 #
8 # Anyone is free to copy, modify, publish, use, compile, sell, or
9 # distribute this software, either in source code form or as a compiled
10 # binary, for any purpose, commercial or non-commercial, and by any
11 # means.
12 #
13 # In jurisdictions that recognize copyright laws, the author or authors
14 # of this software dedicate any and all copyright interest in the
15 # software to the public domain. We make this dedication for the benefit
16 # of the public at large and to the detriment of our heirs and
17 # successors. We intend this dedication to be an overt act of
18 # relinquishment in perpetuity of all present and future rights to this
19 # software under copyright law.
20 #
21 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22 # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23 # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
24 # IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
25 # OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
26 # ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
27 # OTHER DEALINGS IN THE SOFTWARE.
28 #
29 # For more information, please refer to <http://unlicense.org/>
30 
31 import os
32 import ycm_core
33 
34 # These are the compilation flags that will be used in case there's no
35 # compilation database set (by default, one is not set).
36 # CHANGE THIS LIST OF FLAGS. YES, THIS IS THE DROID YOU HAVE BEEN LOOKING FOR.
37 flags = [
38 '-Wall',
39 '-Wextra',
40 '-Wno-long-long',
41 '-fexceptions',
42 '-I../utils',
43 '-I../',
44 # You 100% do NOT need -DUSE_CLANG_COMPLETER in your flags; only the YCM
45 # source code needs it.
46 '-DUSE_CLANG_COMPLETER',
47 # THIS IS IMPORTANT! Without a "-std=<something>" flag, clang won't know which
48 # language to use when compiling headers. So it will guess. Badly. So C++
49 # headers will be compiled as C headers. You don't want that so ALWAYS specify
50 # a "-std=<something>".
51 # For a C project, you would set this to something like 'c99' instead of
52 # 'c++11'.
53 '-std=c++11',
54 # ...and the same thing goes for the magic -x option which specifies the
55 # language that the files to be compiled are written in. This is mostly
56 # relevant for c++ headers.
57 # For a C project, you would set this to 'c' instead of 'c++'.
58 '-x',
59 'c++',
60 '-isystem',
61 '../BoostParts',
62 '-isystem',
63 # This path will only work on OS X, but extra paths that don't exist are not
64 # harmful
65 '/System/Library/Frameworks/Python.framework/Headers',
66 '-isystem',
67 '../llvm/include',
68 '-isystem',
69 '../llvm/tools/clang/include',
70 '-I',
71 '.',
72 '-I',
73 './ClangCompleter',
74 '-isystem',
75 './tests/gmock/gtest',
76 '-isystem',
77 './tests/gmock/gtest/include',
78 '-isystem',
79 './tests/gmock',
80 '-isystem',
81 './tests/gmock/include'
82 ]
83 
84 
85 # Set this to the absolute path to the folder (NOT the file!) containing the
86 # compile_commands.json file to use that instead of 'flags'. See here for
87 # more details: http://clang.llvm.org/docs/JSONCompilationDatabase.html
88 #
89 # Most projects will NOT need to set this to anything; you can just change the
90 # 'flags' list of compilation flags. Notice that YCM itself uses that approach.
91 compilation_database_folder = ''
92 
93 if os.path.exists( compilation_database_folder ):
94  database = ycm_core.CompilationDatabase( compilation_database_folder )
95 else:
96  database = None
97 
98 SOURCE_EXTENSIONS = [ '.hpp', 'h', '.cpp', '.cxx', '.cc', '.c', '.m', '.mm' ]
99 
101  return os.path.dirname( os.path.abspath( __file__ ) )
102 
103 
104 def MakeRelativePathsInFlagsAbsolute( flags, working_directory ):
105  if not working_directory:
106  return list( flags )
107  new_flags = []
108  make_next_absolute = False
109  path_flags = [ '-isystem', '-I', '-iquote', '--sysroot=' ]
110  for flag in flags:
111  new_flag = flag
112 
113  if make_next_absolute:
114  make_next_absolute = False
115  if not flag.startswith( '/' ):
116  new_flag = os.path.join( working_directory, flag )
117 
118  for path_flag in path_flags:
119  if flag == path_flag:
120  make_next_absolute = True
121  break
122 
123  if flag.startswith( path_flag ):
124  path = flag[ len( path_flag ): ]
125  new_flag = path_flag + os.path.join( working_directory, path )
126  break
127 
128  if new_flag:
129  new_flags.append( new_flag )
130  return new_flags
131 
132 
133 def IsHeaderFile( filename ):
134  extension = os.path.splitext( filename )[ 1 ]
135  return extension in [ '.h', '.hxx', '.hpp', '.hh' ]
136 
137 
139  # The compilation_commands.json file generated by CMake does not have entries
140  # for header files. So we do our best by asking the db for flags for a
141  # corresponding source file, if any. If one exists, the flags for that file
142  # should be good enough.
143  if IsHeaderFile( filename ):
144  basename = os.path.splitext( filename )[ 0 ]
145  for extension in SOURCE_EXTENSIONS:
146  replacement_file = basename + extension
147  if os.path.exists( replacement_file ):
148  compilation_info = database.GetCompilationInfoForFile(
149  replacement_file )
150  if compilation_info.compiler_flags_:
151  return compilation_info
152  return None
153  return database.GetCompilationInfoForFile( filename )
154 
155 
156 def FlagsForFile( filename, **kwargs ):
157  if database:
158  # Bear in mind that compilation_info.compiler_flags_ does NOT return a
159  # python list, but a "list-like" StringVec object
160  compilation_info = GetCompilationInfoForFile( filename )
161  if not compilation_info:
162  return None
163 
164  final_flags = MakeRelativePathsInFlagsAbsolute(
165  compilation_info.compiler_flags_,
166  compilation_info.compiler_working_dir_ )
167 
168  # NOTE: This is just for YouCompleteMe; it's highly likely that your project
169  # does NOT need to remove the stdlib flag. DO NOT USE THIS IN YOUR
170  # ycm_extra_conf IF YOU'RE NOT 100% SURE YOU NEED IT.
171  try:
172  final_flags.remove( '-stdlib=libc++' )
173  except ValueError:
174  pass
175  else:
176  relative_to = DirectoryOfThisScript()
177  final_flags = MakeRelativePathsInFlagsAbsolute( flags, relative_to )
178 
179  return {
180  'flags': final_flags,
181  'do_cache': True
182  }