从变量生成Makefile中的Target

时间:2017-05-14 10:17:56

标签: makefile gnu-make

在我的源代码目录中,有一些名为 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的程序,我能实现这个吗?

1 个答案:

答案 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

我推荐GNU Make manual