Как заставить Emacs распознавать переменные окружения bash для компиляции? - PullRequest
17 голосов
/ 12 марта 2012

Я пытаюсь скомпилировать u-boot через режим компиляции Emacs, и похоже, что Emacs не знает, как найти переменные окружения bash. Несмотря на то, что я установил их и могу компилировать с помощью эмуляции оболочки Emacs, режим компиляции все равно пытается компилировать, как будто их там нет.

Что мне нужно сделать, чтобы сделать его более сознательным в отношении окружающей среды?

Ответы [ 3 ]

28 голосов
/ 12 марта 2012

Вы можете попробовать добавить что-то похожее на .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)))

В зависимости от того, установлены ли переменные env в .bash_profile или .bashrc, вам может потребоваться немного изменить этот фрагмент. Пример приведен для переменной PATH, которая является немного более особенной (поскольку вы также должны установить exec-path в Emacs), но может быть расширена для работы с произвольными переменными - у вас может быть список переменных, которые имеют быть прочитанным из .bashrc и установленным в Emacs.

Я не уверен, используете ли вы OS X или GNU / Linux. Запуск Emacs из строки меню графического интерфейса в Linux обычно приводит к тому, что Emacs не имеет тот же PATH, что и тот, который запускается из командной строки. Эта проблема восходит к первым xdm сценариям Xsession, и, хотя их довольно легко исправить (в основном используется сценарий Xsessionwrapper, который выполняет exec $SHELL -c Xsession, поэтому оболочка запускается до запуска пользовательского Xsession), никто не потрудился сделать это в течение очень долгого времени (и я сомневаюсь, что кто-нибудь будет). Насколько я знаю, проблема присутствует даже в потомках модера xdm, таких как kdm и gdm.

В OS X обработка переменных env - это еще одна проблема, и чтобы получить переменные ENV, вам, как правило, приходится запускать Emacs из командной строки, например, /Applications/Emacs.app/Contents/MacOS/Emacs или играть с ~/.MacOSX/environment.plist. Приведенный фрагмент кода должен охватывать вас в обоих случаях.

Обновление

Недавно этот процесс был упрощен расширением exec-path-from-shell . Он устанавливает emacs $PATH более или менее таким же образом, но использование расширения обычно предпочтительнее взлома решения самостоятельно.

4 голосов
/ 19 декабря 2014

Здесь переменные среды процесса, который запустил emacs:

- Команда: getenv var

Эта функция возвращает значение переменная окружения var, как строка. var должен быть строкой. Если вар не определено в среде, getenv возвращает ноль. Возвращает ‘" "’ если переменная установлена, но ноль. В Emacs, список переменных среды и их значения хранятся в переменной process-environment.

      (getenv "USER")
           ⇒ "lewis"

- Переменная: Process-Environment

Эта переменная представляет собой список строк, каждая из которых описывает одну переменную среды. Функции 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

3 голосов
/ 12 марта 2012

Он не дает точного ответа на ваш вопрос, но вы всегда можете передать переменные окружения в командной строке make. Например: М-х compile RET make -k CXXFLAGS='-Wall' RET

...