【问题标题】:Makefile - up to date rule which is not a fileMakefile - 不是文件的最新规则
【发布时间】:2013-10-10 10:19:31
【问题描述】:

考虑到这个(非常)简单的 Makefile,

all: a b
    @echo done
a:
    touch $@
b:
    touch $@

我没有得到预期的行为。

事实上,我希望我的规则“全部”仅在其依赖项之一不是最新的情况下才被执行。

但是在第一次 $ make 我得到

touch a
touch b
done

还有其他人

done

我理解“最新”通常限定一个文件,但是...... 有没有办法让规则“所有”在其所有依赖项都是最新的时候被认为是最新的?

非常感谢,

ps:我知道 $ touch all 的诀窍,但这不是重点

【问题讨论】:

    标签: makefile dependencies rules


    【解决方案1】:

    没有。如果目标不存在,则 make 将始终运行配方。

    您的all 配方可以通过一些奇怪的方式检查是否已构建任何先决条件,如果是,则表现不同。至少,如果您使用的是 GNU make。

    预计到达时间:

    一种方法是将$(eval BUILT = 1) 添加到每个目标,然后在all 目标中您可以查看是否设置了BUILT。这需要一个较新的 GNU make 版本:

    BUILT =
    
    all: a b
            @[ -n '$(BUILT)' ] && echo done
    a:
            touch $@ $(eval BUILT = 1)
    b:
            touch $@ $(eval BUILT = 1)
    

    【讨论】:

    • 那些“骇人听闻的方式”可能是什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多