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
) 在实际使用之前。
我正在使用 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
.
您可以在模式规则的配方中使用 $*
自动变量。如果目标是 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
) 在实际使用之前。