Есть ли способ заменить \ с / на Gnu Make командными целями? - PullRequest
3 голосов
/ 27 июля 2010

Я запускаю рекурсивный make для окон, используя цели для каждого каталога, используя прямые косые черты для разделения компонентов пути.Если кто-то запускает

> make foo/bar

, он будет работать нормально.Но если кто-то запустит

> make foo\bar

, он не найдет цель для сборки:

make: Nothing to be done for `foo\bar'.

Я был бы рад, если бы мог добавить что-то подобное в мой Makefile верхнего уровня:

MAKECMDGOALS = $(subst \,/,$(MAKECMDGOALS))

Но такие вещи не работают.MAKECMDGOALS можно только читать.Или даже если я могу сделать цели с обратной косой чертой для всех моих обычных целей, как это:

$(DIRS): %: $(subst /,\,%)

Но это тоже не работает.Как лучше обойти это?

Ответы [ 2 ]

2 голосов
/ 27 июля 2010

Я нашел довольно хороший способ справиться с этим, не прибегая к скрипту для переноса make:

# $(call bstarget, foo foo/bar baz frob/niz)
# will result in the following targets being defined in place:
#   foo\bar: foo/bar
#   brob\niz: from/niz
bstarget = $(eval \
    $(foreach TARGET, $1, \
        $(if $(findstring /, $(TARGET)), \
            $(call bstargeteval, $(subst /,\,$(TARGET)), $(TARGET)))))
define bstargeteval
$1: $2

endef

Затем он может быть вызван в моем Makefile с помощью $ (call bstarget, $ (DIRS).))

0 голосов
/ 02 мая 2017

Я думаю, вам нужно 4 обратной косой черты (экранирование) в вашем выражении sub.

...