基于Emacs的交叉编译

基于Emacs的交叉编译,emacs,emacs23,Emacs,Emacs23,我如何在Emacs上创建/发出编译命令,以便不需要在它和控制台之间来回切换?我通常希望将编译过程视为Emacs命令: $ export PATH=/toolchain/gcc-linaro-arm-linux-gnueabihf-4.7/bin:$PATH $ cd my/project $ make CROSS_COMPILE=arm-linux-gnueabihf- all 我尝试按照下面的命令制作自己版本的M-x compile,但失败了,因为我对Lisp和Emacs的内部结构不够熟悉

我如何在Emacs上创建/发出编译命令,以便不需要在它和控制台之间来回切换?我通常希望将编译过程视为Emacs命令:

$ export PATH=/toolchain/gcc-linaro-arm-linux-gnueabihf-4.7/bin:$PATH
$ cd my/project 
$ make CROSS_COMPILE=arm-linux-gnueabihf- all
我尝试按照下面的命令制作自己版本的
M-x compile
,但失败了,因为我对Lisp和Emacs的内部结构不够熟悉。请注意,所讨论的项目是大的(即内核),有多个目录和Makefile,因此前面链接中描述的方法(最近的Makefile、默认目录等)不是解决方案。如果您可以将其绑定到一个键(如现代IDE上的Fx键),则可以获得额外的积分

另外,我知道有,但它已经过时,并且没有涵盖交叉编译问题,我希望现在有更好的解决方案。

Ctrl U Meta x compile应该询问您使用什么编译命令。您可以键入
make CROSS\u COMPILE=arm-linux-gnueabi-all

否则,可以在
~/.Emacs
中配置
编译命令
Emacs变量;您可以将其设置为文件局部变量

您可以在
~/.emacs
中输入以下未测试的行

 (load-library "compile")
 (global-set-key [f12] 'recompile)
 (setq compilation-command "make CROSS_COMPILE=arm-linux-gnueabihf all")
顺便说一句,您的
导出路径=
。。。例如,可以添加到
~/.bashrc
中,或者您可以让一个shell脚本使用适当的
路径运行精确的
make
,并将该脚本作为您的Emacs
编译命令(甚至可能是“临时的”,即仅在您的Emacs会话中)

Ctrl-U-Meta-x compile应该询问您要使用什么编译命令。您可以键入
make CROSS\u COMPILE=arm-linux-gnueabi-all

否则,可以在
~/.Emacs
中配置
编译命令
Emacs变量;您可以将其设置为文件局部变量

您可以在
~/.emacs
中输入以下未测试的行

 (load-library "compile")
 (global-set-key [f12] 'recompile)
 (setq compilation-command "make CROSS_COMPILE=arm-linux-gnueabihf all")

顺便说一句,您的
导出路径=
。。。例如,可以添加到
~/.bashrc
中,或者您可以让一个shell脚本使用适当的
路径运行精确的
make
,并将该脚本作为您的Emacs
编译命令(甚至可能是“临时的”,即仅在您的Emacs会话中)

您可以创建一个自定义函数,在特定目录中运行特定的编译命令,如下所示:

(defun my-compile ()
  (interactive)
  (let ((default-directory "~/my/project"))
    (compile "export PATH=/toolchain/gcc-linaro-arm-linux-gnueabihf-4.7/bin:$PATH && make CROSS_COMPILE=arm-linux-gnueabihf- all")))
然后将其绑定到某个方便的键:

(global-set-key [f12] 'my-compile)

您可以创建一个自定义函数,在特定目录中运行特定的编译命令,如下所示:

(defun my-compile ()
  (interactive)
  (let ((default-directory "~/my/project"))
    (compile "export PATH=/toolchain/gcc-linaro-arm-linux-gnueabihf-4.7/bin:$PATH && make CROSS_COMPILE=arm-linux-gnueabihf- all")))
然后将其绑定到某个方便的键:

(global-set-key [f12] 'my-compile)

这些天你为什么不使用emacs24呢?默认情况下,我的发行版没有emacs24包。不管怎么说,现在更新了,应该没有什么大的区别。为什么你现在不使用emacs24呢?默认情况下,我的发行版没有emacs24包。无论如何,现在已经更新了,应该没有什么大的区别。正如前面提到的,我已经尝试过使用这个命令,但这个解决方案仍然没有解决几个关键问题:1)如何添加工具链?2) 它仍然需要大量的键入和按键操作,关键是要有比切换到控制台更快的解决方案,是否可以设置默认值(目录、生成标志)或自动执行此过程?@KBart我想您只是忘记了在每次重新编译时使用
M-x recompile
而不是
M-x compile
。应该没有更多的类型。@Basile Starynkevitch,它仍然没有添加工具链,所以这个函数调用系统编译器。请看Legocia的回答,它几乎是正确的,唯一缺少的是正确的$PATH.Btw,将toolchain添加到~/.bashrc不是一个选项,因为我在不同的项目中使用了几个不同的工具。您可以添加一些调用
make
的脚本,并将其用作编译命令。如前所述,我尝试过使用此命令,但这个解决方案仍然没有解决几个关键问题:1)如何添加工具链?2) 它仍然需要大量的键入和按键操作,关键是要有比切换到控制台更快的解决方案,是否可以设置默认值(目录、生成标志)或自动执行此过程?@KBart我想您只是忘记了在每次重新编译时使用
M-x recompile
而不是
M-x compile
。应该没有更多的类型。@Basile Starynkevitch,它仍然没有添加工具链,所以这个函数调用系统编译器。请看Legocia的回答,几乎是正确的,唯一缺少的是正确的$PATH.Btw,将toolchain添加到~/.bashrc不是一个选项,因为我在不同的项目中使用了一些不同的工具。您可以添加一些调用
make
的脚本,并将其用作编译命令。在~/.emacs中添加了这些行,但当我按下F12时,出现了一个错误:错误的类型参数:commandp,我的编译器,我忘记了
(交互式)
,它允许函数绑定到一个键。请参见edit.make,它使用正确的参数调用,但找不到工具链。我试图添加setenv“PATH”和setq exec PATH,但没有效果。在~/.emacs中添加了这些行,但当我按F12时,出现了一个错误:错误的类型参数:commandp,我的编译器,我忘记了
(交互式)
,它允许函数绑定到键。请参见edit.make,它使用正确的参数调用,但找不到工具链。我试图添加setenv“PATH”和setq exec PATH,但没有效果。