web-dev-qa-db-ja.com

GNU Make、変数を小文字に変換するにはどうすればよいですか?

これはばかげた質問ですが、... GNU Make:

VAR = MixedCaseText
LOWER_VAR = $(VAR,lc)

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

上記の例では、VARのコンテンツを小文字に変換するための正しい構文は何ですか?示されている構文(および私が遭遇した他のすべて)の結果、LOWER_VARは空の文字列になります。

48
DonGar

いつでも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))
48
vrdhn

GNU Make標準ライブラリを使用せずに、gmakeでこれを直接行うことができます。

_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)のように_:=_だけでなく_=_を使用してください。そうすれば、変数が参照されるたびにではなく、変数が宣言されたときに1回だけシェルを呼び出すことができます!

お役に立てば幸いです。

44
Eric Melski

アクセント付きの大文字を処理するには:

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

結果:

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

これが少しきれいだと思う...

$(Shell tr '[:upper:]' '[:lower:]' <<< $(VAR))
3
altendky