Overriding GNU Make SHELL variable for massive parallel make
October 21, 2008 2 Comments
If you use GNU Make in your verification environment, maybe you have dreamed of typing
make -j 120. It turns out it is possible, and it is a very interesting use of the GNU Make SHELL variable. You know that
make -j N causes GNU make to spawn the build of
N prerequisites in parallel. In the code below, prereq1, prereq2 and prereq3 would be built at the same time if
-j 3 were used:
SHELL=./myshell prereq1: very_long_processing prereq2: more_very_long_processing prereq3: more_and_more_processing target: prereq1 prereq2 prereq3 very_long_compile
This may look like nothing, but it gets more interesting when you define myshell as follows, as explained on the GNU mailing list:
#!/bin/bash ssh `avail_host` "cd $PWD || exit; $2"
Now just type make and your build is distributed to 3 available hosts, as returned by the avail_host script (writing this script is an exercise left to the reader ;-)).
Shortly after coming up with this, a bit of searching revealed that this was nothing new really. The article Distributed processing by make explains that by using the GNU Make SHELL variable, the number of jobs you can dispatch with make is no longer limited to how many cores or local CPUs you have.
The article also shows how to extend the makefile syntax to control the dispatching of commands. Once you realize that GNU Make effectively calls $SHELL by passing “-c” followed by your entire command, you also realize that you can intercept anything you want in your own implementation of $SHELL to control job submission, such as the single, double and triple equal sign syntax in the aforementioned article. All without changing anything to GNU Make source code. Wow!
Exploring a bit further on the GXP website, I have found that the GXP flow for dispatching jobs to multiple machines relies on daemons being spawned at the user space level using the ssh command. I still don’t understand why it would be necessary to spawn daemons though. I would be interested in knowing this.