【问题标题】:How to pass target stem to a shell command in Makefile如何将目标词干传递给 Makefile 中的 shell 命令
【发布时间】:2014-02-22 06:28:15
【问题描述】:

我正在编写一个静态模式规则来生成与模式匹配的目标的依赖项列表。依赖项是通过 shell 命令生成的(文件内容提供了有关依赖项的信息)。这是显式规则的示例:

f1.o: $(shell gendep src/f1/f1.source)
    ... (some compilation command here) ...

虽然这可行,但我不想为每个新目标重写它,因为我维护的是相同的文件结构。我对静态模式规则的尝试是这样的:

%.o: $(shell gendep src/%/%.source)
    ...

我在将词干(% 的匹配模式)传递给 shell 命令时遇到问题。 shell命令按字面意思解释,对src/%/%.source进行操作,当然不存在。

我怀疑有办法将词干传递给 shell 命令,但我似乎没有找到它。这里的任何专家都可以帮助我吗?对不起,如果这是一个新手问题(我确实是一个)。

【问题讨论】:

    标签: linux makefile gnu-make


    【解决方案1】:

    您尝试做的事情很困难,因为通常 Make 会在运行任何规则之前扩展 $(shell ...) 指令,甚至决定必须运行哪些规则。我们可以通过Secondary Expansion 来延迟这一点,这是一个稍微高级的制作技巧:

    .SECONDEXPANSION:
    
    %.o: $$(shell gendep src/$$*/$$*.source)
        ...
    

    还有other methods for automatic dependency generation

    【讨论】:

    • 我确实尝试过,但它不起作用。例如,当我尝试 $(shell gendep src/$*/$*.source) 时,我收到一个错误(由 gendep 引发),它正在寻找 src//.source.source。不确定我是否做错了什么。
    • @dkn37:对不起,我匆忙阅读了你的问题,我以为你指的是规则正文中的 shell 命令。我会修改...
    猜你喜欢
    • 2021-02-26
    • 2011-09-10
    • 2020-03-01
    • 2013-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多