emacs - 为 cmake 配置 emacs

标签 emacs cmake

海湾合作委员会4.4.2 cmake 2.6

我刚刚开始使用cmake。来自编写我自己的 Makefile。

但是,我有这个目录结构并使用源外构建。将源文件与构建文件分开。

project
    src
        my_c_files.c
        CMakeLists.txt
    build
        Makefile

之前我会在 src 目录中编写自己的 Makefile,然后按 F5,然后我就能够编译我的程序了。 emacs 会列出所有警告或错误。但是,似乎我必须打开终端并转到构建目录才能运行

cmake ../src

然后

make

我想从 emacs 中运行 make,就像按 F5 一样。但是由于 Makefile 是在 build 目录中生成的,并且 emacs 正在 src 目录中查找它。

即使我设置了一个指向 src 目录中的 Makefile 的软链接(soft link)来链接到 build 目录中的 Makefile。这一切所做的只是给了我一个错误列表。

最佳答案

出于完全相同的目的,我发现.dir-locals.el非常有帮助,这是我的一个的样子:

((nil . ((tab-width . 8)
     (indent-tabs-mode . t)))
 (c++-mode . ((c-basic-offset . 8)
          (tab-width . 8)
          (indent-tabs-mode . t)
          (compile-command . "make -C ../build -j 2 run_tests")))
 ((c-mode . ((c-basic-offset . 8)
         (tab-width . 8)
         (indent-tabs-mode . t)
         (compile-command . "make -C ../build -j 2 run_tests")))))

显然,我可以根据位置在不同的 .dir_locals.el 中指定路径,例如,一些构建 run_tests 用于单元测试,一些构建真正的目标,等等。

然后我在构建目录中放置了一个虚拟 makefile ,如下所示:

all: run_tests

run_tests:
    @cmake ..
    @make -j 2

这样我就可以进行结帐,然后在我喜欢的任何文件中运行M-xcompile,它就会做正确的事情。我使用 git 并让 Makefile 从 git 的监控中忽略,如下所示:

git update-index --assume-unchanged Makefile

如果我想修改并提交它,我会这样做

git update-index --no-assume-unchanged Makefile

这样,cmake 新创建的 Makefile 就不会在 git status 中显示修改后的内容,而且我也不会意外提交它。

这种方法的好处:

  • 由于 cmake 在内部使用绝对路径,因此只需按 Enter 键即可跳过编译缓冲区中的编译错误,绝对没有问题。

  • 您可以在那里指定您想要的任何缩进规则,并且如果您愿意,它们在不同的项目甚至目录中可以不同:)

  • 您可以在不同的项目甚至目录中指定任意数量的目标,仍然使用相同的旧 M-x 编译(我将其绑定(bind)到 C-c b >) 并让 Emacs 做正确的事情

唯一的缺点是在你的子目录中有.dir-locals.el,我觉得这没什么不好。

编辑: robUK,回答您的评论:

这里是documentation对于每目录局部变量,正如他们在 Emacs 手册中所说的那样。它不是一个包,它是 Emacs 的一部分,尽管我不确定它是否在 23 之前的版本中可用,我使用的是 23.1.1。

编辑2: liwp,回答你的问题:

正如 Charles 已经指出的,以及文档所述:

If you put a file with a special name .dir-locals.el in a directory, Emacs will read it when it visits any file in that directory or any of its subdirectories, and apply the settings it specifies to the file's buffer. Emacs searches for .dir-locals.el starting in the directory of the visited file, and moving up the directory tree. (To avoid slowdown, this search is skipped for remote files.)

您不需要在项目树中的任何地方都使用.dir-locals.el。但请注意,这可能取决于代码库结构的复杂性。

我通常会选择一个相当简单的布局,如下所示:

/project_root_dir
    /build
    /src
    /test

我会在不同的.dir-locals.el中指定略有不同的目标,比如说在/test中我只会构建testrunner并执行它后,我会花费大部分开发时间来构建这个目标。然后在 /src 中,我首先构建相同的 testrunner,并执行它,如果一切顺利,它将构建我的主要项目目标。如果您不需要这个,您只需在 /project_root_dir 下放置一个 .dir-locals.el 就可以了。如果您的源结构和要求更加复杂,则可能意味着您需要更多与路径和目标相关的技巧。

关于emacs - 为 cmake 配置 emacs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2123669/

相关文章:

emacs - 什么时候通过 nREPL 重新加载命名空间还不够,需要重新启动整个服务器进程(甚至 REPL)?

emacs - 使用 Ace-Jump 在 emacs 中复制一行

macos - 如何从mac终端打开一个窗口

mysql - 无法从cygwin中的源代码构建mysql连接器/c(libmysql)

cmake - add_subdirectory() 不安装任何东西

c++ - CMake AMRCC + 自定义链接器

emacs 编辑 Rnw 在突出显示 R block 时保持区域突出显示

在 Emacs 下运行的 OCaml 顶层输入数据

linux - scp 后 C++ 可执行文件无法链接到共享库

windows - 在 cmake 查找模块中处理发布/调试库的最佳实践