From f0be2e0079a12e8a179c48c0abbfe2e84e963879 Mon Sep 17 00:00:00 2001 From: Bryan Biedenkapp Date: Sun, 14 Jan 2024 16:13:29 -0500 Subject: [PATCH] fix incorrect variable set in P25 SiteData; add VIM YouCompleteMe project configuration; --- .ycm_extra_conf.py | 201 +++++++++++++++++++++++++++++++++++++ contrib/.ycm_extra_conf.py | 201 +++++++++++++++++++++++++++++++++++++ src/common/p25/SiteData.h | 2 +- 3 files changed, 403 insertions(+), 1 deletion(-) create mode 100644 .ycm_extra_conf.py create mode 100644 contrib/.ycm_extra_conf.py diff --git a/.ycm_extra_conf.py b/.ycm_extra_conf.py new file mode 100644 index 00000000..c38095aa --- /dev/null +++ b/.ycm_extra_conf.py @@ -0,0 +1,201 @@ +import os +import os.path +import fnmatch +import logging +import ycm_core +import re + +BASE_FLAGS = [ + '-Wall', + '-Wextra', + '-Werror', + '-Wno-long-long', + '-Wno-variadic-macros', + '-fexceptions', + '-ferror-limit=10000', + '-DASIO_STANDALONE', + '-DENABLE_SETUP_TUI', + '-DHAVE_SENDMSG=1', + '-DHAVE_SENDMMSG=1', + '-std=c++14', + '-xc++', + '-Ibuild/_deps/asio-src/asio/include', + '-I/usr/lib/', + '-I/usr/include/', + '-Isrc', + '-Isrc/common', + '-Isrc/host', + '-Isrc/fne', + '-Isrc/monitor', + '-Isrc/remote' + ] + +SOURCE_EXTENSIONS = [ + '.cpp', + '.cxx', + '.cc', + '.c', + '.m', + '.mm' + ] + +SOURCE_DIRECTORIES = [ + 'src', + 'src/common', + 'src/fne', + 'src/host', + 'src/monitor', + 'src/remote' + ] + +HEADER_EXTENSIONS = [ + '.h', + '.hxx', + '.hpp', + '.hh' + ] + +HEADER_DIRECTORIES = [ + 'include', + 'src', + 'src/common', + 'src/host', + 'src/fne', + 'src/monitor', + 'src/remote' + ] + +BUILD_DIRECTORY = 'build'; + +def IsHeaderFile(filename): + extension = os.path.splitext(filename)[1] + return extension in HEADER_EXTENSIONS + +def GetCompilationInfoForFile(database, filename): + if IsHeaderFile(filename): + basename = os.path.splitext(filename)[0] + for extension in SOURCE_EXTENSIONS: + # Get info from the source files by replacing the extension. + replacement_file = basename + extension + if os.path.exists(replacement_file): + compilation_info = database.GetCompilationInfoForFile(replacement_file) + if compilation_info.compiler_flags_: + return compilation_info + # If that wasn't successful, try replacing possible header directory with possible source directories. + for header_dir in HEADER_DIRECTORIES: + for source_dir in SOURCE_DIRECTORIES: + src_file = replacement_file.replace(header_dir, source_dir) + if os.path.exists(src_file): + compilation_info = database.GetCompilationInfoForFile(src_file) + if compilation_info.compiler_flags_: + return compilation_info + return None + return database.GetCompilationInfoForFile(filename) + +def FindNearest(path, target, build_folder=None): + candidate = os.path.join(path, target) + if(os.path.isfile(candidate) or os.path.isdir(candidate)): + logging.info("Found nearest " + target + " at " + candidate) + return candidate; + + parent = os.path.dirname(os.path.abspath(path)); + if(parent == path): + raise RuntimeError("Could not find " + target); + + if(build_folder): + candidate = os.path.join(parent, build_folder, target) + if(os.path.isfile(candidate) or os.path.isdir(candidate)): + logging.info("Found nearest " + target + " in build folder at " + candidate) + return candidate; + + return FindNearest(parent, target, build_folder) + +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 FlagsForClangComplete(root): + try: + clang_complete_path = FindNearest(root, '.clang_complete') + clang_complete_flags = open(clang_complete_path, 'r').read().splitlines() + return clang_complete_flags + except: + return None + +def FlagsForInclude(root): + try: + include_path = FindNearest(root, 'include') + flags = [] + for dirroot, dirnames, filenames in os.walk(include_path): + flags = flags + ["-I" + dirroot] + for dir_path in dirnames: + real_path = os.path.join(dirroot, dir_path) + flags = flags + ["-I" + real_path] + return flags + except: + return None + +def FlagsForCompilationDatabase(root, filename): + try: + # Last argument of next function is the name of the build folder for + # out of source projects + compilation_db_path = FindNearest(root, 'compile_commands.json', BUILD_DIRECTORY) + compilation_db_dir = os.path.dirname(compilation_db_path) + logging.info("Set compilation database directory to " + compilation_db_dir) + compilation_db = ycm_core.CompilationDatabase(compilation_db_dir) + if not compilation_db: + logging.info("Compilation database file found but unable to load") + return None + compilation_info = GetCompilationInfoForFile(compilation_db, filename) + if not compilation_info: + logging.info("No compilation info for " + filename + " in compilation database") + return None + return MakeRelativePathsInFlagsAbsolute( + compilation_info.compiler_flags_, + compilation_info.compiler_working_dir_) + except: + return None + +def FlagsForFile(filename): + root = os.path.realpath(filename); + compilation_db_flags = FlagsForCompilationDatabase(root, filename) + if compilation_db_flags: + final_flags = compilation_db_flags + else: + final_flags = BASE_FLAGS + clang_flags = FlagsForClangComplete(root) + if clang_flags: + final_flags = final_flags + clang_flags + include_flags = FlagsForInclude(root) + if include_flags: + final_flags = final_flags + include_flags + return { + 'flags': final_flags, + 'do_cache': True + } + diff --git a/contrib/.ycm_extra_conf.py b/contrib/.ycm_extra_conf.py new file mode 100644 index 00000000..c38095aa --- /dev/null +++ b/contrib/.ycm_extra_conf.py @@ -0,0 +1,201 @@ +import os +import os.path +import fnmatch +import logging +import ycm_core +import re + +BASE_FLAGS = [ + '-Wall', + '-Wextra', + '-Werror', + '-Wno-long-long', + '-Wno-variadic-macros', + '-fexceptions', + '-ferror-limit=10000', + '-DASIO_STANDALONE', + '-DENABLE_SETUP_TUI', + '-DHAVE_SENDMSG=1', + '-DHAVE_SENDMMSG=1', + '-std=c++14', + '-xc++', + '-Ibuild/_deps/asio-src/asio/include', + '-I/usr/lib/', + '-I/usr/include/', + '-Isrc', + '-Isrc/common', + '-Isrc/host', + '-Isrc/fne', + '-Isrc/monitor', + '-Isrc/remote' + ] + +SOURCE_EXTENSIONS = [ + '.cpp', + '.cxx', + '.cc', + '.c', + '.m', + '.mm' + ] + +SOURCE_DIRECTORIES = [ + 'src', + 'src/common', + 'src/fne', + 'src/host', + 'src/monitor', + 'src/remote' + ] + +HEADER_EXTENSIONS = [ + '.h', + '.hxx', + '.hpp', + '.hh' + ] + +HEADER_DIRECTORIES = [ + 'include', + 'src', + 'src/common', + 'src/host', + 'src/fne', + 'src/monitor', + 'src/remote' + ] + +BUILD_DIRECTORY = 'build'; + +def IsHeaderFile(filename): + extension = os.path.splitext(filename)[1] + return extension in HEADER_EXTENSIONS + +def GetCompilationInfoForFile(database, filename): + if IsHeaderFile(filename): + basename = os.path.splitext(filename)[0] + for extension in SOURCE_EXTENSIONS: + # Get info from the source files by replacing the extension. + replacement_file = basename + extension + if os.path.exists(replacement_file): + compilation_info = database.GetCompilationInfoForFile(replacement_file) + if compilation_info.compiler_flags_: + return compilation_info + # If that wasn't successful, try replacing possible header directory with possible source directories. + for header_dir in HEADER_DIRECTORIES: + for source_dir in SOURCE_DIRECTORIES: + src_file = replacement_file.replace(header_dir, source_dir) + if os.path.exists(src_file): + compilation_info = database.GetCompilationInfoForFile(src_file) + if compilation_info.compiler_flags_: + return compilation_info + return None + return database.GetCompilationInfoForFile(filename) + +def FindNearest(path, target, build_folder=None): + candidate = os.path.join(path, target) + if(os.path.isfile(candidate) or os.path.isdir(candidate)): + logging.info("Found nearest " + target + " at " + candidate) + return candidate; + + parent = os.path.dirname(os.path.abspath(path)); + if(parent == path): + raise RuntimeError("Could not find " + target); + + if(build_folder): + candidate = os.path.join(parent, build_folder, target) + if(os.path.isfile(candidate) or os.path.isdir(candidate)): + logging.info("Found nearest " + target + " in build folder at " + candidate) + return candidate; + + return FindNearest(parent, target, build_folder) + +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 FlagsForClangComplete(root): + try: + clang_complete_path = FindNearest(root, '.clang_complete') + clang_complete_flags = open(clang_complete_path, 'r').read().splitlines() + return clang_complete_flags + except: + return None + +def FlagsForInclude(root): + try: + include_path = FindNearest(root, 'include') + flags = [] + for dirroot, dirnames, filenames in os.walk(include_path): + flags = flags + ["-I" + dirroot] + for dir_path in dirnames: + real_path = os.path.join(dirroot, dir_path) + flags = flags + ["-I" + real_path] + return flags + except: + return None + +def FlagsForCompilationDatabase(root, filename): + try: + # Last argument of next function is the name of the build folder for + # out of source projects + compilation_db_path = FindNearest(root, 'compile_commands.json', BUILD_DIRECTORY) + compilation_db_dir = os.path.dirname(compilation_db_path) + logging.info("Set compilation database directory to " + compilation_db_dir) + compilation_db = ycm_core.CompilationDatabase(compilation_db_dir) + if not compilation_db: + logging.info("Compilation database file found but unable to load") + return None + compilation_info = GetCompilationInfoForFile(compilation_db, filename) + if not compilation_info: + logging.info("No compilation info for " + filename + " in compilation database") + return None + return MakeRelativePathsInFlagsAbsolute( + compilation_info.compiler_flags_, + compilation_info.compiler_working_dir_) + except: + return None + +def FlagsForFile(filename): + root = os.path.realpath(filename); + compilation_db_flags = FlagsForCompilationDatabase(root, filename) + if compilation_db_flags: + final_flags = compilation_db_flags + else: + final_flags = BASE_FLAGS + clang_flags = FlagsForClangComplete(root) + if clang_flags: + final_flags = final_flags + clang_flags + include_flags = FlagsForInclude(root) + if include_flags: + final_flags = final_flags + include_flags + return { + 'flags': final_flags, + 'do_cache': True + } + diff --git a/src/common/p25/SiteData.h b/src/common/p25/SiteData.h index 869c2292..1b28cfd6 100644 --- a/src/common/p25/SiteData.h +++ b/src/common/p25/SiteData.h @@ -158,7 +158,7 @@ namespace p25 /// Channel count. void setChCnt(uint8_t chCnt) { - m_chCnt = m_chCnt; + m_chCnt = chCnt; } /// Helper to set the site network active flag.