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

Makefile GNU make:选择互斥文件的友好方式,makefile,gnu-make,Makefile,Gnu Make,我正在编写一个GNU makefile来创建一个许可证文件,如下所示:如果客户的文件存在,那么将其复制到包目录,否则使用通用许可证。我有十几个文件有相同的复制模式。目标是将两个互斥源文件中的一个复制到目标文件名 有没有更好的方式用GNU make语法来表达这一点?这是我目前拥有的。我考虑将所有通用文件复制到目录中,然后用现有CUST文件覆盖 $(PDIR)/license.txt: | $(PDIR) if [ -f Package/license.txt.$(CUST) ] ; \

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

有没有更好的方式用GNU make语法来表达这一点?这是我目前拥有的。我考虑将所有通用文件复制到目录中,然后用现有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
编辑:感谢疯狂科学家的帮助。以下是我的最终工作版本:

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 $@
TARGETS=license.txt。。。
最终:$(addprefix${PDIR}/,${TARGETS})
@回音
$(foreach T,${TARGETS},$(eval${PDIR}/$T:$(firstword$(通配符包/$T.${CUST}包/$T.GENERIC包/$T))|${PDIR})
$(addprefix${PDIR}/,${TARGETS}):
@echo正在创建$<'$您可以使用通配符,然后(一如既往)应该使用自动变量。如下所示:

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

cat'$我正在阅读文档,试图了解发生了什么。在第二个示例中,最后一个make目标仅包括${TARGETS}中的第一个文件。我如何解决这个问题?同时,$(PDIR)也没有被创建,“|$(PDIR)的目的是什么“在foreach?没关系,foreach缺了一个结尾部分,我把它放错地方了。”。非常感谢。
TARGETS = license.txt

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

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