Skip to content

Commit 8fd4b6a

Browse files
committed
Add YCM config
1 parent 0087e37 commit 8fd4b6a

File tree

1 file changed

+92
-0
lines changed

1 file changed

+92
-0
lines changed

.ycm_extra_conf.py

+92
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
# See LICENSE file for license
2+
3+
import os
4+
import ycm_core
5+
6+
7+
def DirectoryOfThisScript():
8+
return os.path.dirname( os.path.abspath( __file__ ) )
9+
10+
11+
project_dir = DirectoryOfThisScript()
12+
13+
try:
14+
with open('build/_3rdParty/Hunter/install-root-dir') as f:
15+
hunter_install_dir = f.readline()
16+
except IOError:
17+
# Ignore if file does not exist
18+
hunter_install_dir = ''
19+
20+
flags = [
21+
'-Wall',
22+
'-Werror',
23+
'-pedantic',
24+
'-std=c++11',
25+
'-x',
26+
'c++',
27+
'-DBOOST_COROUTINES_NO_DEPRECATION_WARNING=1',
28+
'-DGTEST_HAS_TR1_TUPLE=0',
29+
'-DGTEST_USE_OWN_TR1_TUPLE=0',
30+
'-isystem',
31+
'/usr/local/include',
32+
'-I',
33+
project_dir,
34+
'-I',
35+
os.path.join(project_dir, 'build')
36+
]
37+
38+
if hunter_install_dir:
39+
flags += ['-I', hunter_install_dir]
40+
41+
compilation_database_folder = os.path.join(project_dir, 'build')
42+
43+
if os.path.exists( compilation_database_folder ):
44+
database = ycm_core.CompilationDatabase( compilation_database_folder )
45+
else:
46+
database = None
47+
48+
SOURCE_EXTENSIONS = [ '.cpp', '.cxx', '.cc', '.c', '.m', '.mm' ]
49+
50+
51+
def IsHeaderFile( filename ):
52+
extension = os.path.splitext( filename )[ 1 ]
53+
return extension in [ '.h', '.hxx', '.hpp', '.hh' ]
54+
55+
56+
def GetCompilationInfoForFile( filename ):
57+
# The compilation_commands.json file generated by CMake does not have entries
58+
# for header files. So we do our best by asking the db for flags for a
59+
# corresponding source file, if any. If one exists, the flags for that file
60+
# should be good enough.
61+
if IsHeaderFile( filename ):
62+
basename = os.path.splitext( filename )[ 0 ]
63+
for extension in SOURCE_EXTENSIONS:
64+
replacement_file = basename + extension
65+
if os.path.exists( replacement_file ):
66+
compilation_info = database.GetCompilationInfoForFile(
67+
replacement_file )
68+
if compilation_info.compiler_flags_:
69+
return compilation_info
70+
return None
71+
return database.GetCompilationInfoForFile( filename )
72+
73+
74+
def FlagsForFile( filename, **kwargs ):
75+
if not database:
76+
return {
77+
'flags': flags,
78+
'include_paths_relative_to_dir': DirectoryOfThisScript()
79+
}
80+
81+
compilation_info = GetCompilationInfoForFile( filename )
82+
if not compilation_info:
83+
return None
84+
85+
# Bear in mind that compilation_info.compiler_flags_ does NOT return a
86+
# python list, but a "list-like" StringVec object.
87+
final_flags = list( compilation_info.compiler_flags_ )
88+
89+
return {
90+
'flags': final_flags,
91+
'include_paths_relative_to_dir': compilation_info.compiler_working_dir_
92+
}

0 commit comments

Comments
 (0)