2011-11-22 1 views
1

는 좀 이상한 행동을 제시하고이 Makefile을 가지고 :메이크 이상한 행동

$ javac -d Classes -sourcepath .. -classpath `for x in \`ls Classes/jars/*\`; do echo -n $x:; done` PCA/PCAClassifier.java 

는 잘 자바를 컴파일합니다. 그러나 somereason에 나는

make PCA 

내가 얻을 호출 할 때 :

Compiling PCAClassifier 
javac -d Classes -sourcepath .. -classpath `for x in \`ls Classes/jars/*\`; do echo -n $x:; done` PCA/PCAClassifier.java 
javac: invalid flag: Classes/jars/Jama.jar: 
Usage: javac <options> <source files> 
use -help for a list of possible options 
make: * [Classes/RobotSuite/PCA/PCAClassifier.class] Error 2 

난 너무 혼란 스러워요. 누구나 해결책이 있습니까?

만들기 버전 정보 :

GNU이 무료 소프트웨어입니다 3.81 저작권 (C) 2006 자유 소프트웨어 재단, 주식 회사를 확인; 복사 조건에 대한 소스를 참조하십시오. 보증은 없습니다. 상품성 또는 적합성에 대해서조차도 해당되지 않습니다. 특정 목적.

배경 I386-사과 darwin10.0을 위해 만들어진이 프로그램 : 그룹 프로젝트에서 작업. 우분투를 실행하고 있습니다. 내 파트너는 Mac OS X을 사용하고 있습니다. 이유가 무엇이든,이 메이크 파일은 내 컴퓨터에서 정상적으로 작동하지만 자신의 컴퓨터에서는 정상적으로 작동하지 않습니다. 명령이 그의 BASh 터미널에서 작동하더라도, 어떻게 든 Make가 올바르게 보내지 않습니다.

+1

메이크 파일을 표시하지 않으므로 도움이되지 않습니다. 첫 번째 단편은 PCA/PCAClassifier.java를 컴파일하고 있고 불만스런 버전은 PCA/PCAHelper.java를 컴파일하고 있습니다 - 그 차이점은 무엇입니까? –

+0

아니요, 어떤 인수를 실행하든 상관없이 실패합니다. – FrankieTheKneeMan

답변

7

Google에 제공 할 정보가 거의 없습니다. 그럼에도 불구하고 운이 좋다!

Mac OS X에서 bash는 --enable-strict-posix-default으로 빌드되었으므로 xpg_echo 쉘 옵션의 기본값은 POSIX 모드에서 설정됩니다. POSIX 모드는 쉘이 /bin/sh으로 호출되었을 때 켜져 있습니다. 그렇지 않은 경우라면 $(SHELL) make 변수를 설정하여 지시하지 않는 한, Make가 호출했을 때와 같이 쉘이 호출되었을 때 켜져 있습니다.

이것은 메이크 파일을 죽이는 Linux와 Mac OS의 차이점입니다. xpg_echo이 켜지면, 쉘에 내장 된 echo-n을 인쇄하기위한 또 다른 인수로 취급하므로 줄 바꿈도 인쇄됩니다. 따라서 하나의 클래스 패스 인수는 여러개의 인수 ("-n"중 절반)로 끝나고 javac는 혼란스러워진다.

(Mac OS X에서도 마찬가지입니다. 쉘이 /bin/bash으로 호출되어 POSIX 모드가 아니기 때문에 xpg_echo이 꺼져 있기 때문입니다.)

그래서 당신은이 문제를 해결하기위한 옵션이 있습니다 :

  1. 쉘 조각에 사용 /bin/echo -n; 붙박이 것과는 다른, 진짜 에코 명령 요즘은 대부분 항상 이해한다 -n;

  2. 쉘 루프보다 덜 둥근 방식으로 클래스 경로 인수를 구성하십시오. 예를 들어,

    ... -classpath `ls Classes/jars/* | tr '\n' :` ... 
    

    또는 이미 GNU Make를 사용하고있는 경우, 쉘 스 니펫 대신에 와일드 카드 및 기능을 사용하십시오.

  3. shopt -u xpg_echo 동료에게 자신의 컴퓨터에있는 적절한 bash 시작 파일을 추가하십시오 (단, 다음 Mac OS 사용 동료가 따라 올 때 혼란을 겪을 수 있습니다.이 문제를 어떻게 해결했는지 잊어 버렸을 것입니다.) 이 시간).

마지막으로, 디버깅 메이크 파일에 대한 일반적인주의 사항 : 메이크 조리법에 javac ... 명령은 이해할 수없는 오류 메시지를 제공하는 경우, 대신 echo javac ...로 변경. 그런 다음 정확히이 호출되는 방식을 볼 수 있습니다. 여기 보이는 것처럼 의도 한 것이 아닐 수 있습니다.

+0

나는 당신에게 정보를 알려주는 것처럼 느낍니다. 어쨌든 믿을 수 없을만큼 도움이되는 응답을 작성하기에 충분합니다. 그리고 솔직히, 내가 가진 모든 관련 정보를 당신에게주었습니다. 실제 make 명령은 "이 매개 변수와 함께이 명령을 실행하십시오"라는 한 줄입니다. make 유틸리티가 실제로 실행시키고 자하는 정확한 명령을 실제로 출력한다는 사실에서 알 수 있듯이 모든 것은 잘 동작합니다. 필자가 알아야 할 것 (그리고 내가 물었던 것)은 make 유틸리티 내부의 쉘이 다른 것보다 다른 이유였다. TL : DR : 도와 주셔서 감사합니다.하지만 거시기 일 필요는 없었습니다. – FrankieTheKneeMan

+1

@Frankie : 일반적으로 예. makefile이 예상대로 작동하지 않는다면, 실제로 잘못된 makefile을 찾아내는 것이 좋습니다! _ 예를 들어 여러분이 $$ x를 정확히 이스케이프했는지의 여부를 궁금해하는 사람들은 아낌없이 돕습니다. 'Make에서 또는'$ x'가 쉘 스 니펫의 다른 곳에 나타날 의도가 있다면. tl; dr : http://catb.org/~esr/faqs/smart-questions.html –