【问题标题】:Redirect the Java output in a Makefile在 Makefile 中重定向 Java 输出
【发布时间】:2016-05-22 21:24:57
【问题描述】:

我是 Makefiles 的新手,目前正在编写一个。这是我目前所拥有的:

cc = gcc
EXE = foo
JAVAC = javac
JRE = java
PAGER = less
TEST_OUT = test.out
EXP_OUT = expected.out

#clean run-py run-c read run-java save-java and test-java are all phony targets.

    foo.o : foo.c foo.h
    $(cc) -c foo.c

main.o: main.c foo.h
    $(cc) -c main.c

$(EXE): foo.o main.out
    $(cc) -o$(EXE) main.o foo.o

run-c: $(EXE)
    ./$(EXE)

run-py: foo.py
    ./foo.py

read:
    $(PAGER)

foo.class: foo.java
    $(JAVAC) foo.java

run-java: foo.class
    $(JRE) foo

save-java: foo.class
    $(JRE) foo > $(TEST_OUT)

test-java: $(TEST_OUT) $(EXP_OUT)
    -@if diff $(TEST_OUT) $(EXP_OUT) &> /dev/null ; then \
    echo "Passed!" ;\
    else \
    echo "Not the same!" ;\
    fi

    clean:
       rm foo.o\
       rm main.o\
       rm $(EXE)\
       rm run-c\
       rm run-py\
       rm foo.class\
       rm rn0java\
       rm save-java\
       rm test\java

save-java 中,我想运行我的Java 程序,但将输出重定向到$(TEST_OUT)。我怎样才能做到这一点?另外,在一个教程中,我发现有人在clean 中使用了-\rm xxx。和单纯写rm xxx有什么区别?

这是输出: make: *** No rule to make target 'test.out', needed by 'test-java'. Stop. 我想我的重定向仍然是错误的。

【问题讨论】:

  • 使用> 重定向输出,- 用于“静默”rm(据我所知)
  • 是不是像“$(JRE) foo > $(TEST_OUT)”
  • test.outmain.outexpected.out 是如何生成的?
  • 哦,对不起!那应该是main.o。我的文件夹中已经存在 test.out 和 expected.out。
  • @user657267 嗨,我刚刚发现我无法生成test.out.. 可能是我的重定向错误。

标签: java unix makefile


【解决方案1】:

除了我不确定你的 C 和 java 程序之间的关系是什么之外,这就是我认为你正在尝试做的事情

target    := foo
test      := test.out
expected  := expected.out

JAVAC     := javac
JAVAFLAGS :=
JRE       := java

main.o $(target).o: %.o: %.h
$(target): $(target).o main.o

%.class: %.java
    $(JAVAC) $(JAVAFLAGS) $^

$(TEST_OUT): $(target).class
    $(JRE) $< > $@

.PHONY: java-test clean

java-test: $(TEST_OUT) $(EXP_OUT)
    diff -q $^

clean: ; $(RM) $(target).o main.o $(target) $(target).class
  • cc 应该是指向您的默认编译器(或编译器本身)的文件链接,您不需要在 makefile 中定义它。默认将CC 设置为cc,并在C 源文件和链接的隐式规则中使用CC
  • 我认为你提到的许多所谓的.PHONY 目标没有任何用处,你为什么要删除它们?它们不是文件
  • Make 已经知道如何编译 C 源文件,它还会自动链接 foo,因为它的先决条件之一是 foo.o
  • diff 已经有一个“这两个文件是否相同”标志 (-q)。
  • 您应该在顶部有一个名为 all.PHONY 目标来执行默认操作,但我不知道在这种情况下会是什么。

【讨论】:

  • 其实我刚写完,不过还是非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-04
  • 1970-01-01
  • 2012-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-05
相关资源
最近更新 更多