git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH] Makefile: explicitly set target name for autogenerated dependencies

From
Jonathan Nieder <jrnieder@gmail.com>
Date
Nov 18, 2011, 23:23 UTC
Message-ID
<20111118232324.GA8746@elie.hsd1.il.comcast.net>
In-Reply-To
<CACsJy8BZMDyf4MCiKxPJ5Z+XS+C-MC82SpMFyWgiXmb9xCnScw@mail.gmail.com>

"gcc -MF depfile -MMD -MP -c -o path/to/file.o" produces a makefile snippet named "depfile" describing what files are needed to build the target given by "-o". When ccache versions before v3.0pre0~187 (Fix handling of the -MD and -MDD options, 2009-11-01) run, they execute

	gcc -MF depfile -MMD -MP -E

instead to get the final content for hashing. Notice that the "-c -o" combination is replaced by "-E". The result is a target name without a leading path.

Thus when building git with such versions of ccache with COMPUTE_HEADER_DEPENDENCIES enabled, the generated makefile snippets define dependencies for the wrong target:

	$ make builtin/add.o
	GIT_VERSION = 1.7.8.rc3
	    * new build flags or prefix
	    CC builtin/add.o
	$ head -1 builtin/.depend/add.o.d
	add.o: builtin/add.c cache.h git-compat-util.h compat/bswap.h strbuf.h \

After a change in a header file, object files in a subdirectory are not automatically rebuilt by "make":

	$ touch cache.h
	$ make builtin/add.o
	$

Luckily we can prevent trouble by explicitly supplying the name of the target to ccache and gcc, using the -MQ option. Do so.

Reported-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
Hi,
Nguyen Thai Ngoc Duy wrote:
Show 5 quoted lines
> My builtin/.depend/add.o.d says
>
> add.o: .... cache.h ...
>
> Shouldn't it be "builtin/add.o: ... cache.h ..."?

The following seems to do the trick for me. Thanks again for catching it.

 Makefile |    5 +++--
 1 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/Makefile b/Makefile
index ee34eab8..71ad4b26 100644
--- a/Makefile
+++ b/Makefile
@@ -1250,7 +1250,8 @@ USE_COMPUTED_HEADER_DEPENDENCIES =
 else
 ifndef COMPUTE_HEADER_DEPENDENCIES
 dep_check = $(shell $(CC) $(ALL_CFLAGS) \
-	-c -MF /dev/null -MMD -MP -x c /dev/null -o /dev/null 2>&1; \
+	-c -MF /dev/null -MQ /dev/null -MMD -MP \
+	-x c /dev/null -o /dev/null 2>&1; \
 	echo $$?)
 ifeq ($(dep_check),0)
 COMPUTE_HEADER_DEPENDENCIES=YesPlease
@@ -1912,7 +1913,7 @@ $(dep_dirs):
 
 missing_dep_dirs := $(filter-out $(wildcard $(dep_dirs)),$(dep_dirs))
 dep_file = $(dir $@).depend/$(notdir $@).d
-dep_args = -MF $(dep_file) -MMD -MP
+dep_args = -MF $(dep_file) -MQ $@ -MMD -MP
 ifdef CHECK_HEADER_DEPENDENCIES
 $(error cannot compute header dependencies outside a normal build. \
 Please unset CHECK_HEADER_DEPENDENCIES and try again)
-- 
1.7.8.rc3
Previous: Nguyen Thai Ngoc DuyNext: Nguyen Thai Ngoc Duy
Message 18 of 19 in “A flaw in dep generation with gcc -MMD?”
  1. Nguyen Thai Ngoc DuyNov 18, 2011
  2. Jonathan NiederNov 18, 2011
  3. Nguyen Thai Ngoc DuyNov 18, 2011
  4. Miles BaderNov 18, 2011
  5. Nguyen Thai Ngoc DuyNov 18, 2011
  6. Nguyen Thai Ngoc DuyNov 18, 2011
  7. Samuel BronsonNov 18, 2011
  8. Jonathan NiederNov 18, 2011
  9. Andreas SchwabNov 18, 2011
  10. Nguyen Thai Ngoc DuyNov 19, 2011
  11. Makefile: add option to disable automatic dependency generationJonathan Nieder, Nov 18, 2011
  12. Jonathan NiederNov 18, 2011
  13. Junio C HamanoNov 18, 2011
  14. Jonathan NiederNov 18, 2011
  15. Makefile: add option to disable automatic dependency generationJonathan Nieder, Nov 18, 2011
  16. Makefile: add missing header file dependenciesJonathan Nieder, Nov 18, 2011
  17. Nguyen Thai Ngoc DuyNov 18, 2011
  18. Makefile: explicitly set target name for autogenerated dependenciesJonathan Nieder, Nov 18, 2011
  19. Nguyen Thai Ngoc DuyNov 19, 2011

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.