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

Makefile 在GNU Make中,如何将变量转换为小写?,makefile,Makefile,这是一个愚蠢的问题,但是。。。。使用GNU Make: VAR = MixedCaseText LOWER_VAR = $(VAR,lc) default: @echo $(VAR) @echo $(LOWER_VAR) 在上面的示例中,将VAR的内容转换为小写的正确语法是什么?所显示的语法(以及我遇到的所有其他语法)导致LOWER_VAR是一个空字符串。您总是可以派生出tr LOWER_VAR = `echo $(VAR) | tr A-Z a-z` 或

这是一个愚蠢的问题,但是。。。。使用GNU Make:

VAR = MixedCaseText
LOWER_VAR = $(VAR,lc)

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

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

您总是可以派生出tr

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

您试图调用的“lc”函数来自

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

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

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

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)品种,请使用
:=
,而不仅仅是
=
,如
下变量:=$(shell echo$VAR | tr A-Z A-Z)
。这样,您只需在声明变量时调用shell一次,而不是每次引用变量时


希望能有所帮助。

要使用重音处理大写字母:

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

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

我觉得这个稍微干净一点

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

$(shell tr'[:upper:][:lower:][:lower:][p>如果安装了Python,它甚至可以在Windows上运行:

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

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)

在我的例子中,$(call lc,$VAR)语法也会导致一个空字符串。我猜库没有安装,并且要求所有开发人员都安装它对我来说不是最佳选择。但是,生成正在工作。或者,在它周围放一个$(strip)以去掉末尾的换行符:$(strip($shell echo$(VAR))| tr A-Z A-Z)要删除所有空格,请尝试
LOWER_VAR=$(shell$VAR | tr'[:upper:''[:LOWER:''.\sed's///g')
我相信您的意思是“LOWER_VAR=$(shell echo$(VAR)|tr'[:upper:'[:LOWER:'[:LOWER:'.]。如果没有回音,这就没有意义。是的-另一种方法是将
$VAR
替换为
$1
,因此用法将是
$(调用较低的\u VAR、value或$V或$(变量))
。通常,我只引用我的echo语句:
echo'$1'
不是万无一失的,但它减少了重定向、shell扩展等的机会。我所看到的唯一一个解决方案是,不管操作系统和shell工具如何,都能工作。@mtalexan它不起作用;a-Z只包含可能要转换为较低c的字符的一小部分ase.É.h,ПППбббхы.c等@James Moore,你是对的,但另一个答案中给出的tr语法也不能保证在非bash Shell上得到支持。从技术上讲,上面给出的语法将支持所有ASCII字符,并且可以根据需要扩展为Unicode字符,因为它是一个“除法”的很好例子并征服需要shell支持的应用程序:)
VAR = MixedCaseText
LOWER_VAR = $(call to_lower,$(VAR))


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


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