【问题标题】:makefile, rule for multiple inputsmakefile,多个输入的规则
【发布时间】:2012-03-29 22:44:30
【问题描述】:

有一个耗时的步骤可以将一堆文件展平。

基本上我希望这是有效的语法

%.out: %.input1 %.input2
    merge $<1 $<2 $@

doit: project.out
    # project.out merged

我远非 makefile 专家,但我喜欢在只有两个文件时使用 .SULFIXS 来执行此操作,如果将其调整为两个输入或两个输出以供将来使用会非常好...

.SULFFIX: .in.out
.in.out:
    dosomething $< $@
doit: project.out

GNU Make 3.81

我发现了一些关于如何制定具有多个输出的规则的讨论,但没有一个具有多个输入的规则。

【问题讨论】:

    标签: makefile gnu-make


    【解决方案1】:
    %.out: %.input1 %.input2
        merge $<1 $<2 $@
    

    makefile 规则中没有 $1$2 自动变量,但是,$^ 是所有先决条件的列表。由于该规则只有两个先决条件,因此它扩展为%.input1 %.input2,或者更准确地说,扩展为$*.input1 $*.input2。因此:

    %.out: %.input1 %.input2
        merge $^ $@
    

    应该够了。

    .SULFFIXES,IMO,不是很有用,因为它使用了人们无法看到和更改的隐式规则定义。

    [更新]

    关于doit 目标,为了防止它每次您可能希望将规则命令更改为:

    doit: project.out
        # project.out merged
        touch $@
    

    【讨论】:

    • 好点,忘了 $^... 如果我只需要第一个命令怎么办?我运气不好?
    • 好的,刚刚测试过,你的例子 $
    • 嗯,但是在这种模式下,每次我运行 doit 规则时它都会被执行。
    • doit 规则不会产生它承诺产生的文件,因此它总是被执行以产生doit 文件。它类似于.PHONY 目标,除了如果doit 文件存在,它将不会被执行,除非它比它的先决条件(project.out)更早。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    相关资源
    最近更新 更多