【问题标题】:How to ignore dependency check in makefile如何忽略makefile中的依赖检查
【发布时间】:2020-11-17 18:51:37
【问题描述】:

我想忽略 makefile 中的依赖项检查。 例如,请看这段代码。

test:: test1 test2
    @echo "test"

test1:: back3
    @echo "test1"

test2:: back3
    @echo "test2"

back3::
    @echo "back3"

“make test”的结果

back3
test1
test2
test

但我想得到以下结果。

back3
test1
back3  <---- I want to run back3 again.
test2
test

我该怎么做?

【问题讨论】:

  • 如果依赖是最新的,除非每次都删除或修改,否则不会重新编译。

标签: makefile dependencies


【解决方案1】:

你写

我想忽略 makefile 中的依赖检查。

,您似乎意味着您希望在构建该目标之前重新构建每个目标的所有先决条件,特别是 for 该目标,以便可以多次构建先决条件。

make 根本不能那样工作。每次运行时,make 最多构建每个目标一次。先决条件列表帮助它确定需要构建哪些目标,按什么顺序,但指定先决条件不应被视为调用子例程。

如果您确实想要像调用子例程一样工作的东西,那么它需要在规则的配方中表达,而不是在其先决条件列表中。您的other answer 提供了两种选择。其中,递归 make 示例更通用。基于定义自定义函数的函数特定于 GNU make

【讨论】:

    【解决方案2】:

    你可以use Make recursively:

    test: test1 test2
        @echo "test"
    
    test1:
        $(MAKE) back3
        @echo "test1"
    
    test2:
        $(MAKE) back3
        @echo "test2"
    
    back3:
        @echo "back3"
    

    或使用"canned recipe":

    define run_back3
    @echo "back3"
    endef
    
    test: test1 test2
        @echo "test"
    
    test1:
        $(run_back3)
        @echo "test1"
    
    test2:
        $(run_back3)
        @echo "test2"
    

    【讨论】:

    • 你能详细说明一下吗,@Jason_AnN?我希望递归 make 替代方案,如本答案中所述,能够可靠地执行 echo test3 两次,作为构建目标 test 的一部分。此外,递归替代方案比自定义函数替代方案更通用,因为后者是特定于 GNU make 的。
    • @Jason_AnN:甚至一次。当然,我假设了一些事情;例如,makefile 被命名为“Makefile”而不是“grimalkin”。我错过了一个更合理的失败案例吗?
    • @JohnBollinger:关于第二个解决方案特定于 GNUMake 的好点。我倾向于将 GNUMake 视为默认设置,而忘记了 POSIX 与它不同。 (我个人认为 GNUMake 更胜一筹,而且使用范围更广,以至于 IEEE 真的应该采用它作为标准。)
    • 我认为 GNU 是一个很棒的make 实现,它的一些扩展确实很方便,但必须注意兼容性要求。我对它最大的不满不是软件本身,而是它的一些用户:我看到一些可怕的 GNU 扩展来自于人们试图编写 makefile,就好像它们是命令式程序一样。我讨厌那样。
    • @JohnBollinger:你知道人们没有写过 Big Balls of Mud 的通用、广泛使用的语言吗?往好的方面想;试想一下,如果每个人都是熟练的工程师,你的就业机会会减少多少。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-25
    • 2019-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多