Используя GNU make, я пытаюсь решить проблему, аналогичную make recipe execute дважды - то есть дважды запустить рецепт Makefile.В моем случае, однако, рецепт запускается с целью .SECONDEXPANSION
, и два разных запуска будут вызываться с разными параметрами, чтобы генерировать разные версии выходного файла из одного и того же входного файла.То есть для входного файла foo
этот примерный Makefile должен вызываться через make foo.pdf
или make foo.expanded.pdf
для создания одного файла .pdf или make all
для построения обоих файлов .pdf:
.PHONY: all
all: foo.pdf foo.expanded.pdf
.SECONDEXPANSION:
%.expanded.pdf %.pdf: %
@echo building $(basename $@)
Из двух решений, приведенных в этом ответе, первое не подходит, потому что всегда выполняет правило дважды;Я хочу, чтобы он запускался дважды, когда пользователь запрашивает его.
Второе опубликованное решение - это концептуально то, что я искал и реализовало в приведенном выше примере Makefile, только с небольшой проблемой, которая не работает: хотя цель all
перечисляет оба файла .pdf как зависимости, при запуске make all
создается только один файл.
Существует ли способ заставить GNU make создавать два разных файла, используя одно и то же правило вa .SECONDEXPANSION
?
РЕДАКТИРОВАТЬ: Уточнил в описании проблемы, что один и тот же входной файл используется для построения обеих версий выходного файла, и измененный образец Makefile для включения этой зависимости.
РЕДАКТИРОВАТЬ: Я хотел бы, чтобы решение было как можно более масштабируемым;то есть, он должен работать, если входное имя файла содержит точки, указание дополнительного выходного файла foo.reduced.pdf
должно требовать только корректировки целей и рецепта в зависимости от ситуации и т. д. Это ограничивает выполнение строковой операции, которая основывается на именах файлов, которые выглядят точно так, как указано в этом узкомпример (например, изменение правила на %.pdf: $$(firstword $$(subst ., ,$$*))
завершится неудачно, если входной файл может быть foo
или foo.bar
).