在emacs中编译大项目

时间:2012-07-04 09:15:29

标签: emacs compilation

大型项目可能包含多个级别深度的目录。 Emacs的默认编译命令是"make -k",如果我修改了某个源代码,然后键入"M-x compile RET RET",它将在源代码所在的目录下执行"make -k"

我想我可以编写一个函数来确定Makefile是否存在于当前目录下,如果是,继续在父目录下搜索直到找到顶级目录,然后执行构建命令,这就像我期望的那样。

然而,我不是很清楚如何开始,有人能给我一些启示吗?就像我可能遇到的函数或变量一样。感谢。

4 个答案:

答案 0 :(得分:4)

您可以尝试使用以下内容:

(setq compile-command
      '(let ((mf (locate-dominating-file default-directory "Makefile")))
         (if mf (setq mf (file-name-directory mf)))
         (concat (if (and mf (not (equal mf default-directory)))
                     (format "cd %s; "
                             (shell-quote-argument
                              (file-relative-name
                               (directory-file-name mf)))))
                 "make -k ")))

答案 1 :(得分:3)

果酱中有smarter-compile

从文档....当您需要时,您可以指定一个缺点单元格列表,每个单元格都像(TEST . COMMAND)一样。

COMMAND用于compile-command时 TEST成功了。

TEST可以是:

  • 一个字符串。在这种情况下,它被用作正则表达式, 并与相关的文件名匹配 缓冲。当正则表达式匹配时,TEST成功。

  • 一个符号,代表主要模式​​。在这种情况下 如果缓冲区使用该主要模式,则为TEST 成功。

  • 一个符号,表示任何名称不是的函数 以\“ - mode \”结尾。在这种情况下,功能是 如果它返回非零,则为TEST 成功。

  • 表单列表。在这种情况下,表格是eval'd, 如果返回值为非零,则为TEST 成功。

所以你可以生成一个在父目录中扫描makefile的函数, 并将其用作您的测试。

根据文档,如果COMMAND为nil,则包使用TEST的结果作为编译命令。这意味着您只需要一个函数,返回一个make命令,引用相应目录中的makefile。

答案 2 :(得分:1)

看看:http://emacswiki.org/emacs/CompileCommand

直接来自emacs的

“C-h v compile-command”。

答案 3 :(得分:1)

对于喜欢使用Emacs Lisp的bash脚本的人来说,这是一个解决方案。在我的.emacs中,我定义了一个保存所有缓冲区并运行编译项目的bash脚本的命令。

(defun save-all-and-compile () (interactive)
 (save-some-buffers 1)
 (shell-command "make-and-run.sh &"))
(add-hook 'c-mode-common-hook (lambda ()
 (local-set-key (kbd "<f5>") 'save-all-and-compile)))

对于小型项目,脚本可以像

一样简单
#!/bin/bash
make -j && ./<main>

其中'main'是可执行文件的名称。对于较大的项目,首先需要找到根目录。同样,您可以使用不同的脚本(绑定到不同的键)来构建和运行程序。然后是一些用于测试项目不同部分的脚本。但这些只是人们可以自己解决的细节。

确保使用'&amp;'异步运行脚本。这样, Async Sh​​ell Command 缓冲区将打开make和你的项目的输出并保持打开状态。

修改

基于下面的讨论,似乎我最初推翻它并且解决方案非常简单。不是将通常的'make'或'make -k'传递给compile-command,而是可以使用shell脚本,该脚本首先导航到项目的根目录和构建。

(setq compile-command "script.sh")