Makefie arguement 중 '\' 에 관한 의문

stuta의 이미지

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가 납니다
몇 일을 고민해봤는데 도저히 이유를 모르겠습니다

혹시 아시는 분 계시면 답변 부탁드리겠습니다

serialx의 이미지

double escaping 을 해보세요

stuta의 이미지

프로젝트 특성상 사용할 수가 없어서요

modestcode의 이미지

fork를 쓰지 않는 윈도우즈 버젼의 distcc 대몬을 사용하는데 대몬에서 수정할 수 없는 상황이란 말씀인지요? 그렇다면 gcc를 호출할 때 다음과 같이 wrapper 스크립트로 넘겨서 인자를 조작할 수도 있을 것 같은데요.

#!/bin/bash
 
# $@를 검사해서 수정!
exec x86-unknown-linux-gnu-g${0:$[-2]} "$@"

아마도 cygwin 에서 bash? 또는 이에 상응하는 윈도우즈 버젼의 스크립트를 쓰면 어떨까요?

stuta의 이미지

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 라던가…

연구실 사람들이 다 달라붙었는데 해결책이 까마득하네요 가까운것 같으면서도

modestcode의 이미지

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

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.