2012-02-15 134 views
0

對於作業分配,我必須爲我編寫的一系列.java文件生成makefile(物理和軟件)。java生成文件問題

我已經寫了一個make文件:

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' ... – reinierpost 2012-02-15 09:50:07

回答

1

修復您的all目標以依賴.class文件而不是.java文件(已存在並因此「沒有任何事情要做」)。

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

此外,你必須到增加一條規則,文件編譯的.java到.class文件:

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

在使用上面的規則的情況下(所謂pattern rule),.SUFFXES: ISN」再也不需要了,你可以根本刪除它。

+0

這幫了我很多。我最終也使用了類似的清潔工具。 – ChristianB 2012-02-15 15:30:14

2

您尚未指定如何在Makefile中構建Java類。基本上像下面這樣...

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

請參閱this link它有一個很好的例子。

+0

'clean'也是如此:它需要一個配方來「rm」有問題的文件。 – reinierpost 2012-02-15 09:51:17

+0

感謝您的鏈接。我稍後保存它。 – ChristianB 2012-02-15 15:30:27

0

正如上文所述他人,你可以很容易地做這樣的事情:

%.class : %.java 
    javac flags_go_here 

...但有一些問題與此:

  • 如果有類之間的依賴關係 - - 而且會有 - 你必須得到正確的訂單。沒有任何工具或命令行選項,例如GCC爲您生成依賴關係的東西
  • Java允許類之間的循環依賴關係。這是不可能的編譯相互依賴,其他兩個類,除非你編譯在一起,如:
    • $ {JAVAC} $ {} FLAGS class1.java class2.java
  • javac有啓動時間長。對於小型項目你不會注意到它,但是對於任何有足夠課程的項目來說,它會快速加起來,而且你的構建時間會很快下降。

最好的解決方案我已經出來是類似如下(使用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的事情,如果有人讓它依賴於多個罐子,它就會破裂。上面可能會有一些小的錯誤或事情需要解決(從這裏回憶),但總的來說,它爲我工作沒有太多麻煩。