我需要重新启动make
进程以防某些中间目标获得(重新)构建。
当PIP需求文件被(重新)编译时就是这种情况,因为生成的文件的校验和用在Makefile中使用的virtualenv的路径中。
如果需求文件更新,则应从头开始重建相同的$(MAKECMDGOALS)
。
我已经提出以下内容,但这需要使外部/初始制作过程失败(exit 1
),我想避免。
foo:
echo "foo"
# Need to restart make if this has been used as intermediate target.
if [ $(MAKECMDGOALS) != "$@" ]; then \
echo "Restarting make..."; \
touch $@; \
$(MAKE) $(MAKECMDGOALS); \
exit 1; \
fi
bar: foo
echo "bar"
.PHONY: bar
答案 0 :(得分:0)
下面一行的makefile可能适合账单。 bar
和baz
是目标
如果他们中间地foo
(a.k.a 棘手的目标),那将被破坏。
没有重新启动:相反,它安排得很棘手
在确保最高品牌$(MAKE)
之后,目标只有 由新foo
制作
最新。
.phony: all clean
tricky = bar baz
all:
$(MAKE) $(tricky)
foo:
echo "foo"
touch $@
clean:
rm -f foo
ifndef simple
tricky_goals = $(filter $(tricky),$(MAKECMDGOALS))
ifneq ($(tricky_goals),)
$(tricky_goals): foo
$(MAKE) simple=y $@
endif
else # ifndef simple
# All tricky goals follow...
bar: foo
echo "bar"
baz: foo
echo "baz"
endif # ifndef simple
行为取决于是否定义了变量simple
默认情况下不是。
如果定义了simple
,那么将会制定目标,无论它们是什么
显而易见的方式 - 如果不是foo
陷阱,他们的制作方式。
如果simple
未定义,则tricky_goals
将成为棘手的成员$(MAKECMDGOALS)
。
如果$(tricky_goals)
为空,则没有什么棘手的事情可做。否则目标列表
$(tricky_goals)
依赖于foo
。因此,如果foo
已过期,则会立即生效。
最后,通过为它调用一个简单的$(MAKE)
来实现每个棘手的目标,
其中foo
将会更新。任何非棘手的目标都将以简单的方式进行。
我已将all
和clean
目标包含在内,以确保完整性。请注意all
需要编码才能发挥作用。