Автоматическое копирование зависимостей из других каталогов с помощью make - PullRequest
1 голос
/ 29 октября 2011

У меня есть make-файл с несколькими целями, который создается путем копирования файла из-за пределов рабочего каталога.

a.tex   : $(wildcard /foo/work1/a.tex)
    cp -p $< $@

b.tex   : $(wildcard /foo/work2/b.tex)
    cp -p $< $@

Я использую $(wildcard), потому что иногда я запускаю Make в системах, которые не имеют доступа к/foo.

Каков наилучший способ избежать повторения команд cp -p $< $@ для каждого правила?Некоторые параметры:

  • Настройка правила %.tex : %.tex.Это работает, но это также относится к целям, которые конкретно не указаны, поэтому я получаю много предупреждений, таких как make: Circular a.tex <- a.tex dependency dropped.
  • Определение последовательности команд с помощью define.Это кажется бессмысленным, поскольку команда состоит только из одной строки.Поэтому вместо того, чтобы копировать cp $< $@ в каждое правило, я бы определил последовательность cp-dep и скопировал cp-dep для каждого правила.
  • Определение команды в качестве переменной, чтобы я мог выполнить a.tex : $(wildcard /foo/work1/a.tex); $(CP-DEP)
  • Дублирование целевых имен в качестве дополнительного правила.a.tex b.tex : ; cp -p $< $@.Подвержены ошибкам.
  • Просто копирование и вставка.Неуклюжий, но эффективный и простой для понимания.

Ответы [ 3 ]

2 голосов
/ 30 октября 2011

Я думаю, что ваш copyrule излишний (и негибкий).Если вы не согласны с решением @ eriktous о том, что оно будет применять правило к целям, для которых вы не определили явно зависимости, это легко исправить с помощью статического шаблонного правила :

a.tex: $(wildcard /foo/work1/a.tex)
b.tex: $(wildcard /foo/work2/b.tex)
blue.tex: $(wildcard /some/other/path/green.tex)

TEXES = a.tex b.tex

$(TEXES): %.tex:
    cp -p $< $@

(Если это решит вашу проблему, вы должны принять ответ eriktous - это всего лишь вариант).

2 голосов
/ 29 октября 2011

Я не проверял его, но разве вы не можете просто использовать шаблонное правило без предварительных условий и указать предварительное условие для каждой цели в отдельной строке?

a.tex: $(wildcard /foo/work1/a.tex)
b.tex: $(wildcard /foo/work2/b.tex)

%.tex:
    cp -p $< $@

Кстати.разве функция подстановки не возвращает пустую строку, когда не находит соответствия, так что $< также пусто?Не вызовет ли это проблемы с cp?

1 голос
/ 30 октября 2011

Я закончил тем, что сделал это:

COPYFILES = /foo/work1/a.tex /foo/work2/b.tex

define copyrule
$(notdir $(1)): $$(wildcard $(1))
    cp -p $$< $$@
endef
$(foreach file,$(COPYFILES),$(eval $(call copyrule,$(file))))

Преимущество этого метода заключается в том, что я могу легко добавлять новые файлы с минимумом стандартного текста и легко копировать часть правила этого в новыйMakefile.Недостатки в том, что я больше не могу изменить имя файла назначения, а реализация довольно непрозрачна для людей с меньшим опытом работы с makefile.

...