Makefile make:规则调用规则

Makefile make:规则调用规则,makefile,Makefile,在makefile中,我可以从另一个规则调用一个规则吗 类似于: rule1: echo "bye" rule2: date rule3: @echo "hello" rule1 使用依赖项或递归生成从一个规则连接到另一个规则 依赖项将这样做(尽管顺序不同): 规则1: 回音“再见” 规则2: 日期 规则3:规则1 @回音“你好” 递归make将这样做(尽管它确实涉及子流程): 规则1: 回音“再见” 规则2: 日期 规则3:

在makefile中,我可以从另一个规则调用一个规则吗

类似于:

rule1:
        echo "bye"
rule2:
        date
rule3:
        @echo "hello"
        rule1

使用依赖项或递归生成从一个规则连接到另一个规则

依赖项将这样做(尽管顺序不同):

规则1:
回音“再见”
规则2:
日期
规则3:规则1
@回音“你好”
递归make将这样做(尽管它确实涉及子流程):

规则1:
回音“再见”
规则2:
日期
规则3:
@回音“你好”
$(制造)规则1

两者都不完美;事实上,如果构建循环,使用递归make可能会遇到重大问题。您可能还应该添加一个
.PHONY
规则,以便将上述规则标记为合成规则,这样目录中的一个错误
规则1
(等)就不会引起混淆。

生成文件不是程序性的;“规则”与函数不同。也就是说,您可以指定一条规则是另一条规则的先决条件:

rule1:
    @echo "Rule 1"

rule2: rule1
    @echo "Rule 2"
如果您确实制定了规则2,您应该看到:

Rule 1
Rule 2

GNU Make中有两个高级函数可以做到这一点,尽管它只应在情有可原的情况下使用。这在谷歌排名第一

规则先决条件是更推荐的,但有时你需要一个职位先决条件


本质上,Eval允许您动态地构建目标,而Call允许创建“defines”之类的函数。

只需添加一个新规则,并按照您想要的顺序进行排序

rule1:
        echo "bye"
rule2:
        date
rule3:
        @echo "hello"

rule4: rule3 rule1

一个简单的方法是:

ifeq (a, b)
    build_target:=one
else
    build_target:=two
endif

mytarget: $(build_target)

但令人沮丧的是,您无法从中获得“规则2\n规则1”it@Tomalak:取决于你对“令人沮丧”的定义!一旦OP接受了规则不是程序性的功能,那么就没有什么可沮丧的了。它没有回答这个问题。它应该输出规则2,然后输出规则1。这就是作者想要实现的。@nosbor-OP没有说明需要什么具体的输出。这是一个比其他答案好得多的解决方案。简单-我喜欢。这不会强加顺序。它只会确保第1条和第3条在第4条之前完成,而不保证第二次克里斯蒂安多诺索克的评论。由于此处的规则1和规则3之间没有顺序,因此执行并行make(例如,
make-j2
)将给出不确定的执行顺序。有一种方法可以按指定顺序运行先决条件:–使用此方法,规则4应该是:
rule4:| rule3 rule1