【发布时间】:2016-10-23 07:16:41
【问题描述】:
最新版本的make 有一个选项--output-sync 可以使每个目标的STDOUT 原子化,这样在使用make --jobs=N 时来自多个目标的语句不会交错
很遗憾,我必须使用make v 3.81,因为这是我们的 SDK 附带的。
为了确定我是否需要--output-sync,我在我的目标周围添加了一些“保护声明”
all: $(patsubst %.cpp, %.o, $(wildcard *.cpp))
%.o: %.cpp
@echo BEFORE
@echo MAKEFLAGS=$(MAKEFLAGS)
qcc.exe $(CC_FLAGS) $@ $<
@echo AFTER
输出非常交错。
AFTER
BEFOREAFTER
AFTER
AFTER
有没有办法模拟--output-sync 功能?
我知道构建速度可能会受到影响,例如,如果有一种方法可以“锁定 STDOUT 互斥体”预配方并在配方后释放它。
如果需要,我可以修改我们的每个目标。
【问题讨论】:
-
不使用
-j选项?这将避免交错,并且在不修改 makefile 的情况下很容易做到,并且大致相当于您计划做的任何事情,只是更容易。该功能仅在 GNU Make 4.2 中吗? GNU Make 4.2.1 是否解决了您在 4.2 中遇到的问题? -
@JonathanLeffler 我必须使用
-j来获得并行构建。我会更新关于make版本的帖子。