C'è un modo per far funzionare GNU correttamente con nomi di file che contengono due punti?Faccine di escape nei nomi di file in un Makefile
Il problema specifico che sto incontrando riguarda una regola di modello. Ecco una versione semplificata che non dipende da caratteri di tabulazione taglia e incolla:
% make --version
GNU Make 3.81
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
This program built for x86_64-redhat-linux-gnu
% cat Makefile
COLON := \:
all: ; true
%.bar: ; cp $< [email protected]
x.bar: x.foo
%.foo: ; touch [email protected]
a$(COLON)b.bar: a$(COLON)b.foo
all: x.bar a$(COLON)b.bar
clean: ; rm -f *.foo *.bar
% make clean
rm -f *.foo *.bar
% make
touch x.foo
cp x.foo x.bar
cp a\:b.bar
cp: missing destination file operand after `a:b.bar'
Try `cp --help' for more information.
make: *** [a\:b.bar] Error 1
Sostituzione $ (due punti) con un letterale: produce esattamente lo stesso risultato. Senza la barra inversa, lo fa:
Makefile:6: *** target pattern contains no `%'. Stop.
Abbastanza bravo! Sto bene con $ (shell), la mia domanda era specifica per fare GNU comunque. Immagino che questo sarebbe un esempio di "cattiva disposizione dei file temporanei" di cui stava parlando l'altra risposta. Mi preoccupo un po 'di ciò che accade nel caso in cui la cosa che "ls" è un segnaposto per fallire e $ (POST) quindi non funziona. Voglio dire, suppongo che sia probabilmente tutto OK perché $ (PRE) è idempotente, giusto? E se potresti avere @ COLON @ nei tuoi nomi di file, basta usare un segnaposto ancora più lungo e ridicolo, magari con una lunga stringa casuale incorporata in esso .... – zaphod