Hi, Ævar > {command,config}-list.h (and in-flight, my hook-list.h): Every time > you touch a Documentation/git-*.txt we need to re-generate these, and > since their mtime changes we re-compile and re-link all the way up to > libgit and our other tools. > > I think the best solution here is to make the generate-*.sh > shellscripts faster (just one takes ~300ms of nested shellscripting, > just to grep out the first few lines of every git-*.txt, in e.g. Perl > or a smarter awk script this would be <5ms). > > Then we make those FORCE, but most of the time the config or command > summary (or list of hooks) doesn't change, so we don't need to > replace the file. One possible technique to fix this is to generate to a temporary file, and copy the temporary file over the real file if it's actually different. I see the Makefile already does create a temporary file, so how about something like this: diff --git a/Makefile b/Makefile index 93664d6714..9b2f081a2a 100644 --- a/Makefile +++ b/Makefile @@ -2216,7 +2216,8 @@ command-list.h: generate-cmdlist.sh command-list.txt command-list.h: $(wildcard Documentation/git*.txt) $(QUIET_GEN)$(SHELL_PATH) ./generate-cmdlist.sh \ $(patsubst %,--exclude-program %,$(EXCLUDED_PROGRAMS)) \ - command-list.txt >$@+ && mv $@+ $@ + command-list.txt >$@+ && \ + if ! cmp -s $@ $@+; then mv $@+ $@; fi SCRIPT_DEFINES = $(SHELL_PATH_SQ):$(DIFF_SQ):$(GIT_VERSION):\ $(localedir_SQ):$(NO_CURL):$(USE_GETTEXT_SCHEME):$(SANE_TOOL_PATH_SQ):\ This seems to work fine from my basic testing. I think it can even be written more terse as `&& ! cmp ... &&` but that looks a bit weird to me. In any case it looks like it can easily be added the other relevant places in the Makefile too. Øsse