使用Makefile运行多个程序

时间:2018-11-18 22:37:04

标签: makefile

每当我尝试运行此命令时,我得到的唯一输出是“ make:foo.o是最新的”。似乎程序的其余部分没有运行,我也不知道为什么。我的指令如下:“编译C程序。运行C程序。运行Python程序。编译并运行Java程序。检查自述文件,显示它。比较2个文件。清理中间文件。”

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

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

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

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

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

run-py:
        ./foo.py

read: README
        $(PAGER)

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

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

save-java:
        ./(run-java) >> $(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 test.out

1 个答案:

答案 0 :(得分:0)

  

每当我尝试运行此命令时,我得到的唯一输出是“ make:foo.o是最新的。”

默认情况下,make在未指定目标时运行最高规则。例如,您必须运行make run-c来调用相应的配方,或者可以将all规则放在任何其他依赖起作用的规则之前。

read: README
        $(PAGER)

我怀疑您可能会错过将$@后面的$(PAGER)作为参数。

save-java:
    ./(run-java) >> $(TEST_OUT)

您不能仅以此方式“包括”其他食谱。相反,重复run-java中的内容并附加重定向。

如果要指定“伪”目标,建议您将其指定为.PHONY,例如:

.PHONY: all run-c run-py run-java save-java test-java clean

要将某些目标标记为中间文件,请使用.INTERMEDIATE伪指令。 online和通过info命令都可以使用GNU Make手册(texinfo)。