You are not logged in.
Hi everyone,
I'm not sure where I should post this, but I'm getting a lot of trouble trying to configure YouCompleteMe with Vim, so I hope I'll get some help here.
I've installed YouCompleteMe from aur with yaourt, as indicated in the wiki. I'm trying to get projects generated with CMake to work using the exported "compile_commands.json" file that cmake can generate (I hope to use it in my more complex projects!). But so far even for simple toy examples I'm getting frustrating errors and I don't know how to solve them. As a minimal working example consider the following CMake project:
CMake_Minimum_Required(VERSION 2.8.11)
Project(mini)
Set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
Set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
Add_Executable(mini main.cpp)Along with the main C++ file:
#include <map>
int main(int argc, char** argv) {
std::map<int, int> m;
return 0;
}Now, for the .ycm_extra_conf.py, I use pretty much the standard stuff:
import os
import ycm_core
flags = []
# 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
#
# You can get CMake to generate this file for you by adding:
# set( CMAKE_EXPORT_COMPILE_COMMANDS 1 )
# to your CMakeLists.txt file.
#
# 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 = '/home/nivata/test-project/build'
if os.path.exists( compilation_database_folder ):
database = ycm_core.CompilationDatabase( compilation_database_folder )
else:
database = None
SOURCE_EXTENSIONS = [ '.cpp', '.cxx', '.cc', '.c', '.m', '.mm' ]
def DirectoryOfThisScript():
return os.path.dirname( os.path.abspath( __file__ ) )
def MakeRelativePathsInFlagsAbsolute( flags, working_directory ):
if not working_directory:
return list( 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 IsHeaderFile( filename ):
extension = os.path.splitext( filename )[ 1 ]
return extension in [ '.h', '.hxx', '.hpp', '.hh' ]
def GetCompilationInfoForFile( filename ):
# The compilation_commands.json file generated by CMake does not have entries
# for header files. So we do our best by asking the db for flags for a
# corresponding source file, if any. If one exists, the flags for that file
# should be good enough.
if IsHeaderFile( filename ):
basename = os.path.splitext( filename )[ 0 ]
for extension in SOURCE_EXTENSIONS:
replacement_file = basename + extension
if os.path.exists( replacement_file ):
compilation_info = database.GetCompilationInfoForFile(
replacement_file )
if compilation_info.compiler_flags_:
return compilation_info
return None
return database.GetCompilationInfoForFile( filename )
def FlagsForFile( filename, **kwargs ):
if database:
# Bear in mind that compilation_info.compiler_flags_ does NOT return a
# python list, but a "list-like" StringVec object
compilation_info = GetCompilationInfoForFile( filename )
if not compilation_info:
return None
final_flags = MakeRelativePathsInFlagsAbsolute(
compilation_info.compiler_flags_,
compilation_info.compiler_working_dir_ )
else:
relative_to = DirectoryOfThisScript()
final_flags = MakeRelativePathsInFlagsAbsolute( flags, relative_to )
return {
'flags': final_flags,
'do_cache': True
}And of course my folder /home/nivata/test-project/build contains the file 'compile_commands.json'. Now, what happens when I type ":YcmDiags" in vim when editing main.cpp is that I get the following error message:
/usr/include/wchar.h|39 col 11 error| 'stdarg.h' file not foundInterestingly, with the same setup, if I replace the "std::map" by a "std::vector", or if I remove the "-std=c++11" option from the CMakeLists.txt, it works well and :YcmDiags shows no error.
So, can anyone reproduce the same behavior? I'm a bit confused as to what to do right now. And the amount of errors shown by :YcmDiags grows when I try on bigger projects.
Last edited by nivata (2015-10-04 21:48:47)
Offline
Moving to AUR Issues, Discussion and PKGBUILD requests.
Nothing is too wonderful to be true, if it be consistent with the laws of nature -- Michael Faraday
The shortest way to ruin a country is to give power to demagogues.— Dionysius of Halicarnassus
---
How to Ask Questions the Smart Way
Offline
Bumping with self-response:
I switched from using the system clang library with the AUR package from using the clang library bundled within the package. Too bad the first option doesn't work out (don't know why though). For the record here is the modified PKGBUILD I used :
https://gist.github.com/anonymous/5140dedc94896456c3fb
More relevant discussions can be found in the AUR package comment thread:
https://aur.archlinux.org/packages/vim- … eteme-git/
Offline