make:规则调用规则


70

在生成文件中,我可以从另一个规则中调用一个规则吗?

如同:

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

Answers:


107

使用依赖关系或递归方法将一条规则连接到另一条规则。

依赖关系将这样完成(尽管顺序会有所不同):

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

递归生成将像这样完成(尽管它确实涉及子流程):

rule1:
        echo "bye"
rule2:
        date
rule3:
        @echo "hello"
        $(MAKE) rule1

两者都不是完美的。确实,使用递归可使您在构建循环时遇到重大问题。您可能还应该添加一条.PHONY规则,以将上面的那些规则标记为合成规则,以便目录中的流浪rule1(等)不会引起混乱。


27

只需添加具有所需顺序的新规则即可。

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

rule4: rule3 rule1

恕我直言,这是比其他答案更好的解决方案。
杰森·麦维塔

简单-我喜欢。
PetrVepřek'17

6
这不会强加命令。它只会确保Rule1和Rule3在Rule4之前完成,不能保证订购
CristianDonosoC

1
我同意CristianDonosoC的评论。由于这里的rule1和rule3之间没有排序,因此执行并行make(make -j2例如)将给您不确定的执行顺序。
seanahern

有一种方法可以按照指定的顺序运行先决条件:gnu.org/software/make/manual/html_node/Prerequisite-Types.html –使用此规则,Rule4应该为:rule4: | rule3 rule1
Yoone

21

Makefile不是程序性的;“规则”不像功能。也就是说,您可以指定一个规则是另一个规则的先决条件:

rule1:
    @echo "Rule 1"

rule2: rule1
    @echo "Rule 2"

如果这样做make rule2,您应该看到:

Rule 1
Rule 2

2
不过,令人沮丧的是,您无法摆脱“规则2 \ n规则1”的问题

2
@Tomalak:取决于您对“令人沮丧”的定义!一旦OP接受规则不是程序功能,那么就没有什么可沮丧的了。
奥利弗·查尔斯沃思

它没有回答问题。它应该输出规则2,然后输出规则1。这就是作者想要实现的。
nosbor

1
@nosbor-OP未声明所需的特定输出。
奥利弗·查尔斯沃思

4

GNU Make中有两个高级功能可以执行此操作,尽管仅应在恶劣的情况下使用。该SO在google中排名最高。

推荐使用规则先决条件,但有时您需要后置条件。

GNU拨打电话功能

GNU Make Eval函数

本质上,Eval允许您即时构建目标,而Call允许创建“定义”之类的功能。


0

一种简单的方法是:

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

mytarget: $(build_target)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.