0

我正在使用 Flymake 进行 C 代码语法检查。如果 Makefile 和源文件位于同一目录下,则 Flymake 可以正常工作。但是如果 Makefile 在源代码的父目录中(就像在大多数 C 项目中一样),Flymake 似乎无法再找到 Makefile,并在*Flymake log*缓冲区中产生以下消息:

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

我使用的是 Flymake 的默认配置。用于测试的 C 源代码和 Makefile 列在本文末尾。我看到很多人都在为 Flymake 使用自定义的初始化函数。但我发现 Flymake 的默认初始化函数能够正确定位 Makefile,至少对于 C 项目是这样。例如,如果我flymake-proc-simple-make-initsrc/hello.c缓冲区内进行评估,我会收到以下消息:

("make" ("-s" "-C" "../" "CHK_SOURCES=src/hello_140332961481000_flymake.c" "SYNTAX_CHECK_MODE=1" "check-syntax"))

"-C" "../"部分表示它知道 Makefile 位于上一级目录中。我不知道为什么它最终没有工作。

我想要实现的是:

  1. 使 Flymake 适用于下面测试项目中的所有源代码文件。
  2. 尽可能少的定制。

任何帮助,将不胜感激。

$ 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
4

1 回答 1

0

经过一番研究,我找到了解决这个问题的方法。请注意,我对 Emacs 还是很陌生,所以这可能不是最好的解决方案。但它对我有用,并且需要很少的定制。欢迎任何更好的解决方案或进一步的改进。

在编辑 C 源代码时,我使用的是c-mode. 在c-mode中,Flymakeflymake-cc默认使用作为其后端,而不是传统proc模式。在这种情况下,flymake-cc-command是 Flymake 用来生成make用于语法检查的命令的命令。缓冲区flymake-cc-command的默认输出是src/hello.c

("make" "check-syntax" "CHK_SOURCES=-x c -c -")

这显然不会尝试定位Makefile当前目录以外的任何其他位置。

但我已经知道proc后端能够Makefile正确找到。为什么不将这两个后端结合起来?也许我可以用很少的努力实现我的目标。

然后我发现后端的flymake-proc--init-find-buildfile-dir功能proc是我需要的。它生成Makefile项目的路径,仅此而已。

这是我现在得到的自定义功能。与 的原始值几乎相同flymake-cc-command,只添加了一个新行。

(defun flymake-cc-init ()
  "Construct proper make command with CHK_SOURCES and the correct Makefile."
  `("make" "check-syntax" "-C"
    ,(flymake-proc--init-find-buildfile-dir (buffer-file-name) "Makefile")
    ,(format "CHK_SOURCES=-x %s -c -"
             (cond ((derived-mode-p 'c++-mode) "c++")
                   (t "c")))))
于 2021-10-13T06:07:32.730 回答