On Tue, Jan 13, 2015 at 10:33:56PM +0100, Fabian Raetz wrote: > Hi, > > i've been using vim + YouCompleteMe [0] for some time know and it works > pretty well with OpenBSD's src tree. I want to share my > .ycm_extra_conf.py ([1] and below) with you. Maybe someone will > find it usefull. > > This configuration will gather compiler flags (CFLAGS / CPPFLAGS) > from the appropriate Makefiles and should work for userland as well as > the kernel. > > Just put .ycm_extra_conf.py under your SRCDIR (/usr/src) and follow the > HOWTO instructions which you can find in the .ycm_extra_conf.py file. > > This .ycm_extra_conf.py will probably work for other projects as long as > all relevant flags are in CFLAGS / CPPFLAGS. > > > > If someone knows a better solution to read variables from Makefiles, > let me know! :) > > Cheers, > Fabian > > > [0] - https://github.com/Valloric/YouCompleteMe > [1] - https://gist.github.com/Mischi/b8d57f8732b27239469a > > .ycm_extra_conf.py > ------------------------------ > > # Based on > # https://github.com/Valloric/ycmd/blob/master/cpp/ycm/.ycm_extra_conf.py > > ############################################# > # HOWTO > ############################################# > # > # =============== Step 1 ==================== > # > # For kernel .c files, CFLAGS / CPPFLAGS from > # the actual kernel configuration are used. > # These are gathered via uname(1). > # > # If you want a specific arch/config, override > # them with 'default_arch' / 'default_config' > # > # NOTE: The choosen kernel configuration must > # exist. > # > # =============== Step 2 ==================== > # > # The following target mimics 'make show' > # from bsd.port.mk(5) and is used to retrieve > # CFLAGS / CPPFLAGS variables from Makefiles. > # > # Copy & Paste the folloing make target > # into your /etc/mk.conf: > # > # myshow: > # .for v in ${myshowvar} > # @echo ${$v} > # .endfor > # > # > # .PHONY: myshow
Hmmpf, this breaks normal kernel/port builds. i'm not sure why .. needs some more work -_- > # > > import os > import ycm_core > > default_arch = None > default_config = None > > # You can add additional CFLAGS / CPPFLAGS here. > additional_userland_flags = [ > # "-Weverything" > ] > > additional_kernel_flags = [ > # "-Weverything" > ] > > srcdir = os.path.dirname( os.path.abspath( __file__ ) ) > sysdir = os.path.join(srcdir, "sys") > > 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 GetKernelFlags( darch, dconfig ): > if darch != None: > arch = darch > else: > arch = os.popen("uname -m").read().rstrip() > > if dconfig != None: > config = dconfig > else: > config = os.popen("uname -v").read().split('#')[0] > > makefiledir = "arch/%s/compile/%s" % ( arch, config ) > makefiledir = os.path.join(sysdir, makefiledir) > return GetFlags( makefiledir ) > > > def GetUserlandFlags( filename ): > makefiledir = os.path.dirname( filename ) > while not "Makefile" in os.listdir( makefiledir ): > makefiledir = os.path.join(makefiledir, "..") > > return GetFlags( makefiledir ) > > > def GetFlags( makefiledir ): > cd_cmd = "cd %s" % makefiledir > make_cmd = "make myshowvar=\"CFLAGS CPPFLAGS\" myshow" > make_flags = os.popen("%s && %s" % (cd_cmd, make_cmd)).read().split() > return MakeRelativePathsInFlagsAbsolute( make_flags, makefiledir ) > > > > > def FlagsForFile( filename ): > if filename.startswith( sysdir ): > final_flags = GetKernelFlags( default_arch , default_config ) > final_flags.extend( additional_kernel_flags ) > > elif filename.startswith( srcdir ): > final_flags = GetUserlandFlags( filename ) > final_flags.extend( additional_userland_flags ) > > return { > 'flags': final_flags, > 'do_cache': True > }