git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Jonathan Nieder <jrnieder@gmail.com>
To: Git Mailing List <git@vger.kernel.org>
Cc: Junio C Hamano <gitster@pobox.com>,
	Johannes Schindelin <Johannes.Schindelin@gmx.de>,
	Erik Faye-Lund <kusmabite@googlemail.com>,
	Sverre Rabbelier <srabbelier@gmail.com>,
	Andreas Schwab <schwab@linux-m68k.org>
Subject: [PATCH 10/12] Makefile: lazily compute header dependencies
Date: Tue, 26 Jan 2010 09:52:49 -0600	[thread overview]
Message-ID: <20100126155249.GK4895@progeny.tock> (raw)
In-Reply-To: <20100126154357.GA4895@progeny.tock>

Use the gcc -MMD -MP -MF options to generate dependency rules as
a byproduct when building .o files if the
COMPUTE_HEADER_DEPENDENCIES variable is defined.  That variable
is left undefined by default for now.

As each object file is built, write a makefile fragment
containing its dependencies in the deps/ subdirectory of its
containing directory.  The deps/ directories should be generated
if they are missing at the start of each build.  So let each
object file depend on $(missing_dep_dirs), which lists only the
directories of this kind that are missing to avoid needlessly
regenerating files when the directories' timestamps change.

gcc learned the -MMD -MP -MF options in version 3.0, so most gcc
users should have them by now.

The dependencies this option computes are more specific than the
rough estimates hard-coded in the Makefile, greatly speeding up
rebuilds when only a little-used header file has changed.

Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
 .gitignore |    1 +
 Makefile   |   49 ++++++++++++++++++++++++++++++++++++++++++++-----
 2 files changed, 45 insertions(+), 5 deletions(-)

diff --git a/.gitignore b/.gitignore
index 8df8f88..7b3acb7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -177,6 +177,7 @@
 *.exe
 *.[aos]
 *.py[co]
+*.o.d
 *+
 /config.mak
 /autom4te.cache
diff --git a/Makefile b/Makefile
index 0e4e8ff..2e75f05 100644
--- a/Makefile
+++ b/Makefile
@@ -217,6 +217,10 @@ all::
 #   DEFAULT_EDITOR='~/bin/vi',
 #   DEFAULT_EDITOR='$GIT_FALLBACK_EDITOR',
 #   DEFAULT_EDITOR='"C:\Program Files\Vim\gvim.exe" --nofork'
+#
+# Define COMPUTE_HEADER_DEPENDENCIES if your compiler supports the -MMD option
+# and you want to avoid rebuilding objects when an unrelated header file
+# changes.
 
 GIT-VERSION-FILE: FORCE
 	@$(SHELL_PATH) ./GIT-VERSION-GEN
@@ -1677,14 +1681,48 @@ ASM_SRC := $(wildcard $(OBJECTS:o=S))
 ASM_OBJ := $(ASM_SRC:S=o)
 C_OBJ := $(filter-out $(ASM_OBJ),$(OBJECTS))
 
+ifdef COMPUTE_HEADER_DEPENDENCIES
+dep_dirs := $(addsuffix deps,$(sort $(dir $(OBJECTS))))
+$(dep_dirs):
+	mkdir -p $@
+
+missing_dep_dirs := $(filter-out $(wildcard $(dep_dirs)),$(dep_dirs))
+else
+dep_dirs =
+missing_dep_dirs =
+endif
+
 .SUFFIXES:
 
-$(C_OBJ): %.o: %.c GIT-CFLAGS
-	$(QUIET_CC)$(CC) -o $*.o -c $(ALL_CFLAGS) $<
+$(C_OBJ): %.o: %.c GIT-CFLAGS $(missing_dep_dirs)
+	$(QUIET_CC)$(CC) -o $*.o -c $(dep_args) $(ALL_CFLAGS) $<
 %.s: %.c GIT-CFLAGS FORCE
 	$(QUIET_CC)$(CC) -S $(ALL_CFLAGS) $<
-$(ASM_OBJ): %.o: %.S GIT-CFLAGS
-	$(QUIET_CC)$(CC) -o $*.o -c $(ALL_CFLAGS) $<
+$(ASM_OBJ): %.o: %.S GIT-CFLAGS $(missing_dep_dirs)
+	$(QUIET_CC)$(CC) -o $*.o -c $(dep_args) $(ALL_CFLAGS) $<
+
+ifdef COMPUTE_HEADER_DEPENDENCIES
+# Take advantage of gcc's on-the-fly dependency generation
+# See <http://gcc.gnu.org/gcc-3.0/features.html>.
+dep_files := $(wildcard $(foreach f,$(OBJECTS),$(dir f)deps/$(notdir $f).d))
+ifneq ($(dep_files),)
+include $(dep_files)
+endif
+
+dep_file = $(dir $@)deps/$(notdir $@).d
+dep_args = -MF $(dep_file) -MMD -MP
+else
+dep_args =
+
+# Dependencies on header files, for platforms that do not support
+# the gcc -MMD option.
+#
+# Dependencies on automatically generated headers such as common-cmds.h
+# should _not_ be included here, since they are necessary even when
+# building an object for the first time.
+#
+# XXX. Please check occasionally that these include all dependencies
+# gcc detects!
 
 $(GIT_OBJS): $(LIB_H)
 builtin-branch.o builtin-checkout.o builtin-clone.o builtin-reset.o branch.o transport.o: branch.h
@@ -1700,10 +1738,10 @@ builtin-pack-objects.o: thread-utils.h
 http-fetch.o http-walker.o remote-curl.o transport.o walker.o: walker.h
 http.o http-walker.o http-push.o remote-curl.o: http.h
 
-
 xdiff-interface.o $(XDIFF_OBJS): \
 	xdiff/xinclude.h xdiff/xmacros.h xdiff/xdiff.h xdiff/xtypes.h \
 	xdiff/xutils.h xdiff/xprepare.h xdiff/xdiffi.h xdiff/xemit.h
+endif
 
 exec_cmd.s exec_cmd.o: ALL_CFLAGS += \
 	'-DGIT_EXEC_PATH="$(gitexecdir_SQ)"' \
@@ -2011,6 +2049,7 @@ clean:
 	$(RM) $(ALL_PROGRAMS) $(BUILT_INS) git$X
 	$(RM) $(TEST_PROGRAMS)
 	$(RM) -r bin-wrappers
+	$(RM) -r $(dep_dirs)
 	$(RM) *.spec *.pyc *.pyo */*.pyc */*.pyo common-cmds.h TAGS tags cscope*
 	$(RM) -r autom4te.cache
 	$(RM) config.log config.mak.autogen config.mak.append config.status config.cache
-- 
1.6.6

  parent reply	other threads:[~2010-01-26 15:52 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-01-23 14:42 [PATCH 0/5] Makefile: add missing header dependency rules Jonathan Nieder
2010-01-23 14:43 ` [PATCH 1/5] Makefile: add missing header file dependencies Jonathan Nieder
2010-01-23 14:44 ` [PATCH 2/5] Makefile: make sure test helpers are rebuilt when headers change Jonathan Nieder
2010-01-23 14:44 ` [PATCH 3/5] Makefile: remove wt-status.h from LIB_H Jonathan Nieder
2010-01-23 14:45 ` [PATCH 4/5] Makefile: clean up http-walker.o dependency rules Jonathan Nieder
2010-01-23 14:45 ` [PATCH 5/5] Makefile: drop dependency on $(wildcard */*.h) Jonathan Nieder
2010-01-25  4:44 ` [PATCH 0/5] Makefile: add missing header dependency rules Junio C Hamano
2010-01-26 15:43   ` [PATCH 00/12] " Jonathan Nieder
2010-01-26 15:44     ` [PATCH 01/12] Makefile: add missing header file dependencies Jonathan Nieder
2010-01-26 15:45     ` [PATCH 02/12] Makefile: make sure test helpers are rebuilt when headers change Jonathan Nieder
2010-01-26 15:46     ` [PATCH 03/12] Makefile: remove wt-status.h from LIB_H Jonathan Nieder
2010-01-26 15:46     ` [PATCH 04/12] Makefile: clean up http-walker.o dependency rules Jonathan Nieder
2010-01-26 15:46     ` [PATCH 05/12] Makefile: drop dependency on $(wildcard */*.h) Jonathan Nieder
2010-01-26 15:47     ` [PATCH 06/12] Makefile: transport.o depends on branch.h now Jonathan Nieder
2010-01-26 15:49     ` [PATCH 07/12] Makefile: rearrange dependency rules Jonathan Nieder
2010-01-26 15:51     ` [PATCH 08/12] Makefile: disable default implicit rules Jonathan Nieder
2010-01-26 15:52     ` [PATCH 09/12] Makefile: list generated object files in OBJECTS Jonathan Nieder
2010-01-26 15:52     ` Jonathan Nieder [this message]
2010-01-26 15:54     ` [PATCH 11/12] Makefile: list standalone program object files in PROGRAM_OBJS Jonathan Nieder
2010-01-27  9:07       ` [PATCH v2 " Jonathan Nieder
2010-01-26 15:57     ` [PATCH 12/12] Teach Makefile to check header dependencies Jonathan Nieder
2010-01-31 20:42       ` Junio C Hamano
2010-01-31 21:14         ` Jonathan Nieder
2010-01-31 21:26           ` Junio C Hamano
2010-01-31 21:37             ` [PATCH 14/12] Makefile: always remove .depend directories on 'make clean' Jonathan Nieder
2010-01-31 21:23         ` [PATCH 13/12] Makefile: tuck away generated makefile fragments in .depend Jonathan Nieder
2010-01-26 16:19     ` [PATCH 00/12] Re: Makefile: add missing header dependency rules Jonathan Nieder

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20100126155249.GK4895@progeny.tock \
    --to=jrnieder@gmail.com \
    --cc=Johannes.Schindelin@gmx.de \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=kusmabite@googlemail.com \
    --cc=schwab@linux-m68k.org \
    --cc=srabbelier@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).