我如何强制一直运行命令

 志薇俊元4565 发布于 2022-12-18 10:41

当前的Makefile有这样的东西:

target1 : lib1.a  lib2.a

target2 : lib1.a  lib3.a

target3 : lib3.a 

lib1.a:
    $(MAKE) -C sub_dir all

我想更改这个Makefile,以便在目标所依赖的任何地方lib1.a,它总是运行命令" $(MAKE) -C sub_dir all".换句话说,在上面的例子中,target1和target2将始终运行" $(MAKE) -C sub_dir all".有什么方法可以做到吗?

我知道以下不起作用:

target1 :  lib2.a
    $(MAKE) -C sub_dir all

target2 :   lib3.a
    $(MAKE) -C sub_dir all

target3 : lib3.a 

因为如果lib2.a没有更新,则该命令不会运行.我有一个限制,我只控制lib1.a,我无法改变lib2.a的构建方式.

任何帮助表示赞赏!

[ 更新 ]我最终得到了以下解决方案:

target1 : lib1.a  lib2.a

target2 : lib1.a  lib3.a

target3 : lib3.a 

lib1.a: relay

.PHONY: relay
relay:
    $(MAKE) -C sub_dir all

嗨Etan,您指出的GNU帮助说FORCE不如.PHONY效率高,但从您的解释来看,在我看来FORCE更好.我误解了吗?你能评论我的解决方案吗?

1 个回答
  • 我认为这Force Target就是你在这里寻找的东西.

    lib1.a: FORCE
            $(MAKE) -C sub_dir all
    
    FORCE: ;
    

    .PHONY规则相比(正如@MadScientist 在这里所建议的那样),这本身并不会强制所有依赖于lib1.a重建的目标.只有lib1.a实际改变才会这样做.

    一个更好的解决方案虽然可能完全摆脱子make,实际上有lib1.a这个makefile可用的依赖信息(直接或通过包含的makefile sub_dir),因为这避免了这整个"强制这个配方,因为我不能告诉你如何判断目标是否需要更新"问题.

    2022-12-18 10:46 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有