You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Makefile中模式为函数返回值时patsubst与subst为何失效?

Makefile中patsubst/subst函数使用call返回值失效问题

我编写了一个包含new和new2两个目标的Makefile,期望用patsubst和subst函数移除或替换路径中的特定字符串。new目标里函数工作正常,但new2目标中,当模式或替换值来自函数返回值时,函数直接失效。

我的Makefile代码:

path := .././../log
from := log
new:
    @echo "new------------"
    @echo $(path)
    @echo $(from)
    @echo $(patsubst %$(from),%,$(path))
    @echo $(subst $(from),, $(path))

define get_log
    log
endef

from2 := $(call get_log, $(path))
new2:
    @echo "new2------------"
    @echo $(path)
    @echo $(from2)
    @echo $(patsubst %$(from2),%,$(path))
    @echo $(subst $(from2),, $(path))

执行make new new2后的输出:

new------------
.././../log
log
.././../
.././../
new2------------
.././../log
log
.././../log
.././../log

问题原因

问题出在get_log宏定义里的log前面有多余的空格。Makefile中define定义的宏会保留内容里的所有空白字符,所以from2的实际值是带四个前导空格的log,而不是纯字符串log。这时候用%$(from2)去匹配.././../log时,因为目标字符串的后缀是无空格的log,完全不匹配;subst函数也找不到带空格的子串,自然无法完成替换。

解决方法

有两种方式可以修复:

  1. 修改宏定义,去除多余空格
    把get_log里的log前面的空格删掉:

    define get_log
    log
    endef
    
  2. 用strip函数去除返回值的前后空白
    如果不能修改宏定义,可以在调用后用strip函数清理from2的前后空格:

    from2 := $(strip $(call get_log, $(path)))
    

内容的提问来源于stack exchange,提问作者bin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 01:26:05