0

我正在尝试使用自定义初始化函数使 flymake 工作。首先,我需要它来使它在 linux 内核源代码上工作。我找到了一个stackoverflow 答案,它在项目的根目录中创建了一个 flymake.mk 并让 flymake 查找该文件,该文件仅包含 make 配方检查语法。

当然那没有用。Flymake 日志 说:*** No rule to make target 'check-syntax'. Stop.

所以我做了一个更简单的项目,只有一个 file.c 和一个 Makefile,使用默认的 flymake,效果很好。所以我从 Makefile 中删除了 check-syntax 部分,并将其放在 flymake.mk 中,所有三个文件都在同一个目录中。现在再次使用自定义初始化并且也不起作用。首先,我尝试查看是否选择了自定义 init,并且确实如此,当我运行时,(flymake-proc--get-file-name-mode-and-masks buffer-file-name)我得到了预期的结果:(flymake-kernel-make-init),但是当我运行时flymake-mode,“No rule to make target 'check-syntax'”错误产生然后当我(flymake-proc--get-file-name-mode-and-masks buffer-file-name)再次跑步时,我得到了零。这没有任何意义,因为 flymake-proc--get-file-name-mode-and-masks 仅取决于具有正则表达式和初始化函数的 alist。

有什么线索吗?

这是配置和flymake.mk

    (use-package flymake
      :config
      ;; 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-proc-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 '(".*" flymake-kernel-make-init) flymake-proc-allowed-file-name-masks))

正则表达式是故意的,只是为了确保它可以工作。

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

如果我make -s -f flymake.mk -C ./ CHK_SOURCES=test.c SYNTAX_CHECK_MODE=1 check-syntax从外壳运行它,这将有效

4

0 回答 0