2013-02-21 1 views
6

make.exe를 사용할 때 대상 이름 안에 공백을 넣을 수있는 방법이 있습니까? GCC makefile의 대상에 공백 허용

"foo bar baz": $(OBJ) 
    $(CPP) $(LINKOBJ) -o $(BIN) $(LIBS) 
이 ... 세 가지로 취급받을 것 : 참고로 http://savannah.gnu.org/bugs/?712

, 큰 문제가 메이크 파일의 조각 같은 명령이다 :이 정말 고대 버그 보고서가 맞다면 불가능한 것으로 보인다 별도의 명령 : 하나는 "foo (포함 된 노트)"를 빌드하고, 하나는 막대를 빌드하고, 마지막으로 baz "(다시, 포함)"를 빌드하는 명령입니다. 이는 make.exe가 공백을 구분 기호로 사용하는 것 같습니다.

그러나 예를 들어 "Hello World.exe"를 빌드하려고한다고 가정하는 것이 합리적입니다. 이것은 가능하지 않습니다. 따옴표는 작동하지 않으며, 어느 별도의 단어를 탈출 (어디 선가 링크 기억이 안 읽었습니다) 않습니다

"foo\\ bar\\ baz": $(OBJ) 
    $(CPP) $(LINKOBJ) -o $(BIN) $(LIBS) 

이 문제를 해결하는 다른 방법이 있나요를? 공식 매뉴얼 만 토큰 화 별 공간 물건을 확인하지만, 다른 목적으로 공간을 사용하는 방법을 제공하지 않습니다 http://www.gnu.org/software/make/manual/make.html#Rule-Syntax

편집 : 제안, 나는 너무 단일 슬래시를 시도했지만 이것들은 이중 슬래시와 똑같은 효과가 있습니다.

mingw32-make.exe: *** No rule to make target `foo', needed by `all'. Stop. 

실행 파일은 "foo는이 baz.exe 바"제대로하지만 생산하지만, 링크는 단어 당마다 수행됩니다 확인은 첫 번째 단어에 대한 규칙을 찾을 수 없습니다 뿌려줍니다.

답변

1

이중 백 슬래시 대신 단일 단일 백 슬래시를 사용하십시오. 다음 메이크 (적어도 GNU 메이크업에 대한) 작동 : 마티아스 말했듯이

goal: foo\ bar 

foo\ bar: 
    gcc -o "foo bar" "foo bar.c" 
+0

작동하지 않는 것 같습니다. 편집을 참조하십시오. – Orwell

+0

@ 오웰 : 그렇다면 그것은 운영 체제의 문제인 것 같습니다. 쉘에서 이름에 공백이있는 파일을 어떻게 지정합니까? – Matthias

1

, 그것은하지만, 큰 따옴표의도 "\"의 문제이다. 여기에 내가이에 succeded 방법입니다

EXECUTABLE=foo\ bar\ baz 
all: $(SOURCES) $(EXECUTABLE) 
$(EXECUTABLE): $(OBJECTS) 
       $(CC) $(OBJECTS) -o "[email protected]" $(LDFLAGS) 

주 그것은 나에게 보인다 인 $ @ 주위에 따옴표 확인 대상 "$ (실행 파일)"는 "\"를 확장, 그래서 명령에 도달하면 라인은 당신이 파일의 이름을 큰 따옴표를 원 싶지 무엇

gcc file.o -o foo bar baz -LFlags 

된다.

이제 Windows에 있는데 어떻게 이름 공간이 어떻게 처리되는지 기억이 안납니다. 따라서 Matthias가 말한 것처럼 "cmd.exe"가 공백을 처리하는 방법을 먼저 확인하십시오 (큰 따옴표로 둘러싸인 이름 제외).)

0

표준 targetRule: dependencies 호출의 종속성을 무시하는 간단한 Makefile을 더 쉽게 고려해보십시오. OP는 Windows 용이고 아래는 bash 쉘의 Linux에서 수행됩니다. 하지만 cygwin을 통해 bash 쉘을 사용하는 Windows에 적용해야합니다.나는 bash 쉘 터미널에서 목표 clean 또는 testAmake를 호출 할 경우

testA: 
    echo "testA" 

unrelated: 
    echo "unrelated" 

testA\ clean: 
    echo "testA clean" 

clean: 
    echo "clean" 

: 나는 내 Makefile에 다음과 같은 한 (주, SO 공간으로 변환 echo 명령 전에 TAB,이 있어야한다) 내가 예상 결과를 얻을 : 나는 make testA clean를 호출하는 경우, 지금

$ make testA 
echo "testA" 
testA 
$ make clean 
echo "clean" 
clean 

를 그냥 같이 bash 쉘, 그래서공간에서 인수를 분할합니다 작성 65,는 두 개의 인수를받을 것이며, 개별적으로 실행됩니다 :

$ make testA clean 
echo "testA" 
testA 
echo "clean" 
clean 

을 ...하지만 난 따옴표로 make에 공급되는 대상을 포장하는 경우 - 나는 공간을 탈출하는 경우 또는 - 쉘은이하도록되어 있음을 이해할 것이다 내부 공간이 하나의 인자가 될 및 testA\ clean 대상 규칙으로 작성된 것입니다 무엇을 실행하기 위해 진행하는 make에 등을 전파합니다 :이의

$ make "testA clean" 
echo "testA clean" 
testA clean 
$ make testA\ clean 
echo "testA clean" 
testA clean 

한 결과 "그것은 불행하게도 당신은 할 수있다 명령 줄에서 TAB "을 입력하여 자동 완성을 testA\ clean; 명령 줄에서 make teTAB을 입력하면 testA 만 자동 완성되며 (testA\ clean은 자동 완성 옵션으로 표시되지 않음).