GNU make:选择互斥文件的友好方式

时间:2014-09-06 18:11:02

标签: makefile gnu-make

我正在编写GNU makefile来创建这样的许可文件:如果客户的文件存在,则将其复制到包目录,否则使用通用许可。我有大约十几个具有相同复制模式的文件。目标是将两个互斥的源文件中的一个复制到目标文件名。

有没有更好的方法来表达GNU make语法?这就是我现在所拥有的。我考虑将所有GENERIC文件复制到目录,然后用现有的CUST文件覆盖。

$(PDIR)/license.txt: | $(PDIR)
   if [ -f Package/license.txt.$(CUST) ] ; \
   then \
       cat Package/license.txt.$(CUST) >$(PDIR)/license.txt ; \
   else \
       cat Package/license.txt.GENERIC >$(PDIR)/license.txt ; \
   fi

编辑:感谢MadScientist的帮助。这是我的最终工作版本:

TARGETS = license.txt ...
final: $(addprefix ${PDIR}/,${TARGETS})
    @echo some output

$(foreach T,${TARGETS},$(eval ${PDIR}/$T: $(firstword $(wildcard Package/$T.${CUST} Package/$T.GENERIC Package/$T)) | ${PDIR}))

$(addprefix ${PDIR}/,${TARGETS}):
    @echo Creating substituted version of $< as $@
    @sed --expression="\
            ... \
        < '$<' \
        > '$@'

${PDIR}:
    mkdir $@

1 个答案:

答案 0 :(得分:2)

你可以使用通配符,然后(一如既往)你应该使用自动变量。像这样:

$(PDIR)/license.txt: $(firstword $(wildcard Package/license.txt.$(CUST) Package/license.txt)) | $(PDIR)
        cat '$<' > '$@'

如果您有很多这些,您还可以使用循环来定义目标:

TARGETS = license.txt

$(foreach T,$(TARGETS),$(eval $(PDIR)/$T: $(firstword $(wildcard Package/$T.$(CUST) Package.$T) | $(PDIR))))

$(addprefix $(PDIR)/,$(TARGETS)):
        cat '$<' > '$@'