Как заставить Emacs распознавать переменные среды bash для компиляции?

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

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

Ответ 1

Вы можете попробовать добавить что-то вроде своего .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 из панели меню GUI в Linux, как правило, приводит к тому, что Emacs не имеет те же PATH, которые запускаются из командной строки. Эта проблема восходит к первым сценариям xdm Xsession, и хотя их довольно легко исправить (в основном используйте Xsessionwrapper script, который делает 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 более или менее одинаково, но использование расширения обычно предпочтительнее взломать решение самостоятельно.

Ответ 2

Здесь переменные среды процесса, начавшие emacs, следующие:

- Команда: getenv var

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

      (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 script. Один простой способ обойти это - изменить файл ~/.xinitrc на использование bash вместо sh (это может быть так же просто, как добавление #!/bin/bash вверху файла).

Источник: gnu.org

Ответ 3

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