如何在依赖名称与目标体中复用替换操作的结果?
避免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
相关产品推荐
相关产品推荐

