RunningPig - 1 year ago 89
Java Question

Redirect the Java output in a Makefile

I am a new to Makefiles and I am currently writing one. This is what I have so far:

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  In the save-java , I want to run my Java program, but redirect the output to $(TEST_OUT)
. How can I achieve this? Also, in one tutorial, I found that someone used
-\rm xxx
in
clean
. Is it any different from simply writing
rm xxx
?

This is the output:
make: *** No rule to make target 'test.out', needed by 'test-java'. Stop. 

I guess my redirection is still wrong.

Other than the fact that I'm not sure what the relationship is between your C and java programs, here's what I think you're trying to do

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

• Either CC should be a environment variable on the host computer, or cc should be a file link to your default compiler (or the compiler itself), you shouldn't need to define it in the makefile. Make sets CC to cc by default.
• I don't see any use for a lot of the supposedly .PHONY targets you mentioned, also why would you delete them? They aren't files
• Make already knows how to compile C source files, and it'll also link foo automatically because one of its prerequisites is foo.o.
• diff already has a "are these two files the same" flag (-q).
• You should have a .PHONY target named all at the top that executes the default action, but I can't tell what that would be in this case.
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download