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
> }