2012-02-15 83 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的事情,如果有人让它依赖于多个罐子,它就会破裂。上面可能会有一些小的错误或事情需要解决(从这里回忆),但总的来说,它为我工作没有太多麻烦。