我试图通过Emacs的编译模式编译u-boot,但看起来Emacs不知道如何找到bash环境变量。即使我设置了它们,并且可以通过Emacs shell仿真进行编译,编译模式仍然会尝试像不存在它们一样进行编译。
我需要做些什么才能让它更有环保意识?
您可以尝试在.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的PATH
与从命令行启动的不同。这个问题可以追溯到第一个xdm
Xsession脚本,虽然它们很容易修复(基本上使用一个执行exec $SHELL -c Xsession
的Xsessionwrapper
脚本,这样shell就可以在运行用户的Xsession之前运行),但在很长一段时间内,没有人会这么做(我怀疑是否有人会这样做)。据我所知,即使是kdm
和gdm
这样的现代xdm后代也存在这个问题。
在OSX上,env变量的处理完全是另一个问题,要获得env变量,通常必须从命令行运行Emacs,如/Applications/Emacs.app/Contents/MacOS/Emacs
或使用~/.MacOSX/environment.plist
。不过,我提供的代码片段应该涵盖这两种情况。
更新
最近,shell扩展的exec路径使这个过程变得更容易。它以或多或少相同的方式设置emacs $PATH
,但使用扩展通常比自己破解解决方案更可取。
这是启动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
它并不能严格回答您的问题,但您始终可以在make
命令行上传递环境变量。例如:M-xcompile
RETmake -k CXXFLAGS='-Wall'