2009-03-20 8 views
41

To głupie pytanie, ale .... z GNU Marka:W GNU Make, w jaki sposób mogę przekonwertować zmienną na małe litery?

VAR = MixedCaseText 
LOWER_VAR = $(VAR,lc) 

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

W powyższym przykładzie, jaka jest poprawna składnia do konwertowania zawartości var do obniżenia sprawę? Pokazana składnia (i wszystko inne, przez co przeszedłem) powoduje, że LOWER_VAR jest pustym łańcuchem.

Odpowiedz

41

zawsze można tarło off tr

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

lub

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

Funkcje 'lc' starasz się wywołać jest od GNU Make Standard Library

Zakładając, że jest zainstalowana odpowiednia składnia będzie być

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

W moim przypadku, $ (połączenia lc , $ VAR) powoduje również pusty ciąg znaków. Domyślam się, że biblioteka nie jest zainstalowana i byłoby nieoptymalne dla mnie wymagać od wszystkich naszych programistów, aby ją zainstalować. Jednak odradzanie działa. – DonGar

+0

Działa to tylko wtedy, gdy tr jest dostępny w systemie podstawowym – rakslice

40

Można to zrobić bezpośrednio w gmake, bez użycia GNU make Biblioteka standardowa:

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) 

Wygląda trochę niezgrabne, ale dostaje zadanie.

Jeśli wybierzesz odmianę $ (shell), użyj := zamiast tylko =, jak w LOWER_VAR := $(shell echo $VAR | tr A-Z a-z). W ten sposób wywołujesz powłokę tylko raz, gdy zmienna jest zadeklarowana, zamiast za każdym razem, gdy odwołuje się do zmiennej!

Nadzieję, że pomaga.

+14

+1 za szaleństwo :) –

+3

Jedyne rozwiązanie, jakie widziałem, działa niezależnie od systemu operacyjnego i narzędzi powłoki. – mtalexan

+1

@mtalexan to nie działa; A-Z obejmuje tylko niewielki podzbiór znaków, które możesz przekonwertować na małe litery. É.h, Проблемы.c, etc, itp., Itp. –

14

Aby obsłużyć dużych liter z akcentami:

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

Wyniki:

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

Aby usunąć wszystkie spacje, wypróbuj 'LOWER_VAR = $ (powłoka $ VAR | tr '[: upper:]' '[: lower:]' | sed 's/// g') ' –

+0

Wierzę, że masz na myśli" LOWER_VAR = $ (echo powłoki $ (VAR) | tr '[: Górna dolna:]')". Bez echa to naprawdę nie ma sensu. – mark

3

uważam to nieco czystsze ...

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

To wymaga powłoki do obsługi <<< –

Powiązane problemy