如果缺少特定的标记文件,强制清理并重新制作

时间:2014-11-04 13:44:18

标签: gnu-make

我有一个Makefile,我使用多线程(-j8专门)运行。

如果我缺少标识已编译版本的特定标记文件,我想强制执行make cleanmake all操作。 (在第二个make all之后完成制作时,应引入此文件。)

我似乎无法正常工作。我要么陷入循环,要么根本就没有发生。 (这是一个庞大系统的一部分,所以我不能只改变任何范式,我必须使用我的工作)

这是我到目前为止的相关部分。这不是最初的计划,但我转移了很多东西,这就是目前的情况:

VERSION = 2.8
.DEFAULT_GOAL := all

.PHONY : all
all : {some targets} | marker_file

###########################

.PHONY : marker_file
marker_file : build/$(VERSION).marker

.PHONY : check_marker
check_marker :
        ifeq (,$(wildcard build/$(VERSION).marker))
        @echo -e "\e[41mYOU ARE ON NEW PREREQUISITES $(VERSION)! FORCING MAKE CLEAN BEFORE REBUILDING\e[0m"
        $(MAKE) clean
        @mkdir -p build
        @touch build/$(VERSION).marker
        $(MAKE) $(MAKECMDGOALS)
        endif

# if the marker file needs generation, force clean and rebuild
build/$(VERSION).marker : check_marker

任何人都可以弄清楚如何正确规划规则和依赖关系,以便我可以在第二次生成文件吗?

1 个答案:

答案 0 :(得分:2)

您绝对不想使用仅限订单的先决条件。这迫使先决条件始终运行,但不会使用结果来确定是否运行目标。这几乎与你想要的完全相反。

此外,您不能在配方中使用make预处理器构造,例如ifeq(由TAB缩进)。食谱被传递给shell,而shell不是make,也不理解make ifeq之类的构造。

您可以使用make的自动重新执行功能:如果包含的文件发生更改,则make将重新执行。所以:

VERSION = 2.8
.DEFAULT_GOAL := all

.PHONY : all
all : {some targets}

###########################

MARKER_FILE = build/$(VERSION).marker

$(MARKER_FILE) :
        @echo -e "\e[41mYOU ARE ON NEW PREREQUISITES $(VERSION)! FORCING MAKE CLEAN BEFORE REBUILDING\e[0m"
        $(MAKE) clean MARKER_FILE=
        @mkdir -p $(@D)
        @touch $@

include $(MARKER_FILE)