有没有简单/自动的方法来配置flycheck或flymake
在写入文件时显示错误注释
在Linux内核源代码树中?假设我正在努力
fs/proc/cmdline.c我想让flycheck掉下来
两个目录并执行“make fs/proc/cmdline.o”,然后
然后注释结果。假设ARCH和CROSS_COMPILE
在外部设置。

最佳答案

我一直在想自己做这个-这是我得到的:

您需要找到内核源代码树的基础,因此查找flymake的默认Makefile处理会适得其反。我们将添加自己的文件,该文件可用于查找源库和包装正常的内核makefile:

在内核源代码树的基础上添加一个文件flymake.mk(根据您自己的交叉编译需求进行配置):

ARCH=mips
CROSS_COMPILE=mips-linux-gnu-

export ARCH
export CROSS_COMPILE

.PHONY: check-syntax
check-syntax:
    make -f Makefile $(patsubst %_flymake.o,%.o,$(patsubst %.c,%.o,$(CHK_SOURCES)))

要点是删除“_flymake.c”,仅编译真实文件,并针对真实文件而不是仅针对语法构建文件。这样可以避免我们意外创建file_flymake.o
我们需要说服flymake查找flymake.mk并针对它运行check-syntax-将这些添加到您的.emacs中:
;; Build a custom command-line using flymake.mk
(defun flymake-get-kernel-make-cmdline (source base-dir)
  (list "make"
    (list "-s"
              "-f"
              "flymake.mk"
          "-C"
          base-dir
          (concat "CHK_SOURCES=" source)
          "SYNTAX_CHECK_MODE=1"
          "check-syntax")))

;; Search for flymake.mk to locate kernel tree base
(defun flymake-kernel-make-init ()
  (flymake-simple-make-init-impl 'flymake-create-temp-inplace t t "flymake.mk" 'flymake-get-kernel-make-cmdline))

;; Register against .c files under /linux/ or /kernel/
;; Since the list is parsed in order use `push`
(push '(".+/\\(linux\\|kernel\\)/.+\\.c$" flymake-kernel-make-init) flymake-allowed-file-name-masks)

局限性:
  • 无法解析头文件
  • 无法解析flymake临时文件source_flymake.c(请确保您忽略flymake标记,直到它遍历已保存的文件)。我的按键会强制重新运行flymake。
  • 外部模块中不支持flymake
  • 需要预先注册路径匹配器(请参见上面的push行)-我对flymake的了解不足,无法使其一次性覆盖单个缓冲区。

  • 头文件,临时文件和外部模块的限制可以通过修补内核Makefile本身来克服,目前我想避免这种情况。

    09-04 01:09