首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Flymake无法在父目录中找到Makefile

Flymake无法在父目录中找到Makefile
EN

Stack Overflow用户
提问于 2021-10-11 06:23:01
回答 1查看 108关注 0票数 2

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

代码语言:javascript
运行
复制
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,我得到以下消息:

代码语言:javascript
运行
复制
("make" ("-s" "-C" "../" "CHK_SOURCES=src/hello_140332961481000_flymake.c" "SYNTAX_CHECK_MODE=1" "check-syntax"))

"-C" "../"部分表示它知道Makefile位于一个级别的目录中。我不知道为什么它最终不起作用。

我想达到的目标是:

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

任何帮助都将不胜感激。

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

回答 1

Stack Overflow用户

发布于 2021-10-13 06:07:32

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

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

代码语言:javascript
运行
复制
("make" "check-syntax" "CHK_SOURCES=-x c -c -")

它显然不会尝试在除当前目录之外的任何其他位置定位Makefile

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

然后,我发现来自proc后端的proc函数正是我所需要的。它会生成项目的Makefile路径,而不会做更多的事情。

这是我现在得到的定制功能。与flymake-cc-command的原始值大致相同,只添加了一条新行。

代码语言:javascript
运行
复制
(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")))))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69521835

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档