我正在编写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 $@
答案 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 '$<' > '$@'