make:后缀可变的目标

时间:2018-07-30 13:33:59

标签: makefile gnu-make

我正在使用GNU make构建自己的项目,并且支持该项目的多个版本。我有一个Makefile处理此任务。我的规则之一(用于清理dist)如下所示:

default_version := 2.4

clean-dist: clean-dist-$(default_version)
clean-dist-%:
    $(eval default_version := $(subst clean-dist-,,$@))
    if [ "$(default_version)" != "all" ]; then \
            rm -rf $(BUILDDIR)/program-src-$(default_version); \
    else \
            rm -rf $(BUILDDIR)/program-src-*; \
    fi

请给我建议,完成此任务的最佳方法是什么? 我的解决方案可以吗?

我更喜欢ifeq的{​​{1}},但它在解析make的第1阶段起作用。

1 个答案:

答案 0 :(得分:1)

您可以在模式规则的配方中使用$*自动变量。如果目标是all,则将其扩展为茎,即clean-dist-%的{​​{1}}:

clean-dist-all

您还可以为default_version := 2.4 clean-dist: clean-dist-$(default_version) clean-dist-%: if [ "$*" != "all" ]; then \ rm -rf $(BUILDDIR)/program-src-$*; \ else \ rm -rf $(BUILDDIR)/program-src-*; \ fi 设置一个特定规则,为另一个clean-dist-all设置一个模式规则。 Make可以选择以下特定规则:

clean-dist-something

最后,您可以使用default_version := 2.4 clean-dist: clean-dist-$(default_version) clean-dist-all: rm -rf $(BUILDDIR)/program-src-* clean-dist-%: rm -rf $(BUILDDIR)/program-src-$* make函数将所有这些因素考虑在内:

patsubst

注意:由于这些default_version := 2.4 clean-dist: clean-dist-$(default_version) clean-dist-%: rm -rf $(BUILDDIR)/program-src-$(patsubst all,*,$*) 相当危险,因此在您决定使用的解决方案之前进行测试可能是明智的选择(例如,在rm -rf ...命令之前添加echo)实际使用它。