我正在使用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阶段起作用。
答案 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
)实际使用它。