2011년 3월 14일 월요일

[Emacs] Lisp error: (void-variable SYSTEM_WGETRC)

어느날 Emacs가 기동 시 SYSTEM_WGETRC와 관련된 에러를 리턴하면서 설정파일을 실행하다가 오류가 나기 시작했다. 이 글은 이 문제를 해결하기 위해 했던 삽질들의 기록이다.

이 문제는 win32(윈도우환경)에서만 발생하며, gnuwin32의 wget.exe가 문제의 원인이 된다. (혹은 GetGnuwin32를 통해 다운받은 경우 문제가 될 수도 있다). 또한 auto-install.el을 이용해 자동으로 업데이트 하는 시스템을 갖추고 있을 경우 어느 순간 발생할 수 있다.

에러가 발생하는 직접적인 원인은 wget을 통해 받은 소스 최하단에 이상한 문자가 기록되기 때문이다. 문제가 발생하는 .el 파일을 열어서 최하단을 살펴보면
SYSTEM_WGETRC = blah blah
syswgetrc = blah blah
와 같은 Elisp코드가 아닌 것 같은 코드가 보인다.

auto-install을 사용하지 않는다면 위 코드를 삭제해서 재기동 시켜보면 아마도 정상동작 하리라 생각된다. 물론 byte-compile되어 있는 .elc 파일을 존재한다면 우선적으로 삭제하는 편이 좋다.

하지만 auto-install을 사용한다면 재기동 시 다시 문제가 발생할 수 있다. 문제의 원인인 wget 자체를 어떻게 하지 않는 이상은 잠재적으로 문제를 일으킨다는 의미이다.

이 문제를 해결하려면 wget.exe를 바꾸면 된다. 문제가 발생하는 wget은 실행하면 다음과 같은 형식의 메시지를 출력한다.
SYSTEM_WGETRC = c:/progra~1/wget/etc/wgetrc
syswgetrc = C:\apps\gnuwin32/etc/wgetrc
wget: missing URL
...
첫 두 줄이 .el파일을 다운로드 받으면서 함께 기록되어서 문제가 발생했다고 짐작이 가능하다.

wget을 GetGnuwin32 같은 툴로 다운받았을 경우 gnuwin32의 bin디렉토리를 한번 보자. 만약 wget.exewget-1.xx.exe 이 존재한다면 wget.exe의 이름을 다른 것으로 바꾸고 wget-1.xx.exewget.exe로 교체한다. (기존의 wget.exe는 GetGnuwin32가 애초부터 가지고 있는 것을 그대로 남겨두고 있는 것으로 생각된다)

만약 이런 경우가 아니라면 별도로 다른 wget을 구해서 설치해보길 추천한다.
http://users.ugent.be/~bpuype/wget/
위 URL에서 wget을 구할 수 있고 해당 문제가 발생하지 않는 것을 확인하였다.

추신. SYSTEM_WGETRCsyswgetrc 등의 환경 변수를 별도로 설정하는 것은 아무런 도움도 되지 않았다. 아마도 문제의 wget은 환경변수를 읽어들이는 것이 아닐거라 판단된다.

댓글 없음 :