如何在Makefile中将带引号的字符串转换为普通字符串?

Dan*_*ang 5 makefile

我不确定我是否已正确描述了这个问题,但目前我正在通过以下方式解决这个问题

QUOTEDSTR := "hello world"
NORMALSTR := $(shell echo $(QUOTEDSTR))
Run Code Online (Sandbox Code Playgroud)

是否有更多的内置方式'make'可以在不调用shell的情况下执行此操作?谢谢

Mad*_*ist 9

另外一个选项:

NORMALSTR := $(patsubst "%",%,$(QUOTEDSTR))
Run Code Online (Sandbox Code Playgroud)

Beta的答案将删除字符串中的每个引号.上述解决方案只会删除出现在开头和结尾的引号.例如:

QUOTEDSTR := -DTITLE=\"Title\"
Run Code Online (Sandbox Code Playgroud)

Beta的回答将导致-DTITLE=\Title\使用patsubst解决方案时的值,此值不会更改.

这取决于你想要什么.

编辑

如果你想处理空格并且仍然只按照@ stefanct的评论在变量的开头/结尾匹配引号,你将不得不玩一些技巧.首先,您需要找到一个非空白字符,您知道该字符永远不会出现在字符串中.让我们选择,^但如果你愿意,你可以选择别的东西.

算法是:将所有空格转换为此字符,然后从生成的单个"单词"中删除引号,然后将该字符的所有实例转换回空格,如下所示:

# Get a variable S that contains a single space
E :=
S := $E $E

NORMALSTR := $(subst ^,$S,$(patsubst "%",%,$(subst $S,^,$(QUOTEDSTR))))
Run Code Online (Sandbox Code Playgroud)

当然还有并发症; 这只处理空格,例如,不处理其他空白字符,如TAB.

  • 您的答案的压缩版本可能是: NORMALSTR = $(QUOTEDSTR:"%"=%) 其作用基本相同。 (2认同)

Bet*_*eta 8

这应该这样做:

NORMALSTR := $(subst $\",,$(QUOTEDSTR))
Run Code Online (Sandbox Code Playgroud)