2012-02-15 21 views
0

宿題のためには、私が書いた一連の.javaファイルのmakefile(物理的にもソフトウェア的にも)を作る必要があります。javaメイクファイルの問題

私はメイクファイルまで書かれている:

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) 

をしかし、私はそれを実行したとき、私はメッセージを取得「します: `all」をのために行わなければ何も」私のファイルは作成されていません。

ここに何か不足していますか? "cdn"ディレクトリ階層を保持するディレクトリからファイルを実行していますか?

どのような考えにも感謝します。

+0

'.SUFFIXES'には' I'がありません... – reinierpost

答えて

1

allターゲットが.javaファイル(既に存在しているため「実行する必要はありません」)ではなく.classファイルに依存するように修正してください。

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

また、あなたが.classファイルに.javaファイルをコンパイルするルールを追加する必要があります。上記のルールを使用する場合には

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

pattern ruleいわゆる)、.SUFFXES: ISN」もう必要なくなったら、それをまったく削除することができます。

+0

これは私を大いに助けました。私はきれいにも同様のものを使用して終了しました。 – ChristianB

2

あなたのMakefileにJavaクラスを構築する方法は指定されていません。本質的に以下のようなものです...

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

良い例があります。

+0

同じことが 'clean'になります:問題のファイルを' rm'するためのレシピが必要です。 – reinierpost

+0

リンクをありがとう。私は後でそれを保存しています。 – ChristianB

0

上記他の人が概説したように、あなたは簡単にこのような何か行うことができます。

%.class : %.java 
    javac flags_go_here 

を...しかし、これにはいくつかの問題があります:クラス間の依存関係が存在する場合

  • は - あなたが注文を受けなければならないでしょう。 GCCが依存関係を生成するためのツールやコマンドラインオプションはありません
  • Javaはクラス間の循環依存関係を可能にします。 class1.javaが
  • javacがありclass2.java
    • $ {JAVAC} $ {FLAGS}:あなたが例えば、それらを一緒にコンパイルしない限り、それぞれ、他に依存して2つのクラスをコンパイルすることはできません長い始動時間。小規模なプロジェクトでは気づかないでしょうが、十分なクラスがあるプロジェクトでは、それが速く追加され、ビルド時間が急速に下がります。

    私が作ってみた最善の解決策は、(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は事のために、もし誰かがそれを複数の瓶に依存させるなら、それは壊れるでしょう。上記の中で少しの間違いや回避策があるかもしれませんが(ここの記憶から)、すべてのことが私のために大変な労力をかけずに働いています。