2013-10-07 8 views
7

Ho un makefile come la seguente:Come scappare correttamente il segno "%" quando si usano le regole del modello e patsubst in 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 $^ 

La linea fondamentale è

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

Sto usando sia una regola di modello e patsubst, che a sua volta utilizza i segni di percentuale. Ho pensato di poter sfuggire al carattere % con un \, ma non riesco ancora a ottenere il comportamento previsto. Esecuzione di "fare m3" dà l'uscita

building m2 
building m1 
Building m3 
Dependencies are m2 m1 

Tuttavia, mi aspetto di ottenere

building m2_ 
building m1_ 
Building m3 
Dependencies are m2_ m1_ 

Commentando fuori quella linea e chiamando patsubst indirettamente attraverso una variabile che effettivamente produce tale uscita.

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

%: $$(SUBSTITUTE) 

Inoltre, ho provato che l'utilizzo di una regola di non-modello funziona, che mi fa pensare che sia qualcosa a che fare con l'interazione di regole di pattern e segni di percentuale:

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

risposta

11

\ in contesto makefile è per la continuazione della linea, non per "escape". Per sfuggire cose che li nasconde in una variabile:

PERCENT := % 

L'idea è, al momento un frammento makefile viene analizzato in cui il carattere di escape è significativo, a fuggire esso.

Quindi, nella tua situazione, è necessario utilizzare $$(PERCENT):

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

+0

Questo è come quello che ho fatto con nascondere l'intera espressione in una variabile, ma risponde più direttamente alla domanda. –

+0

Oh scusa, sì, non ho notato che l'hai fatto. Ho appena visto "questo non sembra possibile" e ho saltato il resto. –

1

I don' so di un modo per nascondere '%' dalla regola modello, ma in questo caso si può lavorare intorno ad esso:

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

questo non sembra essere possibile.

Per alcuni soluzioni alternative, vedere la domanda e la risposta di Beta.