make:规则调用规则

Jua*_*blo 62 makefile

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

相近:

rule1:
        echo "bye"
rule2:
        date
rule3:
        @echo "hello"
        rule1
Run Code Online (Sandbox Code Playgroud)

Don*_*ows 97

使用依赖关系或递归制作从一个规则连接到另一个规则.

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

rule1:
        echo "bye"
rule2:
        date
rule3: rule1
        @echo "hello"
Run Code Online (Sandbox Code Playgroud)

递归make会像这样完成(虽然它涉及一个子进程):

rule1:
        echo "bye"
rule2:
        date
rule3:
        @echo "hello"
        $(MAKE) rule1
Run Code Online (Sandbox Code Playgroud)

两者都不完美; 事实上,如果你构建一个循环,你可以通过递归使你遇到重大问题.您也可能应该添加一条.PHONY规则,以便将上述规则标记为合成规则,以便目录中的杂散rule1(等)不会引起混淆.


Joh*_*rry 22

只需添加您想要的订单的新规则..

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

rule4: rule3 rule1
Run Code Online (Sandbox Code Playgroud)

  • 这不会强制订购.它只会确保rule1和rule3在rule4之前完成,无法保证订购 (5认同)

Oli*_*rth 19

Makefile不是程序性的; "规则"与功能不同.也就是说,您可以指定一个规则是另一个规则的先决条件:

rule1:
    @echo "Rule 1"

rule2: rule1
    @echo "Rule 2"
Run Code Online (Sandbox Code Playgroud)

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

Rule 1
Rule 2
Run Code Online (Sandbox Code Playgroud)

  • 然而,令人沮丧的是,你无法获得"规则2 \n规则1" (2认同)
  • @Tomalak:取决于你对"令人沮丧"的定义!一旦OP接受规则不是程序功能,那么就没有太多可挫的了. (2认同)

kev*_*inf 5

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

更建议使用规则先决条件,但有时您需要后置先决条件。

GNU 拨打电话功能

GNU Make 评估函数

从本质上讲,Eval 允许您动态构建目标,而 Call 允许创建“定义”等函数。