gpt4 book ai didi

variables - makefile:先决条件 $(variable) 中的 % 模式

转载 作者:行者123 更新时间:2023-12-01 13:32:27 27 4
gpt4 key购买 nike

我有这样的工作:

target1.PREREQUISITES = file11 file12 file13
target2.PREREQUISITES = file21 file22 file23

$(myDir)target1.sfx : $(target1.PREREQUISITES)
<same recipe here>

$(myDir)target2.sfx : $(target2.PREREQUISITES)
<same recipe here>

这就是我想要做的,但它不起作用:
target1.PREREQUISITES = file11 file12 file13
target2.PREREQUISITES = file21 file22 file23

$(myDir)%.sfx : $(%.PREREQUISITES)
<commun recipe here>

它总是说无事可做,因为目标是最新的。

我有一种感觉,问题可能是在每个 make 阶段做了什么,我的意思是,首先完成了 % 或 $.它应该工作得很好吗?

最佳答案

user657267 提出的第二个扩展效果很好。 GNU make 还支持一种循环机制,您可以使用它来实例化具有非常相似形式的多个规则:

target1.PREREQUISITES = file11 file12 file13
target2.PREREQUISITES = file21 file22 file23
TARGETS = target1 target2

# $(1) is a parameter to substitute. The $$ will expand as $.
define MY_rule
$$(myDir)$(1).sfx : $$($(1).PREREQUISITES)
<same recipe here>
endef
$(foreach target,$(TARGETS),$(eval $(call MY_rule,$(target))))
  • foreach遍历 $(TARGETS) 中的所有单词并将当前单词分配给 $(target) .
  • call执行 MY_rule 的扩展它替代的地方 $(1)当前值为 $(target)$$$ .
  • eval实例化 call 的结果扩展作为常规规则。
  • foreach第一次迭代的结果,例如,将是:
    $(eval $(call MY_rule,target1))
    call将评估为:
    $(myDir)target1.sfx : $(target1.PREREQUISITES)
    <same recipe here>

    eval将实例化它作为规则。 重要 : 不要忘记 call执行第一次扩展。所以,如果您的 <same recipe here>包含 $符号,不要忘记将它们加倍,除非它们被 call 扩展很好。如果你的配方使用了 shell 变量,你甚至可能会得到类似 $$$$var 的结果。 .

    这种机制比第二次扩展稍微强大和通用。它甚至可以使用多个参数来替换和嵌套循环:
    target1.PREREQUISITES = file11 file12 file13
    target2.PREREQUISITES = file21 file22 file23
    TARGETS = target1 target2
    DIRS = myDir

    # $(1): target
    # $(2): directory
    define MY_rule
    $(2)$(1).sfx : $$($(1).PREREQUISITES)
    <same recipe here>
    endef
    $(foreach target,$(TARGETS),$(foreach dir,$(DIRS),$(eval $(call MY_rule,$(target),$(dir)))))

    您甚至可以嵌入 foreach-eval-call里面 define-endef :
    target1.PREREQUISITES = file11 file12 file13
    target2.PREREQUISITES = file21 file22 file23
    TARGETS = target1 target2
    DIRS = myDir

    # $(1): target
    # $(2): directory
    define MY_rule_1
    $(2)$(1).sfx : $$($(1).PREREQUISITES)
    <same recipe here>
    endef

    # $(1): directory
    define MY_rule_2
    $$(foreach target,$$(TARGETS),$$(eval $$(call MY_rule_1,$$(target),$(1))))
    endef
    $(foreach dir,$(DIRS),$(eval $(call MY_rule_2,$(dir))))

    关于variables - makefile:先决条件 $(variable) 中的 % 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45156678/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com