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

如何在依赖名称与目标体中复用替换操作的结果?

避免Makefile中SECONDEXPANSION的表达式重复

我尝试使用SECONDEXPANSION特性来动态选择依赖,现有如下代码片段,但希望避免重复编写$(word 4, $(subst -, , $@))这个表达式:

.SECONDEXPANSION:

mydep-4v1:
    echo 4v1

mydep-4v2:
    echo 4v2

foo-%: mydep-$$(word 4, $$(subst -, , $$@))
    X=$(word 4, $(subst -, , $@)) && \
    echo foo: $$X

测试命令及输出:

make foo-a-b-4v1-c-d # foo: 4v1
make foo-2-3-4v1-5-6 # foo: 4v1
make foo-a-b-4v2-c-d # foo: 4v2
make foo-2-3-4v2-5-6 # foo: 4v2

优化方案

通过定义变量复用重复的表达式,适配SECONDEXPANSION的延迟展开规则:

.SECONDEXPANSION:

# 封装重复的版本提取表达式,适配二次展开的转义要求
VERSION = $$(word 4, $$(subst -, , $$@))

mydep-4v1:
    echo 4v1

mydep-4v2:
    echo 4v2

foo-%: mydep-$(VERSION)
    X=$(VERSION) && \
    echo foo: $$X

说明

把重复的表达式封装到VERSION变量中,在依赖声明和命令执行部分统一引用。借助SECONDEXPANSION的特性,变量中的$$会在二次展开时解析为单个$,确保$@能正确匹配目标文件名,同时彻底避免了表达式重复书写。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 21:25:17