Makefie arguement 중 '\' 에 관한 의문
글쓴이: stuta / 작성시간: 화, 2007/10/02 - 1:48오후
distcc라는 분산 컴파일 툴이 있습니다
이 툴은 makefile command를 하나씩 wrap up 해서 cc를 호출합니다
CC=distcc 로 make 하지만 실제론 distcc가 분산 초기 작업을 수행하고
실제 컴파일은 cc가 하게 되죠
gcc 옵션 중에 -D 옵션이 있는데
-DLIBDIR=\"usr/libdir\"
이런 식으로 들어갈 경우가 있습니다.
이러면 distcc의 경우 저 argument을 받아서 -DLIBDIR = "/usr/libdir" 로 gcc에게 넘겨주고
gcc가 컴파일 하게 되는데요
제가 distcc를 윈도우 버전으로 변환하는 과정에서 -DLIBDIR = "/usr/libdir" 을
CreateProcess의 argument로 주고 다시 gcc에게 넘기는데
저 라인을 받은 gcc는 -DLIBDIR = /usr/libdir 로 인식을 해서 parsing error가 납니다
몇 일을 고민해봤는데 도저히 이유를 모르겠습니다
혹시 아시는 분 계시면 답변 부탁드리겠습니다
Forums:
double escaping 을
double escaping 을 해보세요
사용할수가
프로젝트 특성상 사용할 수가 없어서요
fork를 쓰지 않는
fork를 쓰지 않는 윈도우즈 버젼의 distcc 대몬을 사용하는데 대몬에서 수정할 수 없는 상황이란 말씀인지요? 그렇다면 gcc를 호출할 때 다음과 같이 wrapper 스크립트로 넘겨서 인자를 조작할 수도 있을 것 같은데요.
아마도 cygwin 에서 bash? 또는 이에 상응하는 윈도우즈 버젼의 스크립트를 쓰면 어떨까요?
계속 삽질 중인 결과
CreateProcess /Execvp 를 윈도우 버전의 distcc에서 호출하여 gcc를 부르는데 두 모듈 실행 전까지
인자의 " " 는 날아가지 않는것을 확인했고, 리눅스 버전의 distcc도 마찬가지로 execvp를 사용하는걸
확인했습니다. 유일한 차이점이라 한다면 윈도우 executable 인 windistcc(윈도우버전 distcc)는 첫번째
인자로 c:\cygwin\bin\gcc.exe 를 호출한다는 거고 distcc는 cc(or gcc)를 호출하는군요
Cygwin 상에서 windistcc처럼 윈도우 폴더 형식을 사용하는 것이 이후 등장하는 인자들의 " " 를 날릴수도 있는 걸까 라는 생각을 해보았습니다.
또는 CreateProcess나 execvp 실행 과정에서 " " 가 날아갈 수도 있겠다는 가정도 있겠는데 두가지 가정
모두 증명하기가 쉽지 않네요
Win32 Executable 이 cygwin 에서 리눅스 프로그램처럼 cygwin path로 gcc나 cc를 호출할 수 있다면
원인을 찾아내는 범위를 많이 줄일 수 있을 것 같은데 혹시 그 방법 아시는 분은 없는지
예를 들어 c:\cygwin\bin\gcc.exe 를 CreateProcess/Execvp의 첫번째 인자로 넣어줘야 되는데 이걸
/cygfolder(?)/c/cygwin/bin/gcc.exe 라던가…
연구실 사람들이 다 달라붙었는데 해결책이 까마득하네요 가까운것 같으면서도
cygwin에서는 리눅스와
cygwin에서는 리눅스와 마찬가지로 그대로 사용할 수 있습니다. 인자가 안 넘어 온 것을 보니, 기본 설정이 잘 못 된 것 같습니다. 이미 아실 수도 있지만, 대몬에서 log level을 debug로 하고, verbose 옵션을 커고, 컴파일 할 때는 DISTCC_VERBOSE=1 make -j6 와 같이 하면 확인하기 쉽습니다. 또 참고로 관련 링크 올립니다.
http://kegel.com/crosstool/
http://www.cygwin.com/ml/crossgcc/
http://vmlinux.org/crash/mirror/www.objsw.com/CrossGCC/
http://gentoo-wiki.com/HOWTO_Distcc_server_on_Windows
댓글 달기