Подтвердить что ты не робот

Скрытие двоеточий в именах файлов в Makefile

Есть ли способ заставить GNU работать правильно с именами файлов, которые содержат двоеточия?

Конкретная проблема, с которой я столкнулся, включает правило шаблона. Здесь упрощенная версия, которая не зависит от вырезания и вставки символов табуляции:

% 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

Замена $(COLON) на литерал: производит точно такой же результат. Без обратной косой черты он делает это:

Makefile:6: *** target pattern contains no `%'.  Stop.
4b9b3361

Ответ 1

Следующий хак работал у меня, хотя он, к сожалению, полагается на $(shell).

# modify file names immediately
PRE := $(shell rename : @[email protected] *)
# example variables that I need
XDLS = $(wildcard *.xdl)
YYYS = $(patsubst %.xdl,%.yyy,$(XDLS))
# restore file names later
POST = $(shell rename @[email protected] : *)

wrapper: $(YYYS)
    @# restore file names
    $(POST)

$(YYYS):
    @# show file names after $(PRE) renaming but before $(POST) renaming
    @ls

Поскольку PRE назначается с помощью: =, его связанная команда оболочки запускается до того, как будет оцениваться переменная XDLS. Ключ должен затем вернуть двоеточие на место после факта, явно вызвав $(POST).

Ответ 2

Я сомневаюсь, что это возможно: см. это обсуждение двоеточий в Make файлах. Таким образом, GNU make никогда не работал с именами файлов, которые содержат пробелы или двоеточия. Составитель, Пол Д. Смит, говорит, что добавление поддержки ускользания будет иметь тенденцию разорвать существующие make файлы. Кроме того, добавление такой поддержки потребует значительных изменений кода.

Возможно, вы сможете работать с каким-то неприятным временным расположением файлов.

Удачи!

Ответ 3

Есть другой способ, который я нашел сегодня при работе с переменными Makefile, определяющими имена файлов (содержащие двоеточия).

# definition
SOME_FNAME = $(NAME)__colon__$(VERSION)

# usage in target
foo:
    $(do_something) $(subst __colon__,:,$(SOME_FNAME))

Ответ 4

Я не позитив, это должно работать, но причина, по которой он говорит "отсутствующий файл назначения", проста:

%.bar: ; cp $< [email protected]

Эта строка говорит, чтобы скопировать цель из первой зависимости. ваш a: b.bar не имеет никакой зависимости, поэтому cp не работает. что вы хотите скопировать? a: b.foo? в этом случае вам понадобится:

%.bar: %.foo ; cp $< [email protected]