make gnu-并行运行目标

时间:2019-02-21 06:38:32

标签: linux makefile gnu-make

我有这个const RGB_COLOR_BLACK = 0; const RGB_COLOR_WHITE = 16777215; const RGB_COLOR_RED = 16711680; const RGB_COLOR_BRIGHTGREEN = 65280; const RGB_COLOR_BLUE = 255; const RGB_COLOR_YELLOW = 16776960; const RGB_COLOR_PINK = 16711935; const RGB_COLOR_TURQUOISE = 65535; const RGB_COLOR_DARKRED = 8388608; const RGB_COLOR_GREEN = 32768; const RGB_COLOR_DARKBLUE = 128; const RGB_COLOR_DARKYELLOW = 8421376; const RGB_COLOR_VIOLET = 8388736; const RGB_COLOR_TEAL = 32896; const RGB_COLOR_GRAY25 = 12632256; const RGB_COLOR_GRAY50 = 8421504; const RGB_COLOR_PERIWINKLE_CF = 10066431; const RGB_COLOR_PLUM_CF = 10040166; const RGB_COLOR_IVORY_CF = 16777164; const RGB_COLOR_LIGHTTURQUOISE_CF = 13434879; const RGB_COLOR_DARKPURPLE_CF = 6684774; const RGB_COLOR_CORAL_CF = 16744576; const RGB_COLOR_OCEANBLUE_CF = 26316; const RGB_COLOR_ICEBLUE_CF = 13421823; const RGB_COLOR_DARKBLUE_CL = 128; const RGB_COLOR_PINK_CL = 16711935; const RGB_COLOR_YELLOW_CL = 16776960; const RGB_COLOR_TURQUOISE_CL = 65535; const RGB_COLOR_VIOLET_CL = 8388736; const RGB_COLOR_DARKRED_CL = 8388608; const RGB_COLOR_TEAL_CL = 32896; const RGB_COLOR_BLUE_CL = 255; const RGB_COLOR_SKYBLUE = 52479; const RGB_COLOR_LIGHTTURQUOISE = 13434879; const RGB_COLOR_LIGHTGREEN = 13434828; const RGB_COLOR_LIGHTYELLOW = 16777113; const RGB_COLOR_PALEBLUE = 10079487; const RGB_COLOR_ROSE = 16751052; const RGB_COLOR_LAVENDER = 13408767; const RGB_COLOR_TAN = 16764057; const RGB_COLOR_LIGHTBLUE = 3368703; const RGB_COLOR_AQUA = 3394764; const RGB_COLOR_LIME = 10079232; const RGB_COLOR_GOLD = 16763904; const RGB_COLOR_LIGHTORANGE = 16750848; const RGB_COLOR_ORANGE = 16737792; const RGB_COLOR_BLUEGRAY = 6710937; const RGB_COLOR_GRAY40 = 9868950; const RGB_COLOR_DARKTEAL = 13158; const RGB_COLOR_SEAGREEN = 3381606; const RGB_COLOR_DARKGREEN = 13056; const RGB_COLOR_OLIVEGREEN = 3355392; const RGB_COLOR_BROWN = 10040064; const RGB_COLOR_PLUM = 10040166; const RGB_COLOR_INDIGO = 3355545; const RGB_COLOR_GRAY80 = 3355443; ,我想同时并行运行两个目标,只是为了运行makefile而不是make 我使用make文件中每个操作系统的makeflags和NPROCS (这里是达尔文的) 可能吗 ?

make -j...

1 个答案:

答案 0 :(得分:2)

是的,有可能,如果NPROCS > 1并且您的平台支持并行make,那么makefile将执行您想要的操作。例如,参见GNU make manual

  

如果您想确保   选项,例如“ -k”(请参阅​​“选项摘要”),每次运行时都要设置   使。您只需在您的环境中为MAKEFLAGS值即可。您   也可以在makefile中设置MAKEFLAGS,以指定其他标志   该文件也应有效。

如果愿意,您也可以自己进行测试。以下证明了make与NPROCS+1配方在并行模式下运行。每个配方都会打印第一条消息,睡眠2秒钟,然后打印第二条消息。

如果make以并行模式运行,则应该看到NPROCS run moduleX with NPROCS=Y消息已打印,两秒钟后,NPROCS done moduleX消息已打印。然后,您应该看到最后一条run moduleX with NPROCS=Y消息,然后在2秒后看到最后一条done moduleX消息。

否则,如果它不是在并行模式下运行,您将看到run moduleX with NPROCS=Y条消息和done moduleX条消息的交替出现。

演示:

$ cat Makefile
SHELL       := bash
NPROCS      := $(shell sysctl hw.ncpu  | grep -o '[0-9]\+')
MAKEFLAGS   += -j$(NPROCS)
MODULES     := $(shell for (( i = 1; i <= $(NPROCS) + 1; i++ )); do printf 'module%d ' "$$i"; done)

.PHONY: all $(MODULES)

all: $(MODULES)

$(MODULES):
    @echo "run $@ with NPROCS=$(NPROCS)"; sleep 2; echo "done $@"

$ make
run module1 with NPROCS=8
run module2 with NPROCS=8
run module3 with NPROCS=8
run module4 with NPROCS=8
run module5 with NPROCS=8
run module6 with NPROCS=8
run module7 with NPROCS=8
run module8 with NPROCS=8
done module2
done module3
done module6
done module8
done module1
done module7
done module4
done module5
run module9 with NPROCS=8
done module9