В GNU make docs документально зафиксировано, что '%' соответствует "любой непустой подстроке". Однако, кажется, что на самом деле оно совпадает только с непустыми подстроками, которые не содержат пробела. Например, скажем, что вы делаете это:
mkdir /tmp/foo
cd /tmp/foo
echo 'int main() { return 0; }' > "test.c"
echo 'int main() { return 0; }' > "test space.c"
Теперь вы должны быть в состоянии собрать их, используя встроенные в GNU Make правила шаблонов:
anthony@Zia:/tmp/foo$ make "test"
cc test.c -o test
anthony@Zia:/tmp/foo$ make "test space"
make: *** No rule to make target `test space'. Stop.
Та же самая проблема возникает, когда вы пишете makefile.
anthony@Zia:/tmp/foo$ rm test
anthony@Zia:/tmp/foo$ echo 'all: test test\ space' > Makefile
anthony@Zia:/tmp/foo$ make
cc test.c -o test
make: *** No rule to make target `test space', needed by `all'. Stop.
Даже если вы явно добавите в %: правило %.c
, результат будет тот же самый. Но если вы явно добавите в makefile такое правило, то это сработает:
test\ space: test\ space.c
$(CC) -o "$@" "$<" # first char is tab, of course.
Есть ли трюк, чтобы заставить пробелы работать с неявными правилами?
I've sent a bug report: http://lists.gnu.org/archive/html/bug-make/2011-06/msg00002.html