On Wed, Sep 22, 2021 at 12:55:13AM +0200, Ævar Arnfjörð Bjarmason wrote: > On my box with -j8 it was fast before, or around 5 seconds, now it > only takes that long the first time, and the common case is <100ms, or > however long it takes GNU make to stat the *.sp file and see that all > the corresponding *.c files are older. Sort of side note, but I think the main culprit here is all of the $(shell) invocations, etc, we run. Try: make SHELL_PATH='sh -x' to get a taste (do it twice, because the first one will actually rebuild everything due to the changed shell; the second one _should_ be a noop but still runs a bunch of stuff). Though even that doesn't tell the whole story, as it doesn't make clear which shells are invoked by make directly. Try this: cat >/tmp/foo <<-\EOF #!/bin/sh echo >&2 "==> shell $*" exec sh "$@" EOF make SHELL_PATH=/tmp/foo There's lots of low-hanging fruit like: ==> shell -c echo TEST_SHELL_PATH=\''/tmp/foo'\' >>GIT-BUILD-OPTIONS+ ==> shell -c echo PERL_PATH=\''/usr/bin/perl'\' >>GIT-BUILD-OPTIONS+ ==> shell -c echo DIFF=\''diff'\' >>GIT-BUILD-OPTIONS+ ==> shell -c echo PYTHON_PATH=\''/usr/bin/python'\' >>GIT-BUILD-OPTIONS+ [...and over a dozen more...] Those could easily be a single shell invocation, rather than one per echo. Another culprit is GIT-VERSION-GEN, which we run whether it's needed or not, and takes something like 25ms. It's probably not worth spending too much time micro-optimizing here (and certainly it's orthogonal to your series), but there may be some low-hanging fruit (although a hacky attempt at minimizing the shell calls for GIT-BUILD-OPTIONS didn't seem to show any speedup, so maybe it's not so low-hanging after all). -Peff