Makefile GNU make-多个作业,但MAKEFLAGS有--jobs等于1

Makefile GNU make-多个作业,但MAKEFLAGS有--jobs等于1,makefile,Makefile,我正在Windows 8上使用make C:\Users\<User>\Desktop\A\test_compile>make -v GNU Make 3.81 Copyright (C) 2006 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABIL

我正在Windows 8上使用make

C:\Users\<User>\Desktop\A\test_compile>make -v
GNU Make 3.81
Copyright (C) 2006  Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.

This program built for Windows32
C:\Users\\Desktop\A\test\u compile>make-v
GNU Make 3.81
版权所有(C)2006免费软件基金会。
这是自由软件;有关复制条件,请参见源。
没有担保;甚至不是为了适销性或是否适合
特殊目的。
这个程序是为Windows32构建的
这是我的makefile

CPP_FILES := $(wildcard *.cpp)
OBJ_FILES := $(addprefix obj/,$(notdir $(CPP_FILES:.cpp=.o)))
LD_FLAGS := -o

all: $(patsubst %.cpp, %.o, $(wildcard *.cpp))
    @echo MAKEFLAGS=$(MAKEFLAGS)
    rm *.o

%.o: %.cpp
    @echo MAKEFLAGS=$(MAKEFLAGS)
    qcc.exe $(CC_FLAGS) $@ $< 
CPP_文件:=$(通配符*.CPP)
OBJ_文件:=$(addprefix OBJ/,$(notdir$(CPP_文件:.CPP=.o)))
LD_标志:=-o
全部:$(patsubst%.cpp、%.o、$(通配符*.cpp))
@echo MAKEFLAGS=$(MAKEFLAGS)
rm*.o
%.o:%.cpp
@echo MAKEFLAGS=$(MAKEFLAGS)
qcc.exe$(CC_标志)$@$<
注意我为调试添加的
@echo MAKEFLAGS=$(MAKEFLAGS)

当我运行makefile
makeall-j64
时,我确实得到了并行作业-我的所有内核都处于活动状态-但是echo MAKEFLAGS是:

MAKEFLAGS=-j1

为什么它不说
MAKEFLAGS=-j64

来自

-j
”选项是一种特殊情况(请参阅)。如果将其设置为某个数值“
N
”,并且您的操作系统支持它(大多数UNIX系统都支持;其他系统通常不支持),则父级
make
和所有子级
make
将进行通信,以确保它们之间只有“
N
”作业同时运行。请注意,任何标记为递归(请参阅)的作业都不计入总作业数(否则我们可能会使“
N
”子
make
s运行,并且没有剩余的插槽用于任何实际工作!)

如果您的操作系统不支持上述通信,则始终将“
-j 1
”置于
MAKEFLAGS
中,而不是您指定的值。这是因为如果将“
-j
”选项传递给sub-
make
s,那么并行运行的作业将比您要求的多得多

您的make版本确实支持并行作业,但它没有必要的机制在make的递归调用之间同步作业,因此它在
MAKEFLAGS
中将作业设置为1


在make 4.0中为windows添加了对该功能的支持。

可能重复,我将在周一尝试使用不同版本的make。结果表明,windows只有3.81版本,我必须自己编译4.2。我为windows构建了make 4.2,make标志是正确的值。但由于现有的make文件不能在并行模式下执行,我不得不使用electriccloud对其进行加速,因此这一点没有实际意义。