如何使用 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(注意空格)。