【问题标题】:I try to write my own makefile but it doesn't work我尝试编写自己的makefile,但它不起作用
【发布时间】:2016-04-24 03:34:30
【问题描述】:
#define the suffixes
.SUFFIXES: .java .class

#compile all java files to .class
.java.class:
        javac -g *.java

#CounterStatTester is a tester class for CounterStat
CounterStatTester.class: CounterStat.class

test: CounterStatTester.class CounterStat.class
        java CounterStatTester

当我尝试“进行测试”时,shell 显示“make: *** No rule to make target `test'。停止。” 但是我写了“java CounterStatTester”,为什么还是找不到规则?

【问题讨论】:

  • Makefile 可能很麻烦,因为它们希望在最后一行出现尾随换行符,并且还需要制表符,而不是缩进的空格。
  • @AndrewWilliamson 我确实在每个 tule 行之前添加了制表符。基本上,我的代码有问题吗?
  • 代码对我来说看起来不错 - 尝试此操作时是否有可用的文件 CounterStat.class
  • 只有 java 文件。为什么我在尝试这个时需要 .class? makefile 的目的是正确编译它们,不是吗?
  • test 规则取决于 CounterStat.class。如果没有具有该名称的文件,它将查找具有该名称的规则。如果也没有具有该名称的规则,则无法解析依赖关系,因此无法运行 test 规则。

标签: java makefile


【解决方案1】:

这里有很多风格不佳的例子。我将尝试按出现的顺序将它们全部列出,而不是仅仅回答问题。如果你按照我的建议去做,你原来的问题肯定会消失。

如果您知道自己在做什么并且有充分的理由这样做,并且已经学会了良好的风格,则可以使用“不良风格”。在你的情况下,这些都不是。

  1. .SUFFIXES 已过时,不应用于新代码

  2. 同样,.java.class: 等“后缀规则”已过时,不应使用。

  3. 无论如何,您的.java.class: 规则应采用一个.java 文件并生成一个.class 文件。 makefile 中的良好风格是每个规则配方​​一次生成一个目标,而不是多个目标。

所以,你应该有这样的东西:

%.class: %.java Makefile
        javac -g $<
  1. CounterStatTester.class 没有理由“依赖”CounterStat.class,所以你不应该有这个规则。在这种情况下,“依赖”意味着CounterStatTester.class 的配方读取CounterStat.classCounterStatTester.class 真的依赖于 CounterStatTester.java(和不太明显的 Makefile),这已经被我向您展示的规则所捕获。

  2. 正如我上面提到的,每个规则配方​​都应该编写一个目标。由于test 不是一个文件,而是一个抽象的概念,所以它不能被写出来,因此它不应该有一个带有配方的规则。

编写 makefile 的目的是,除非必要,否则您不必执行配方,从而节省时间。在您的情况下,test 根本不存在,因此将始终执行配方,这对于生成文件毫无意义。

相反,您应该有一个名称类似于 CounterStat_tested 的文件和这样的规则:

CounterStat_tested: CounterStatTester.class CounterStat.class Makefile
        java CounterStatTester && touch $@
  1. 最后,makefile 的顶部应该有一个all 目标:

    .PHONY: all
    all: CounterStatTester.class CounterStat.class CounterStat_tested
    

【讨论】:

  • 但是如果我删除 CounterStatTester.class:CounterStat.class,CounterStatTester.class 怎么知道在哪里可以找到 CounterStat 并在测试器中实现呢?
  • @FrankJoe 这是一个 Java 问题。 Java 对此负责。与Make无关。您的多余规则仅适用于 Make,并没有告诉 Java 任何内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-07
  • 2021-07-03
  • 1970-01-01
  • 2021-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多