Makefile странная подстановка переменных

Сортировка -с некоторыми изменениями :]

Вы можете назначить другой IP-адрес вашей сетевой карте. Затем настройте Apache для работы на одном IP-адресе и Etherpad на другом.

Если на сервере уже есть второй сетевой адаптер, вы можете подключить его, настроить и сделать то же самое, что и выше.

Вы можете купить небольшую машину и настроить ее именно для этой задачи. Например, Raspberry Pi (с очень низким энергопотреблением также может работать без головы ).

5
11.03.2019, 23:49
2 ответа

В этом случае вам необходимо явно обрабатывать подстановочные знаки с помощью wildcardфункции (по крайней мере в GNU Make):

%.foo: %.bar
    cp $< $@

foos = $(patsubst %.bar,%.foo,$(wildcard *.bar))

test: $(foos)
    echo $(foos)

$(wildcard *.bar)заменяется на все файлы, оканчивающиеся на .bar, вызов patsubstзаменяет .barна .foo, после чего все цели обрабатываются, как и ожидалось.

8
27.01.2020, 20:33

Начнем с того, что *.foo-файла нет. Что делает make, так это ищет, как сделать *.fooбуквально, и первое правило делает это. Make расширяет $<до первого пререквизита -(*.bar, которым в данном случае является b.bar). Затем Make запускает команду оболочки cp b.bar *.foo. Поскольку *.foo отсутствует, оболочка буквально расширяет его до cp b.bar *.foo. Вот как вы получаете файл *.foo.

Вы можете проверить это, запустив make -d test.

Вы можете получить желаемый эффект, создав список целей на основе списка предварительных требований.

TARGETS = $(patsubst %.bar,%.foo,$(wildcard *.bar))
%.foo: %.bar
    @cp $< $@
test: $(TARGETS)
    @echo $(TARGETS)
    echo *.foo
6
27.01.2020, 20:33

Теги

Похожие вопросы