Как получить шаблонные правила для сопоставления имен файлов с пробелами в Makefile? - PullRequest
6 голосов
/ 04 июня 2011

В 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.

Та же проблема возникает, когда вы пишете make-файл.

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.

Есть ли хитрость, чтобы заставить пробелы работать с неявными правилами?

редактировать

Я отправил отчет об ошибке: http://lists.gnu.org/archive/html/bug-make/2011-06/msg00002.html

Ответы [ 2 ]

5 голосов
/ 04 июня 2011

Я не верю в это.Понятие списка разделенных пробелами токенов, передаваемых в виде строки, довольно глубоко укоренилось в make.Эти списки анализируются и обрабатываются.Есть причина, почему пробелы в именах каталогов и файлов считаются плохой практикой в ​​мире UNIX.

2 голосов
/ 14 февраля 2014

Это помеха, но на сегодняшний день людям по-прежнему иногда даются пути с пробелами.

В любом случае, создание ссылки вместо прямого доступа к каталогу в правиле% работает нормально.

# GNU makefile
DIR_WITH_SPACE=/c/Users/me/My\ Code

# *** DOESN'T WORK ***
%.h : $(DIR_WITH_SPACE)/%.h
    cp -v "$<" "$@"

fix:
  ln -s $(DIR_WITH_SPACES) dir_fixed

# Does work :)
%.h : dir_fixed/%.h
    cp -v "$<" "$@"
...