2017-11-21 25 views
3

그래서 자바 코드를 컴파일하고 있는데, 종종 파일 이름에 달러 기호가있는 .class 파일을 생성합니다. GNU make는 이것을 싫어하며 파일 이름을 계속 간섭합니다.GNU make가 달러 기호를 포함하는 파일 이름을 어떻게 방해하지 않습니까?

간단한 (인위적인) 예제로서, MyFolder 디렉토리 (및 하위 폴더)의 모든 .class 파일에 대해 hexdump를 수행하는 GNU Makefile 작업을 만들고 싶다고 가정 해 보겠습니다.

지금 MyFolder에 다음과 같은 파일이 있다고 가정 :

MyFolder/makefile 
MyFolder/sample.java 
MyFolder/subdir/abc$1.class 
MyFolder/subdir/test.java 
MyFolder/xyz.class 

목표는 16 진 덤프를 실행하는 조리법을 작성하는 것입니다, MyFolder에 (및 하위 폴더)의 모든 class 파일을 건네. 파일 GNU 실행해야 할 최종 명령의 위의 목록에 대한 그래서, 다음과 같습니다

hexdump subdir/abc$1.class xyz.class 

이 로그를 떨어지는 등 너무 쉽게해야하지만, GNU 만들이를 만들기 위해 극단적 인 고통에 간 것 같습니다 가능한 한 어렵다. 다음 메이크와 순진 시도는 작동하지 않습니다

default: 
    hexdump $(shell find -name '*.class') 

이 Makefile을 실행하면 다음과 같은 오류 얻을 : 어떻게 위의 출력의 첫 번째 줄에서 명령

hexdump ./subdir/abc$1.class ./xyz.class 
hexdump: ./subdir/abc.class: No such file or directory 
make: *** [makefile:3: default] Error 1 

공지 사항 올바른지 (파일 이름에 달러 기호 문자가 있음). 그런 다음 실제 명령이 실행되면 "$ 1"이 평가됩니다.

실제로 달러 기호를 이중 달러 기호로 올바르게 이스케이프하면 다음 Makefile도 실패합니다. 물론 나는하지 하드 코드 파일 이름을하는 조리법을 쓰고 싶어하지만, 파일

default: 
    hexdump subdir/abc$$1.class xyz.class 

심지어 위 메이크 파일이 같은 실패 명령 (... 쉘 찾을 수)가 $로 발견해야한다 첫 번째 메이크 파일로 오류.

달러 기호가 포함 된 파일 이름을 GNU make가 방해하지 못하게하려면 어떻게해야합니까? 자바 컴파일러는 항상 이러한 것들을 생성하기 때문에 누군가가 전에 반드시 이걸 실행해야만할까요?

답변

4

만들기 다시 $(shell …) 출력을 해석하지 않습니다

default: 
     hexdump 'subdir/abc$$1.class' xyz.class 

나 : 그래서, 작동 최종 명령은 무언가 같이 될 것입니다. 문제는 $1을 해석하고 빈 문자열 인 첫 번째 (존재하지 않는) 매개 변수로 확장한다는 것입니다.

이 문제를 해결하는 방법은이 문제가 발생했을 때 수행중인 작업에 따라 다릅니다. GNU make는 임의의 쉘 인용 기능을 제공하지 않으며 어쨌든 공백이 포함 된 파일 이름에 문제가 있습니다. 당신은 아마 '와 파일 이름을 주변으로 자바 클래스 파일에 대한 매개 변수 대체를 방지하기 위해이 시도 할 수 :

hexdump $(patsubst %,'%',$(shell find -name '*.class')) 

또 다른 방법은 같은 것을 사용하여, 쉘 내의 파일 목록을 작성하는 것입니다 :

find -name -print0 | xargs -0 hexdump 

이렇게하면 셸에서 문자열 해석을 완전히 피할 수 있습니다. 심지어

hexdump $$(find -name '*.class') 

와 쉘은 매개 변수 대체를 명령 대체 출력이 단어 분할 및 경로 확장 (로빙) 만 될 수 있으므로 파일 이름에서 $ 징후를 해석하지만,하지 않을 것입니다.

+0

우리의 상황을위한 최선의 해결책은 결국 쉘 안에서 $$를 사용하여 목록을 만드는 것입니다.) 구문을 사용합니다. 설명 해줘서 고마워. – deltamind106

1

먼저, 출력 파일에 대해 이렇게 어리석은 명명 규칙을 선택하면 Java가 잘못됩니다.

둘째, make로 Java 코드를 작성하는 것은 거의 확실한 좌절감을 안겨줍니다. make는 주 파일을 입력으로 사용하고 출력으로 하나의 파일을 생성하는 도구로 잘 작동하도록 만들어졌습니다. 여기서 출력 파일 이름은 입력 파일 이름과 관련됩니다. Java는 그렇게하지 않습니다.

그러나 직접 질문에 대답하기 위해 문제는 $이 make 변수를 사용하기 때문에 만드는 특수 문자입니다. 마지막 예제에서와 같이 $$으로 이스케이프 처리해야합니다. $ 쉘에 특별한 또한 때문에

그러나,이 충분하지 않아, 그래서 당신은 조리법에 $를 사용하는 경우는 작은 따옴표 또는 백 슬래시를 사용하여 쉘에서 탈출해야합니다.조리법에서이 방법을 사용하는 경우

default: 
     hexdump subdir/abc\$$1.class xyz.class 
+0

좋아요, 그렇다면 어떻게하면 $ (shell find ...) 나 다른 매커니즘을 사용하여 (하드 코딩 된 파일 이름이 아닌) 모든 일치하는 파일을 실제로 찾을 수 있을까요? – deltamind106

+1

레시피 안에서'shell' 함수를 사용하면 안됩니다. 조리법은 이미 쉘이므로 make의'shell' 함수를 사용하면 혼란과 고통이 추가됩니다. 제대로 작동하는 쉘 프롬프트에 명령 행을 작성한 다음이를 'recipe'에 넣고 '$'를 모두 $$로 바꾸면 완료됩니다. 그래서'$ (셸 찾기 -name '* .class')'대신 쉘 백틱 ('$'을 피하기 위해)을 사용하여'\'find -name '* .class'\''또는'$ (찾기 - 이름 '$. (find -name'* .class ')' – MadScientist