【求助】Flymake 无法找到上级目录中的 Makefile

我想利用 Flymake 进行 C 代码语法检查。如果 Makefile 和 .c 源文件在同一目录下,一切工作正常。但如果像大多数 C 工程一样,Makefile 放在工程根目录,源代码在下级目录,Flymake 似乎会找不到 Makefile。请问,如何让 Flymake 可以找到上级目录的 Makefile?

使用以下文件测试(文件信息见末尾),在 main.c 里 Flymake 工作正常,可以检测到缺少分号的语法错误。但在 src/hello.c 里不行,mode line 中显示一个感叹号,提示 All backends disabled。打开 *Flymake log* buffer,可以看到消息:

Warning [flymake hello.c]: Disabling backend flymake-cc because make: *** No rule to make target `check-syntax'.  Stop.

我推测是没有找到 Makefile。 我的 Flymake 相关配置如下:

(remove-hook 'flymake-diagnostic-functions 'flymake-proc-legacy-flymake)
(setq flymake-proc-allowed-file-name-masks
      (cons '(".+\\.c$"
              flymake-proc-simple-make-init
              flymake-proc-simple-cleanup
              flymake-proc-real-file-name-considering-includes)
            flymake-proc-allowed-file-name-masks))

以下是测试文件。

$ tree .
.
|-- Makefile
|-- main.c
`-- src
    |-- hello.c
    `-- hello.h
# Makefile
INCLUDE=src
check-syntax:
	clang -fsyntax-only -Wall -I${INCLUDE} ${CHK_SOURCES} || true
/* main.c */
#include "hello.h"
int main(void)
{
    hello()
    return 0;
}
/* src/hello.c */
#include "hello.h"
#include <stdio.h>
void hello(void)
{
    printf("hello\n")
}
/* src/hello.h */
#ifndef HELLO_H
#define HELLO_H
void hello(void);
#endif

最新的 eglot 支持 通过 flymake 提供整个项目内的诊断信息,也许这个新特性可以解决你的问题。

谢谢。但我没有在用 eglot,以后也许会尝试一下。