2013-10-07 13 views
7

Mam makefile tak:Jak poprawnie wymazać znak "%" podczas używania wzorców i patsubst w GNU make?

m1: 
    @echo building m1 

m1_: 
    @echo building m1_ 


m2: 
    @echo building m2 

m2_: 
    @echo building m2_ 

m3_DEPS = m2 m1 

SUBSTITUTE=$(patsubst %,%_,$([email protected]_DEPS)) 
.SECONDEXPANSION: 

#%: $$(SUBSTITUTE) 
%: $$(patsubst \%,\%_,$$([email protected]_DEPS)) 
    @echo Building [email protected] 
    @echo Dependencies are $^ 

Kluczem linia jest

%: $$(patsubst \%,\%_,$$([email protected]_DEPS)) 

używam zarówno regułę wzoru i patsubst, która sama korzysta oznaki procentowe. Pomyślałem, że mogę uciec z postaci % z \, ale nadal nie dostaję oczekiwanego zachowania. Running „make m3” daje wyświetlamy

building m2 
building m1 
Building m3 
Dependencies are m2 m1 

Ja jednak oczekiwać, aby uzyskać

building m2_ 
building m1_ 
Building m3 
Dependencies are m2_ m1_ 

Wypowiadając się tej linii i wywołanie patsubst pośrednictwem zmiennej ma w rzeczywistości wytworzenia tejże produkcji.

SUBSTITUTE=$(patsubst %,%_,$([email protected]_DEPS)) 

%: $$(SUBSTITUTE) 

Również ja testowałem że stosując zasadę non-wzór działa, co sprawia, że ​​myślę, że to ma coś wspólnego z interakcji reguł wzorców oraz odsetek objawów:

m3: $$(patsubst %,%_,$$([email protected]_DEPS)) 

Odpowiedz

11

\ w kontekście makefile służy do kontynuacji linii, a nie do "ucieczki". Uciec rzeczy ukryć je w zmiennej:

PERCENT := % 

Chodzi o to, w momencie fragment makefile jest analizowany, gdzie uciekł charakter ma znaczenie, to uciec.

Tak więc w sytuacji, trzeba użyć $$(PERCENT):

$$(patsubst $$(PERCENT),$$(PERCENT)_,$$([email protected]_DEPS))

+0

To jakby co ja z ukrycia całą ekspresję w zmiennej, ale w bardziej bezpośredni sposób odpowiada na pytanie. –

+0

Przepraszam, tak, nie zauważyłem, że to zrobiłeś. Właśnie zobaczyłem, że "to nie wydaje się możliwe" i pominąłem resztę. –

1

I don” t znać sposób na ukrycie "%" od reguły wzoru, ale w tym przypadku można obejść to:

%: $$(addsuffix _,$$($$*_DEPS)) 
    @echo Building [email protected] 
    @echo Dependencies are $^ 
0

To nie wydaje się być możliwe.

Kilka obejść znajduje się w odpowiedzi na pytanie i na Becie.

Powiązane problemy