我有一个Makefile,我使用多线程(-j8
专门)运行。
如果我缺少标识已编译版本的特定标记文件,我想强制执行make clean
和make 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
任何人都可以弄清楚如何正确规划规则和依赖关系,以便我可以在第二次生成文件吗?
答案 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)