From 3bc858ee0d9b929f4cbca61cf5ed8d3184d0cf78 Mon Sep 17 00:00:00 2001 From: Andre Noll Date: Mon, 14 Mar 2022 22:28:27 +0100 Subject: [PATCH] Makefile: Fix compilation after header removal. When switching from an older git version which still contains some header file to a newer version where it got removed, a .d file remains in build/deps which lists the no longer existing header file as a prerequisite. This causes the build to fail because the prerequisite cannot be created. The problem can be worked around by removing the stale .d file, for example by running make clean, but this is no real fix, and is inefficient. The root of the matter is that .d files depend on their .c counterpart, but this dependency is not stated anywhere in the Makefile. Thus, we need a rule for the .d target with the same prerequisites and the same recipe as the object file target. GNU make supports multiple targets, but the feature does not seem to work as advertised, regardless of whether rules with independent targets or rules with grouped targets (using the &: separator) are employed. Thus we bite the bullet and use two separate rules. --- Makefile.real | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/Makefile.real b/Makefile.real index 6e8084d5..e5ecfe42 100644 --- a/Makefile.real +++ b/Makefile.real @@ -255,10 +255,19 @@ $(object_dir)/mm.o \ $(object_dir)/compress_filter.o: CFLAGS += -O3 -$(object_dir)/%.o: %.c | $(object_dir) $(dep_dir) $(lsg_h) $(yy_h) +define CC_CMD $(call SAY, CC $<) - $(CC) -c -o $@ -MMD -MF $(dep_dir)/$(*F).d -MT $@ $(CPPFLAGS) \ - $(STRICT_CFLAGS) $(CFLAGS) $< + $(CC) -c -o $(object_dir)/$(*F).o -MMD -MF \ + $(dep_dir)/$(*F).d -MT $(object_dir)/$(*F).o \ + $(CPPFLAGS) $(STRICT_CFLAGS) $(CFLAGS) $< +endef +CC_PREREQUISITES := %.c | $(object_dir) $(dep_dir) $(lsg_h) $(yy_h) +# These two have the same prerequisites and the same recipe. There should be a +# better way to write this. +$(object_dir)/%.o: $(CC_PREREQUISITES) + $(CC_CMD) +$(dep_dir)/%.d: $(CC_PREREQUISITES) + $(CC_CMD) para_recv para_afh para_play para_server: LDFLAGS += $(id3tag_ldflags) para_write para_play para_audiod \ -- 2.39.2