make: 带有变量后缀的目标

make: target with variable suffix

我正在使用 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 by make 但它适用于解析 Makefile.

的第 1 阶段

您可以在模式规则的配方中使用 $* 自动变量。如果目标是 clean-dist-all:

,它会扩展为词干,即 all for clean-dist-%
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 设置特定规则,为另一个 clean-dist-something 设置模式规则。如果可以选择,Make 将更喜欢特定规则:

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-$*

最后,您可以使用 patsubst make 函数分解所有这些因素:

default_version := 2.4

clean-dist: clean-dist-$(default_version)

clean-dist-%:
    rm -rf $(BUILDDIR)/program-src-$(patsubst all,*,$*)

注意:由于这个 rm -rf ... 东西非常危险,测试您决定使用的解决方案可能是明智的(例如通过在 rm -rf ... 命令之前添加 echo ) 在实际使用之前。