如何创建检查任何给定目标名称的源的通用Makefile?

时间:2016-05-02 19:29:38

标签: makefile

我希望有一个通用的Makefile,它接受任何目标名称和目标名称,检查是否存在某些源,然后执行一些命令。例如,我希望能够输入:

make mytarget

然后make应该检查是否存在 mytarget.src1 mytarget.src2 ,如果是,则执行一些命令。

我有以下makefile:

%:
    $(MYCOMMANDS) $*.scr1 $*.scr2

唯一的问题是它在运行 $(MYCOMMANDS)之前不会检查$ .scr1和$ .scr2是否存在。这是可以理解的,因为我还没有指定任何依赖项。但是,当我尝试:

%: $*.src1 $*.src2
    $(MYCOMMANDS) $*.scr1 $*.scr2

它现在没有运行 $(MYCOMMAND),并且没有规则来制作指定的目标。

有人可以解释为什么在我的第二个代码中找不到目标吗?另外,我怎样才能实现我想要的行为?

2 个答案:

答案 0 :(得分:1)

编写模式规则的正确方法是在目标中使用模式(%):

%: %.src1 %.src2
        $(MYCOMMANDS) $^

请参阅GNU make手册中的Pattern Rules。另请参阅Automatic Variables。顺便说一句,第二个链接中的第三段将解释为什么在先决条件中使用$*进行第二次尝试无效。

答案 1 :(得分:0)

我能够使用MAKECMDGOALS变量获得我想要的行为。所以:

 Task<Void> longRunningTask = new Task<Void>() {

        @Override
        protected Void call() throws Exception {
            dbConnect();
            Platform.runLater(() -> status.setText("Connected"));
            return null;
        }
    };


    button.setOnAction(e -> {
        new Thread(longRunningTask).start();
    });

做我想要的。它会检查以确保存在.src1和.src2。如果他们不会报告错误,如果他们这样做,将运行$(MYCOMMANDS)。