【问题标题】:make: execute an action for each prerequisitemake:为每个先决条件执行一个动作
【发布时间】:2011-10-27 15:41:07
【问题描述】:

我想在我的 Makefile 中建立一个这样的规则:

log: test_A test_B
    ./test_A >> $@
    ./test_B >> $@

test_Atest_B$(TESTS) 变量的一部分。

那么,是否可以为 GNU/make 中的每个先决条件执行一个操作(这里:调用程序)?

注意:How do I make a makefile rule execute its prerequisites? 并不能完全解决这个问题,因为需要目标 log (make log)。

【问题讨论】:

    标签: makefile


    【解决方案1】:

    基本上你想遍历先决条件。这样做的明显方法是平底船:

    log: test_A test_B
            for f in $^; do ./$$f; done
    

    或者您可以将循环编写为 GNU Make foreach 循环,但您必须注意循环体产生的命令出现在单独的行中(通过 define)或以shell 终止符(即分号,更简单):

    log: test_A test_B
            $(foreach f,$^,./$(f);)
    

    最后,在这种情况下,您可以将它写得更简洁、更晦涩,作为每个要循环的项目的模式替换:

    log: test_A test_B
            $(patsubst %,./%;,$^)
    

    (我相信您可以根据需要添加输出重定向和$(TESTS) 变量。)

    【讨论】:

    • 感谢您的回答,它证实了我的最终结果:$(foreach test, $^, $(shell ./$(test) >> $@))
    • 如果这是您的 log 规则的命令,那么 $(shell ...) 是一种颠覆性的东西:规则的命令将为空,test_? 的执行将作为找出命令的副产品发生(而不是通过执行命令发生)。哲学上是错误的,而且 - 更实际地 - 不可能扩展以捕获您的 test_? 脚本之一的失败。 (但尽管如此,您似乎想将此答案标记为已接受...)
    • 不会循环两次,一次用于 test_A,一次用于 test_B?我有一个类似的问题,make 的行为很奇怪。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-03
    • 2012-02-21
    • 2010-10-14
    • 1970-01-01
    相关资源
    最近更新 更多