2012-03-12 4 views
14

Estoy tratando de compilar u-boot a través del modo de compilación de Emacs, y parece que Emacs no sabe cómo encontrar variables de entorno bash. Aunque los configuré y puedo compilar a través de la emulación de shell de Emacs, el modo de compilación todavía intenta compilarse como si no estuvieran allí.¿Cómo hago que Emacs reconozca las variables de entorno bash para la compilación?

¿Qué debo hacer para que sea más consciente del medio ambiente?

Respuesta

26

Usted puede tratar de añadir algo así como a su .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))) 

Dependiendo de si se ha configurado las variables env en .bash_profile o .bashrc se podría necesitar ajustar un poco este fragmento. El ejemplo es para la variable PATH, que es un poco más especial (ya que también debe establecer exec-path en Emacs), pero puede extenderse para trabajar con variables arbitrarias; podría tener una lista de variables que deben leerse desde .bashrc y configúralo en Emacs.

No estoy seguro de si está utilizando OS X o GNU/Linux. Iniciar Emacs desde la barra de menús de la GUI en Linux generalmente dará como resultado un Emacs que no tiene el mismo PATH que uno lanzado desde la línea de comando. Este problema se remonta a las primeras secuencias de comandos de Xsession xdm, y aunque son bastante fáciles de corregir (básicamente se usa una secuencia de comandos Xsessionwrapper que hace exec $SHELL -c Xsession para ejecutar la consola antes de ejecutar la Xsession del usuario), nadie se ha molestado en hacerlo en un tiempo (y dudo que alguien lo haga). Hasta donde sé, el problema está presente incluso en descendientes de xdm modernos como kdm y gdm.

En OS X, el manejo de las variables env es otro problema por completo y para obtener las variables ENV normalmente se tiene que ejecutar Emacs desde la línea de comando como este /Applications/Emacs.app/Contents/MacOS/Emacs o jugar con ~/.MacOSX/environment.plist. Sin embargo, el fragmento de código que he proporcionado debería cubrirlo en ambos casos.

actualización

Recientemente este proceso fue facilitado por la extensión exec-path-from-shell. Establece los emacs $PATH de más o menos la misma manera, pero usar una extensión generalmente es preferible a hackear la solución usted mismo.

+0

Esta resolver mi problema con Flymake no usar el Perl correcto desde perlbrew. A diferencia de perlbrew-mini.el – titanofold

+1

_exec-path-from-shell_ es excelente y resolvió mi problema con _ensime_ que no pudo iniciarse y arrojó el error 'type type incorrecto stringp nil'. – cyrillk

+0

¿Por qué usa split-string-and-unquote en lugar de split-string? –

1

No responde estrictamente a su pregunta, pero siempre puede pasar variables de entorno en la línea de comandos make. Por ejemplo: MxcompileRET RETmake -k CXXFLAGS='-Wall'

4

Aquí es donde las variables de entorno del proceso que se inició emacs son:

- Comando: getenv var

Esta función devuelve el valor de la variable entorno var, como una cadena . var debe ser una cadena. Si var no está definido en el entorno, getenv devuelve nil. Devuelve '' '' ' si var está establecido pero nulo. Dentro de Emacs, una lista de variables de entorno y sus valores se mantienen en la variable proceso-entorno.

 (getenv "USER") 
      ⇒ "lewis" 

- Variable: proceso con el medio

Esta variable es una lista de cadenas, cada describir una variable de entorno. Las funciones getenv y setenv funcionan mediante esta variable.

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

Usted parece ser el supuesto de que Emacs se inició a partir de una sesión de bash . Sin embargo, a menudo los procesos bajo X se inician desde una sesión sh, que sería no lea las variables de entorno que había establecido en su script ~/.bashrc. Una manera simple de eludir esto es cambiar su archivo ~/.xinitrc para usar bash en lugar de sh (podría ser tan simple como agregar #!/bin/bash en la parte superior del archivo).

Fuente: gnu.org

+1

¿Querías decir '#!/Bin/bash'? – Elena

+0

Gracias, @Elena. Fijo. :) – dmvianna

Cuestiones relacionadas