我使用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使用定制的init函数。但是我发现Flymake的默认init函数能够正确定位Makefile,至少对于C项目是这样的。例如,如果我在flymake-proc-simple-make-init缓冲区中计算src/hello.c,我得到以下消息:
("make" ("-s" "-C" "../" "CHK_SOURCES=src/hello_140332961481000_flymake.c" "SYNTAX_CHECK_MODE=1" "check-syntax"))"-C" "../"部分表示它知道Makefile位于一个级别的目录中。我不知道为什么它最终不起作用。
我想达到的目标是:
任何帮助都将不胜感激。
$ 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发布于 2021-10-13 06:07:32
经过一番研究,我找到了解决这个问题的方法。请注意,我对Emacs仍然非常陌生,所以这可能不是最好的解决方案。但是它对我来说很管用,只需要很少的定制。欢迎任何更好的解决办法或进一步改进。
在编辑C源代码时,我使用的是c-mode。在c-mode中,Flymake默认使用flymake-cc作为后端,而不是传统的proc模式。在本例中,flymake-cc-command是Flymake用于生成用于语法检查的make命令的命令。flymake-cc-command在src/hello.c缓冲区上的默认输出是
("make" "check-syntax" "CHK_SOURCES=-x c -c -")它显然不会尝试在除当前目录之外的任何其他位置定位Makefile。
但是我已经知道proc后端能够正确地找到Makefile。为什么我不把这两个后端结合起来呢?也许我可以用很少的努力就能实现我的目标。
然后,我发现来自proc后端的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")))))https://stackoverflow.com/questions/69521835
复制相似问题