【问题标题】:GNU make: friendly way to choose mutually exclusive filesGNU make:选择互斥文件的友好方式
【发布时间】:2014-09-06 18:11:01
【问题描述】:

我正在编写一个 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 $@

【问题讨论】:

    标签: makefile gnu-make


    【解决方案1】:

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

    $(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 '$<' > '$@'
    

    【讨论】:

    • 我正在阅读文档以尝试了解发生了什么。在您的第二个示例中,最后一个 make 目标仅包含 ${TARGETS} 中的第一个文件。我该如何解决?也没有创建 $(PDIR),foreach 中“|$(PDIR)”的目的是什么?
    • 没关系,foreach 缺少一个结束括号,我把它放在错误的地方。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-03
    • 2011-01-12
    • 2010-12-06
    • 2015-10-23
    • 2011-09-24
    • 2021-12-24
    相关资源
    最近更新 更多