Makefile GNU make-多个作业,但MAKEFLAGS有--jobs等于1
我正在Windows 8上使用makeMakefile 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
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)
行
当我运行makefilemakeall-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对其进行加速,因此这一点没有实际意义。