如何使用 patsubst Makefile 替换?
How to replace using patsubst Makefile?
我有一个类似这样的生成文件。
我需要生成一个文件并将其移动为 abc.cpp(基本上去掉下划线后的所有内容,包括下划线
xyz:= abc_def
$(xyz):
(some commands here which generates a file)
mv file /tmp/$(patsubst _%,"",$@)
However this does not work. In fact it doesn't ever match the underscore "_" in $@
mv file /tmp/abc.cpp is what i want
“%”通配符在 patsusbst 中如何工作?
patsubst
函数对您不起作用,因为它只能匹配一个模式。您想要匹配两种模式:_
之前的任何内容和 _
之后的任何内容。 $(patsubst _%,...)
仅匹配 以 开头且 _
的单词,而您的单词 abc_def
不以 _
开头,因此 patsubst
是空操作。
要使用 GNU make 函数做你想做的事,你需要玩个把戏;类似于:
mv file /tmp/$(firstword $(subst _, ,$@))
这通过将 _
更改为 space 将字符串拆分为单词,然后取第一个单词。
如果您不回避使用辅助代码(即包含一个 GNUmake
库),那么 the GNUmake table toolkit 肯定可以做到这一点:
include gmtt.mk
xyz:= abc_def
$(xyz):
(some commands here which generates a file)
mv file /tmp/$(firstword $(call glob-match,$@,*_*)).cpp
glob-match
函数将字符串拆分为匹配元素的条纹,其中每个 glob 字符(*
、?
、[...]
)和逐字字符串部分(在你的情况只是 _
) 构成一场比赛。或者简单地说,$(call glob-match,this_is_a_string,*_is_a_*)
将 this_is_a_string
拆分为列表 this _is_a_ string
(注意空格)。
我有一个类似这样的生成文件。 我需要生成一个文件并将其移动为 abc.cpp(基本上去掉下划线后的所有内容,包括下划线
xyz:= abc_def
$(xyz):
(some commands here which generates a file)
mv file /tmp/$(patsubst _%,"",$@)
However this does not work. In fact it doesn't ever match the underscore "_" in $@
mv file /tmp/abc.cpp is what i want
“%”通配符在 patsusbst 中如何工作?
patsubst
函数对您不起作用,因为它只能匹配一个模式。您想要匹配两种模式:_
之前的任何内容和 _
之后的任何内容。 $(patsubst _%,...)
仅匹配 以 开头且 _
的单词,而您的单词 abc_def
不以 _
开头,因此 patsubst
是空操作。
要使用 GNU make 函数做你想做的事,你需要玩个把戏;类似于:
mv file /tmp/$(firstword $(subst _, ,$@))
这通过将 _
更改为 space 将字符串拆分为单词,然后取第一个单词。
如果您不回避使用辅助代码(即包含一个 GNUmake
库),那么 the GNUmake table toolkit 肯定可以做到这一点:
include gmtt.mk
xyz:= abc_def
$(xyz):
(some commands here which generates a file)
mv file /tmp/$(firstword $(call glob-match,$@,*_*)).cpp
glob-match
函数将字符串拆分为匹配元素的条纹,其中每个 glob 字符(*
、?
、[...]
)和逐字字符串部分(在你的情况只是 _
) 构成一场比赛。或者简单地说,$(call glob-match,this_is_a_string,*_is_a_*)
将 this_is_a_string
拆分为列表 this _is_a_ string
(注意空格)。