如何让Emacs识别bash环境变量进行编译?

时间:2012-03-12 07:51:46

标签: emacs compilation

我正在尝试通过Emacs的编译模式编译u-boot,看起来Emacs看起来不知道如何查找bash环境变量。即使我设置了它们,并且可以通过Emacs shell仿真进行编译,编译模式仍然会尝试编译,就好像它们不存在一样。

我需要做些什么来使其更具环保意识?

3 个答案:

答案 0 :(得分:28)

您可以尝试添加与.emacs

类似的内容
(let ((path (shell-command-to-string ". ~/.bashrc; echo -n $PATH")))
  (setenv "PATH" path)
  (setq exec-path 
        (append
         (split-string-and-unquote path ":")
         exec-path)))

根据您是否在.bash_profile.bashrc中设置了env变量,您可能需要稍微调整此代码段。该示例适用于PATH变量,这有点特别(因为您还必须在Emacs中设置exec-path),但可以扩展为适用于任意变量 - 您可以拥有一个列表必须从.bashrc读取并设置为Emacs的变量。

我不确定您是使用OS X还是GNU / Linux。从Linux的GUI菜单栏启动Emacs通常会导致Emacs与命令行启动的Emacs不同PATH。这个问题可以追溯到第一个xdm Xsession脚本,虽然它们很容易修复(基本上使用Xsessionwrapper脚本执行exec $SHELL -c Xsession所以shell在运行用户的Xsession之前运行),没有人在很长一段时间内这么做(我怀疑有人会这样做)。据我所知,问题甚至存在于现代xdm后代中,例如kdmgdm

在OS X上,env变量的处理完全是另一个问题,要获得ENV变量,通常必须从命令行运行Emacs,如/Applications/Emacs.app/Contents/MacOS/Emacs或使用~/.MacOSX/environment.plist。我提供的代码片段应该涵盖两种情况。

<强>更新

最近exec-path-from-shell扩展程序使这一过程变得更加容易。它以大致相同的方式设置emacs $PATH,但使用扩展名通常比自己破解解决方案更好。

答案 1 :(得分:4)

这是启动emacs的进程的环境变量:

  

- 命令: getenv var

     

此函数返回的值   环境变量var,作为字符串。 var应该是一个字符串。如果var   在环境中未定义,getenv返回nil。它返回'“”'   如果设置了var但是为null。在Emacs中,一个环境变量列表   并且它们的值保存在变量过程环境中。

      (getenv "USER")
           ⇒ "lewis"
     

- 变量:流程环境

     

这个变量是一个字符串列表,   每个描述一个环境变量。功能getenv和   setenv通过这个变量工作。

      process-environment
      ⇒ ("PATH=/usr/local/bin:/usr/bin:/bin"
          "USER=lewis"
          "TERM=xterm"
          "SHELL=/bin/bash"
          "HOME=/home/lewis"
          ...)

您似乎假设emacs是从 bash 会话启动的。但是,X下的流程通常是从 sh 会话开始的,这会读取您在~/.bashrc脚本中设置的环境变量。避免这种情况的一种简单方法是将~/.xinitrc文件更改为使用 bash 而不是 sh (这可能就像添加#!/bin/bash一样简单文件的顶部)。

来源:gnu.org

答案 2 :(得分:3)

它没有严格回答您的问题,但您始终可以在make命令行上传递环境变量。例如: M-x compile RET make -k CXXFLAGS='-Wall' RET