You are not logged in.

#1 2015-09-29 20:49:54

nivata
Member
Registered: 2014-05-30
Posts: 20

[SOLVED] Trouble configuring YouCompleteMe

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 found

Interestingly, 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

#2 2015-09-29 22:15:50

ewaller
Administrator
From: Pasadena, CA
Registered: 2009-07-13
Posts: 20,701

Re: [SOLVED] Trouble configuring YouCompleteMe

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

#3 2015-10-04 21:48:27

nivata
Member
Registered: 2014-05-30
Posts: 20

Re: [SOLVED] Trouble configuring YouCompleteMe

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

Board footer

Powered by FluxBB