如何解决未保存在多线程makefile中的“仅订购”先决条件的订单
让我们考虑一下这个makefile
:
.PHONY: flash_bin
flash_bin: | build flash
CODE_CHANGED=0
.PHONY: build
build:
@echo "Run Build Process"
@if [ ! -f build_process ] || [ $(CODE_CHANGED) -eq 1 ]; then \
touch build_process; \
fi;
flash: tmp_config_file build_process
@echo "Flash to ESP"
@touch flash
tmp_config_file:
@echo "Config flashed"
@touch $@
乍一看,这段代码可能没有意义,但这只是一个简化的版本,它说明了以下问题:
运行make
时,输出符合预期。首先,执行build
规则。它可能会重建一些代码,这些代码通过文件build_process
指示。 之后,将触发flash
规则。仅当配置文件较早地刷新(通过tmp_config_file
表示)或如果它较早地重建(通过build_process
表示)时,该代码才刷新到某些设备。如您所见,仅当build
规则在之前被评估为flash
时,此makefile才有效,因为flash
取决于build
的结果。
到目前为止,太好了。现在,我运行 make -j8 并得到一个make: *** No rule to make target 'build_process',needed by 'flash'. Stop.
,显然,仅订购先决条件的顺序不再保留,并且make不会等到build
完成。
这是否意味着仅顺序的先决条件仅在单个线程的Makefile中起作用?如果是这样,为什么?是否可以保留顺序,但以多线程方式执行各个规则?
编辑:我知道,您可以通过以下方式强制执行预期的行为:
.PHONY: flash_bin
flash_bin:
$(MAKE) build; \
$(MAKE) flash
但是我仍然很感兴趣,为什么不能在多线程makefile中可靠地使用仅订购
解决方法
并行运行make
时,这意味着它可以安排许多目标同时执行。由于目标build
和flash
之间没有定义依赖关系,因此make
假定它们可以同时运行。它偶然在单线程中工作,因为Makefile
创建了一个未声明的文件,而flash
依赖于这个意外创建的文件。
它甚至不需要多线程处理即可失败,只需运行目标flash
,而无需事先运行build
,例如:
$ make flash
Config flashed
make: *** No rule to make target 'build_process',needed by 'flash'. Stop.
我相信您应该使flash
依赖于build
,或将目标build
重命名为build_process
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。