如何重启GNU make(不会导致错误)

时间:2014-05-26 18:54:22

标签: makefile gnu-make

我需要重新启动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

1 个答案:

答案 0 :(得分:0)

下面一行的makefile可能适合账单。 barbaz是目标 如果他们中间地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将会更新。任何非棘手的目标都将以简单的方式进行。

我已将allclean目标包含在内,以确保完整性。请注意all 需要编码才能发挥作用。