2012-02-15 2 views
0

숙제를 위해 필자가 작성한 일련의 .java 파일에 대해 makefile (물리적으로 또는 소프트웨어로)을 만들어야한다.자바 메이크 파일 문제

나는 메이크업 파일을 백업 작성했습니다 :

JFLAGS = -d -g bin/ 
JC = javac 

.SUFFXES: .java .class 

CLASSES = \ 
    cdn\communications\CommandReader.java \ 
    cdn\communications\CommandReaderFactory.java \ 
    cdn\communications\CommandReaderThread.java \ 
    cdn\communications\DiscoveryCommandReader.java \ 
    cdn\communications\Link.java \ 
    cdn\communications\RefreshThread.java \ 
    cdn\communications\RouterCommandReader.java \ 
    cdn\node\Discovery.java \ 
    cdn\node\Node.java \ 
    cdn\node\Router.java \ 
    cdn\utility\Utility.java \ 
    cdn\wireformats\DeRegisterRequest.java \ 
    cdn\wireformats\DeRegisterResponse.java \ 
    cdn\wireformats\LinkInfo.java \ 
    cdn\wireformats\LinkWeightUpdate.java \ 
    cdn\wireformats\MessageType.java \ 
    cdn\wireformats\PeerRouterList.java \ 
    cdn\wireformats\RegisterRequest.java \ 
    cdn\wireformats\RegisterResponse.java \ 
    cdn\wireformats\RouterInfo.java \ 
    cdn\wireformats\WireFormatFactory.java \ 

all : $(CLASSES) 

clean : $(CLASSES:.java=.class) 

을하지만 그것을 실행할 때 메시지 얻을 "합니다. '모든'에 대해 수행 할 수 없음을" 내 파일은 만들어지지 않았습니다.

여기에 누락 된 것이 있습니까? "cdn"디렉토리 계층 구조를 보유하고있는 디렉토리에서 파일을 실행하고 있습니까?

의견을 보내 주시면 감사하겠습니다.

+0

'.SUFFIXES'에는'I'가 없습니다 ... – reinierpost

답변

1

all 대상이 .java 파일 (이미 존재하므로 "수행 할 작업 없음") 대신 .class 파일을 사용하도록 수정하십시오.

all : $(CLASSES:.java=.class) 

는 또한, 당신은 .class 파일로 .java 파일을 컴파일하는 규칙을 추가로 있습니다

%.class : %.java 
    $(JC) $(JFLAGS) $< 

을 위의 규칙을 사용하는 경우 '.SUFFXES: ISN (pattern rule 소위) t는 더 이상 필요하지 않습니다.

보다 다른 사람에 의해 설명 된대로
+0

이것은 많은 도움이되었습니다. 나는 깨끗한 것을 위해서도 비슷한 것을 사용했다. – ChristianB

2

Makefile에서 Java 클래스를 빌드하는 방법을 지정하지 않았습니다. 본질적으로 아래와 같은 ...

.java.class: 
     $(JC) $(JFLAGS) $*.java 

좋은 예가있는 this link을 참조하십시오.

+0

'clean'도 마찬가지입니다 : 해당 파일을'rm'하는 방법이 필요합니다. – reinierpost

+0

링크를 제공해 주셔서 감사합니다. 나중에 저장하고 있습니다. – ChristianB

0

, 당신은 쉽게 같은 것을 수행 할 수 있습니다

%.class : %.java 
    javac flags_go_here 

을 ...하지만 몇 가지 문제는이와있다 :

  • 클래스 간의 종속성이있는 경우

    - - 그리고있을 것입니다 - 당신은 명령을 바로 받아야 할 것입니다. GCC가 의존성을 생성하기 위해 제공하는 도구 나 명령 행 옵션이 없습니다.
  • Java는 클래스 간의 순환 의존성을 허용합니다. class1.java는
  • javac가있다 class2.java
    • $ {javac의} $ {FLAGS} : 당신이 예를 들어, 함께 컴파일하지 않는 한 각 - 기타에 따라 두 개의 클래스를 컴파일 할 수 없습니다 긴 시동 시간. 소규모 프로젝트의 경우에는 눈치 채지 못할 것입니다. 그러나 충분한 수업이있는 프로젝트의 경우 빠르게 추가되고 빌드 시간은 빠르게 내리막 길을갑니다.

    내가 함께 왔어요 가장 좋은 해결책은 다음 (사용하여 GNU-메이크업 스타일 구문) 같은 것입니다 :

    all: my.jar 
    
    my.jar : c1.java c2.java ... cN.java 
        ${JAVAC} ${JAVAC_FLAGS} ${^} 
        ${JAR} cf ${JAR_FLAGS} ${@} -C src ${^:%.java=%.class} 
    
    # As a bonus, here's how you could do JNI stuff based on individual class files. 
    # This is necessary because nothing in the build actually depends directly on 
    # the .class files; if they don't exist and the .jar does, then you need some 
    # way to get the .class files without rebuilding the jar. 
    
    # It's written this way so it's re-usable. 
    # I'm using 'unzip' instead of 'jar' because it has the -j option so it won't 
    # dump some/irritating/path/to/work/with/when/all/I/need/is/the/.class/file 
    define CANNED_JAVAH_TARGET = 
    $(if $(filter %.java,${^}),,\ 
        $(error When building ${@}: No jar dependency provided)) 
    unzip -j -d /somewhere/to/put/temp/class/file \ 
        $(filter %.jar,${^}) ${PKG_PATH}/${@F:%.h=%.class} 
    ${JAVAH} ${JAVAH_FLAGS} <whatever flags are needed to make the header> 
    endef 
    
    ${JNI_HEADER_TARGETS} : my.jar 
        ${CANNED_JAVAH_TARGET} 
    

    javah의 부분에 문제가 있습니다 : javah의 일을 위해, 만약 누군가가 하나 이상의 항아리에 의존한다면, 그것은 깨질 것입니다. 위의 몇 가지 사소한 실수 나 문제가있을 수 있지만 (메모리에서 여기로 이동) 모든 것이 모두 번거롭지 않게 저에게 효과적입니다.