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

时间:2016-05-20 21:07:40

标签: makefile

我在Windows 8上使用make

...ShapelessExperimentsTest.scala:17: could not find implicit value for parameter lgen: shapeless.LabelledGeneric[G]

这是我的makefile

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

注意我为调试添加的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) $@ $< 行。

当我运行makefile @echo MAKEFLAGS=$(MAKEFLAGS)时,我会得到并行作业 - 我的所有内核都处于活动状态 - 但回显MAKEFLAGS是:

make all -j64

为什么不说MAKEFLAGS=-j 1

1 个答案:

答案 0 :(得分:3)

来自manual

  

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

     

如果您的操作系统不支持上述通信,则“make”始终放入-j 1而不是您指定的值。这是因为如果将“MAKEFLAGS”选项传递给子-j,则可以获得比您要求的并行运行的更多作业。

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

为make 4.0中的窗口添加了对此功能的支持。