在GNU Make中,如何将变量转换为小写?

时间:2009-03-20 00:51:04

标签: makefile

这是一个愚蠢的问题,但......与GNU Make:

VAR = MixedCaseText
LOWER_VAR = $(VAR,lc)

default:
        @echo $(VAR)
        @echo $(LOWER_VAR)

在上面的例子中,将VAR的内容转换为小写的正确语法是什么?显示的语法(以及我遇到的其他所有内容)导致LOWER_VAR为空字符串。

6 个答案:

答案 0 :(得分:48)

你总能产生tr

LOWER_VAR = `echo $(VAR) | tr A-Z a-z`

LOWER_VAR  = $(shell echo $(VAR) | tr A-Z a-z)

您尝试拨打的'lc'功能来自GNU Make Standard Library

假设已安装,则正确的语法为

LOWER_VAR  = $(call lc,$(VAR))

答案 1 :(得分:45)

您可以直接在gmake中执行此操作,而无需使用GNU Make Standard Library:

lc = $(subst A,a,$(subst B,b,$(subst C,c,$(subst D,d,$(subst E,e,$(subst F,f,$(subst G,g,$(subst H,h,$(subst I,i,$(subst J,j,$(subst K,k,$(subst L,l,$(subst M,m,$(subst N,n,$(subst O,o,$(subst P,p,$(subst Q,q,$(subst R,r,$(subst S,s,$(subst T,t,$(subst U,u,$(subst V,v,$(subst W,w,$(subst X,x,$(subst Y,y,$(subst Z,z,$1))))))))))))))))))))))))))

VAR = MixedCaseText
LOWER_VAR = $(call lc,$(VAR))

all:
        @echo $(VAR)
        @echo $(LOWER_VAR)

看起来有点笨重,但它完成了工作。

如果您使用$(shell)种类,请使用:=而不是=,如LOWER_VAR := $(shell echo $VAR | tr A-Z a-z)。这样,您只在声明变量时调用shell一次,而不是每次引用变量时都调用它!

希望有所帮助。

答案 2 :(得分:17)

使用重音处理大写字母:

LOWER_VAR  = $(shell echo $VAR | tr '[:upper:]' '[:lower:]')

结果:

$ VAR="Éclipse"
$ echo $VAR | tr A-Z a-z
Éclipse
$ echo $VAR | tr '[:upper:]' '[:lower:]'
éclipse

答案 3 :(得分:3)

我发现这个稍微清洁......

$(shell tr '[:upper:]' '[:lower:]' <<< $(VAR))

答案 4 :(得分:1)

如果安装了Python,即使在Windows上也可以运行:

$(shell python -c "print('$(VAR)'.lower())")

答案 5 :(得分:0)

GNU make 不包括用于大小写转换的字符串函数。因此,默认情况下没有定义 lc 函数。

但是 GNU Make 通常会启用 GNU Guile 支持(例如 Fedora 33 就是这种情况)。

因此,您可以调用 Guile 函数来转换大小写:

VAR = MixedCaseText
LOWER_VAR = $(guile (string-downcase "$(VAR)"))

default:
        @echo $(VAR)
        @echo $(LOWER_VAR)

或者如果你想封装 Guile 调用:

VAR = MixedCaseText
LOWER_VAR = $(call to_lower,$(VAR))


define to_lower
$(guile (string-downcase "$(1)"))
endef


default:
        @echo $(VAR)
        @echo $(LOWER_VAR)