메아리 저널

GnuWin32 바이너리 충돌​

윈도에서 유닉스 유틸리티를 쓰려면 (언제나 그렇지만) 상당한 삽질을 감수해야 한다. GCC 같은 경우에도 요전에 TDM-GCC 깔려다가 의존성이 꼬여서 개판이 된 적이 있었는데, 이번에는 GnuWin32가 문제였다.

나같은 경우 웬만한 프로젝트는 GNU Make를 가지고 자동화를 하는 게 보통인데 (물론 요즘 바닐라 Makefile을 그대로 쓰는 것은 좀 시대착오적인 발상이긴 한데… GNU 버전만 쓴다고 치면 좀 더 자동화할 거리는 많으므로…) 윈도에서 사용하다 보면 종종 요런 에러메시지가 날 때가 있다.

mkdir objs
process_begin: CreateProcess((null), mkdir objs, ...) failed.

…그러니까 “mkdir” 프로그램을 못 찾았다고 떽떽거린다. 근데 문제는 이 프로그램은 i) 윈도 기본 셸(cmd.exe)에 들어 있으며 ii) GnuWin32에도 별도의 프로그램(mkdir.exe)으로 포함되어 있다는 것이다. 물론 PATH 지정은 잘 되어 있다. 처음 이 상황을 겪었을 때는 그냥 대강 둘러 갔는데, 나중에 좀 더 테스트해 보다 보니까 PATH를 아예 무시하는 게 아닐까 하는 의혹을 갖게 되었다. 이를테면 convert라는 명령을 썼는데, 얘가 ImageMagick에도 있고 윈도 기본 명령에도 있는데 내 PATH에서는 앞에다 전자가 우선권을 가지게 해 놓았지만 후자만 인식되던 것이었다.

그래서 오늘 아예 뿌리를 뽑기로 하고 잠시 찾아 보니, 이 문제는 아주 잘 알려진 문제여서 단순히 Makefile에 SHELL=cmd.exe라고 써 주기만 해도 해결되는 문제인 것 같았다. (아니면 사용자 환경 변수에 지정해 놓던가.) 근데 이렇게 해도 안 되어서, .SHELLFLAGS를 써 본다거나 (안됨) 외부에서 make SHELL=cmd.exe로 지정해 본다거나 (cmd.exe가 실행되긴 하는데 인자가 안 넘어감) 하는 짓을 해 봐도 안 되는 것이었다. 설마 버전 문제인가? 해서 make --version을 해 보니 옳지! 3.78이었다. 최신 버전은 3.81이니 분명 이게 문제일 거라 생각했다. 그래서 GnuWin32를 다시 깔았다. 옛날에 GetGnuWin32를 써 보려고 했을 적에는 소스포지가 사이트 디자인을 바꿔서 못 썼는데 그 사이에 수정된 버전이 나와서, 귀찮으니 그냥 다 받도록 해 버렸다(…). 다행히도 시디네트웍스가 소스포지 미러링을 시작한 덕택에 download cdnetworks && install 하면 비교적 빠르게(그래도 십여분은 걸리지만) 받을 수 있었다. 그래서 다 받고 확인해 보니…

아직도 안 되잖아!

다시 make 버전을 확인해 보니 여전히 3.78. 헉, 분명 최신은 3.81일텐데, GetGnuWin32가 뭘 또 잘못 먹어서 옛 버전을 받은 건가? 하고 C:\Program Files\GnuWin32\bin\make --version을 실행해 본다. 3.81이 나온다. 끄악.

그러니까 GnuWin32쪽 make 말고 또 다른 놈이 문제를 발생시키고 있다는 얘기가 된다. 내가 설치한 프로그램 중에서 make를 더 가지고 있을 만한 소프트웨어는 TDM-GCC 밖에 없었다. (애초에 의존성 버전 문제로 고생한 적도 있고) 근데 이 쪽에 들어 있는 make는 애초에 이름도 달랐고(mingw32-make.exe), 더군다나 이미 3.81이었다. 그래서 혹시나 싶어서 PATH에 들어 있는 디렉토리들을 모두 다 검색해 보니… 하나 걸려 나온다. 그 이름도 찬란한 Hugin. 이 녀석은 파노라마 생성 프로그램으로 autopano-sift-c 같은 명령줄 유틸리티를 GUI로 묶은 거라서 내부적으로 make를 쓰는데, 글쎄 그 make가 3.78이었던 것이었다. 애초에 TDM-GCC처럼 hugin-make.exe 같이 하면 안 되나? orz 한 번 직접 버그를 올려 봤으니 나중에 반응이 오겠지.

결국 PATH에서 Hugin을 빼니까 정상 동작. 웃긴 것은 Hugin에서는 자체 make에 PATH가 안 걸려 있어도 작동은 잘 했다는 것… 내 컴퓨터에 깔린 버전이 2009.4.0이어서 최신(2010.0.0)은 어쩐지 모르겠지만 아무래도 이건 버그 리포트를 해 봐야 하나 싶긴 하다. 으윽.


텀블러를 씁니다.