在我的源代码目录中,有一些名为 man_en , man_de 的文件。
现在我希望为每个人提供目标,例如:
/ usr / share / man / man1 / $(PROGRAM).1.gz 和
/ usr / share / man / de / man1 / $(PROGRAM).1.gz ,适用于以下规则:
/usr/share/man/man1/$(PROGRAM).1.gz: man_en
gzip -c man_en > /usr/share/man/man1/$(PROGRAM).1.gz
/usr/share/man/de/man1/$(PROGRAM).1.gz: man_de
gzip -c man_de > /usr/share/man/de/man1/$(PROGRAM).1.gz
如果有人将 man_fr 文件添加到源代码目录,则目标为
的的/ usr /共享/人/ FR / MAN1 / $(PROGRAM).1.gz
应自动生成或提供
如果没有修改我的Makefile的程序,我能实现这个吗?
答案 0 :(得分:1)
基本上这只是implicit pattern rule的应用程序,
但man_en
是一个例外,这有点复杂
生成目标名称的一般模式规则。这是一个示例解决方案:
<强>生成文件强>
PROGRAM ?= prog
FOREIGN_MAN_SRCS := $(subst man_en,,$(wildcard man_*))
FOREIGN_MAN_TARGS := $(patsubst man_%,/usr/share/man/%/man1/$(PROGRAM).1.gz,$(FOREIGN_MAN_SRCS))
EN_MAN_TARG := /usr/share/man/man1/$(PROGRAM).1.gz
.PHONY: all
all: $(FOREIGN_MAN_TARGS) $(EN_MAN_TARG)
/usr/share/man/man1/$(PROGRAM).1.gz: man_en
gzip -c man_en > /usr/share/man/man1/$(PROGRAM).1.gz
/usr/share/man/%/man1/$(PROGRAM).1.gz: man_%
gzip -c man_$* > /usr/share/man/$*/man1/$(PROGRAM).1.gz
将运行如下:
$ make --dry-run
gzip -c man_de > /usr/share/man/de/man1/prog.1.gz
gzip -c man_fr > /usr/share/man/fr/man1/prog.1.gz
gzip -c man_en > /usr/share/man/man1/prog.1.gz