我想利用 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