nixpkgs/pkgs/development/compilers/ocaml/Makefile.nixpkgs
Sergei Trofimovich 238d634e4b ocaml: enable parallel building
Enable parallel building for ocaml-4.08 and above. tested as:

    $ nix build -f. ocaml-ng.ocamlPackages_{4_{00_1,01_0,02,03,04,05,06,07,08,09,10,11,12,13},latest}.ocaml --keep-going

ocaml build system supports parallel building, but but for multiple
top-level targets at the same time as it usually spawns subprocess
$(MAKE) that occasionally conflict with one another. To work it around
we use tiny Makefile with a single rule that calls top-level targets
sequentially as makefile calls:

    nixpkgs_world_bootstrap_world_opt:
       $(MAKE) world
       $(MAKE) bootstrap
       $(MAKE) world.opt

On a 16-core machine ocaml-4.12 build speeds up from 6m55s to 1m35s.

Releases 4_00_1, 4_01_0, 4_04 and 4_05 still have some race in them.
Thus this change enables parallel builds only for ocaml-4.06 and above.

Adapted from #142723

upstreams's CI tests the parallel makefile: https://github.com/ocaml/ocaml/issues/10235#issuecomment-782100584
The limit was chosen to be 4.08 because it was released in 2019, not too
long before the above link.
2022-02-27 12:00:00 +00:00

17 lines
515 B
Makefile

# ocaml build system does not allow for parallel building of some
# top-level targets like 'world', 'bootstrap', 'world.opt' as
# then spawn '$(MAKE) all' subprocesses that conflict among each
# other. But we would still like to run each target in parallel
# individually. This file defines such entry points.
# Re-export all existing phases to make 'make install' work as is.
include Makefile
nixpkgs_world:
$(MAKE) world
nixpkgs_world_bootstrap_world_opt:
$(MAKE) world
$(MAKE) bootstrap
$(MAKE) world.opt