Blog post details how GNU Make's -j jobserver behaves across recursive make calls
A developer investigated how recursive invocations of GNU Make handle the -j parallelism flag across versions 3.81 through 4.3. Without a '+' prefix or use of $(MAKE), recent GNU Make versions warn that the jobserver is unavailable and fall back to -j1, losing parallelism and not necessarily invoking the same make binary. The post includes test Makefiles used to compare behavior when different -j values are set on the command line versus inside recursive recipes.
GoKawiil's interpretation of the reporting above, not reported fact.
The findings highlight a subtle but common pitfall in build systems: developers writing recursive Makefiles may unknowingly lose intended parallel build speed unless they use '+' or $(MAKE) syntax. This kind of detail could affect build times and reproducibility across projects using different GNU Make versions, especially in CI environments where make versions vary.
- Recursive make calls without '+' or $(MAKE) can silently disable parallel jobserver forwarding.
- Recent GNU Make versions emit a 'jobserver unavailable' warning and default to -j1 in such cases.
- Using '+' prefix or $(MAKE) instead of a bare 'make' call ensures correct jobserver and binary forwarding.
Source: quuxplusone.github.io — Arthur O Dwyer, 2026-09-30
Published there as: “Recursive `make` and `-j`”
Read the original report → The summary and analysis above are GoKawiil's own, written from reporting by the source above. Facts and quotes belong to the original publisher.