【问题标题】:java Makefile issuejava Makefile 问题
【发布时间】:2012-02-15 07:29:38
【问题描述】:

对于家庭作业,我必须为我编写的一系列 .java 文件制作一个 makefile(物理上和软件上)。

我已经写了一个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)

但是当我运行它时,我收到消息“make:Nothing to be done for `all'”。而且我的文件都没有制作。

这里有什么我遗漏的吗?我正在从包含“cdn”目录层次结构的目录中运行文件?

任何想法都将不胜感激。

【问题讨论】:

  • .SUFFIXES 中缺少一个 I ...

标签: java file makefile javac


【解决方案1】:

您尚未指定如何在 Makefile 中构建 java 类。基本上像下面这样......

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

参考this link 有一个很好的例子。

【讨论】:

  • clean 也是如此:它需要rm 相关文件的配方。
  • 感谢您的链接。我将其保存以备后用。
【解决方案2】:

修复您的 all 目标以依赖 .class 文件而不是 .java 文件(这些文件已经存在,因此“无事可做”)。

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

另外,您必须添加一条规则以将 .java 文件编译为 .class 文件:

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

如果使用上述规则(所谓的pattern rule),则不再需要.SUFFXES:,您可以完全删除它。

【讨论】:

  • 这对我帮助很大。我最终也使用了类似的清洁方法。
【解决方案3】:

正如上面其他人所述,您可以轻松地执行以下操作:

%.class : %.java
  javac flags_go_here

...但是这样做有一些问题:

  • 如果类之间存在任何依赖关系——并且将会存在——您必须正确排序。没有像 GCC 那样为您生成依赖项的工具或命令行选项
  • Java 允许类之间的循环依赖。除非将它们一起编译,否则不可能编译两个相互依赖的类,例如:
    • ${JAVAC} ${FLAGS} class1.java class2.java
  • javac 启动时间长。对于小型项目,您不会注意到它,但对于任何有足够类的项目,它会快速增加,并且您的构建时间会快速下降。

我想出的最佳解决方案如下(使用 GNU-make 样式语法):

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 的东西,如果有人让它依赖于多个 jar,它就会损坏。上面可能有一些小错误或需要解决的问题(这里根据记忆),但总而言之,它对我来说没有太多麻烦。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多