summaryrefslogtreecommitdiff
path: root/build
diff options
context:
space:
mode:
authorJohn Mark Bell <jmb@netsurf-browser.org>2008-07-10 14:34:12 +0000
committerJohn Mark Bell <jmb@netsurf-browser.org>2008-07-10 14:34:12 +0000
commit4a4ce3ccc686d4f389fbe9c87c53326aaf3d4c7e (patch)
tree35a7545cd8a1d5b150a0186a7e63571d30fcc81e /build
parentab35ba70b41a06cfd3d2bb92da0c34ccf9420fc1 (diff)
downloadlibhubbub-4a4ce3ccc686d4f389fbe9c87c53326aaf3d4c7e.tar.gz
libhubbub-4a4ce3ccc686d4f389fbe9c87c53326aaf3d4c7e.tar.bz2
Improved dependency tracking.
There's currently an issue that means that testcases don't get rebuilt when the debug library changes -- the workaround is to make clean. I've currently no idea how to fix this -- see the FIXME in test/Makefile for details. svn path=/trunk/hubbub/; revision=4571
Diffstat (limited to 'build')
-rw-r--r--build/Makefile.common51
1 files changed, 44 insertions, 7 deletions
diff --git a/build/Makefile.common b/build/Makefile.common
index 2fa77ac..0388859 100644
--- a/build/Makefile.common
+++ b/build/Makefile.common
@@ -43,10 +43,11 @@ OBJECTS := $(subst /,_,$(subst .c,.o,$(SOURCES)))
# Rules
release: setup $(addprefix $(RELEASEDIR)/,$(OBJECTS))
- @$(AR) $(ARFLAGS) $(COMPONENT).a $(RELEASEDIR)/*
+ @$(AR) $(ARFLAGS) $(COMPONENT).a $(addprefix $(RELEASEDIR)/,$(OBJECTS))
debug: setup $(addprefix $(DEBUGDIR)/,$(OBJECTS))
- @$(AR) $(ARFLAGS) $(COMPONENT)-debug.a $(DEBUGDIR)/*
+ @$(AR) $(ARFLAGS) $(COMPONENT)-debug.a \
+ $(addprefix $(DEBUGDIR)/,$(OBJECTS))
test: debug $(TARGET_TESTS)
@@ -80,8 +81,8 @@ distclean: clean
-@$(RM) $(RMFLAGS) -r $(TOP)/dist
setup:
- @$(MKDIR) $(MKDIRFLAGS) $(RELEASEDIR)
- @$(MKDIR) $(MKDIRFLAGS) $(DEBUGDIR)
+ @$(MKDIR) $(MKDIRFLAGS) $(RELEASEDIR)/deps
+ @$(MKDIR) $(MKDIRFLAGS) $(DEBUGDIR)/deps
@$(MKDIR) $(MKDIRFLAGS) $(COVERAGEDIR)
export: release
@@ -102,18 +103,54 @@ uninstall:
@$(RM) $(RMFLAGS) $(PREFIX)/lib/pkgconfig/$(COMPONENT).pc
@$(RM) $(RMFLAGS) -r $(PREFIX)/include/hubbub
+$(RELEASEDIR)/deps/created:
+ @$(MKDIR) $(MKDIRFLAGS) $(RELEASEDIR)/deps
+ @$(TOUCH) $(TOUCHFLAGS) $(RELEASEDIR)/deps/created
+
+$(DEBUGDIR)/deps/created:
+ @$(MKDIR) $(MKDIRFLAGS) $(DEBUGDIR)/deps
+ @$(TOUCH) $(TOUCHFLAGS) $(DEBUGDIR)/deps/created
+
+DEPFILES :=
+
+define do_dep
+DEPFILES += $(2)
+$$(RELEASEDIR)/deps/$(2): $$(RELEASEDIR)/deps/created $(1)
+ @$$(ECHO) $$(ECHOFLAGS) "DEP $(1)"
+ @$$(RM) $$(RMFLAGS) $$(RELEASEDIR)/deps/$(2)
+ @$$(CC) $$(RELEASECFLAGS) -MM -MT \
+ '$$(RELEASEDIR)/deps/$(2) $$(RELEASEDIR)/$(3)' \
+ -MF $$(RELEASEDIR)/deps/$(2) $(1)
+
+$$(DEBUGDIR)/deps/$(2): $$(DEBUGDIR)/deps/created $(1)
+ @$$(ECHO) $$(ECHOFLAGS) "DEP $(1)"
+ @$$(RM) $$(RMFLAGS) $$(DEBUGDIR)/deps/$(2)
+ @$$(CC) $$(DEBUGCFLAGS) -MM -MT \
+ '$$(DEBUGDIR)/deps/$(2) $$(DEBUGDIR)/$(3)' \
+ -MF $$(DEBUGDIR)/deps/$(2) $(1)
+
+endef
+
# Finally, build rules for compilation
define do_compile
-$$(RELEASEDIR)/$(2): $(1)
+$$(RELEASEDIR)/$(2): $$(RELEASEDIR)/deps/$(3)
@$$(ECHO) $$(ECHOFLAGS) "==> $(1)"
@$$(CC) -c $$(RELEASECFLAGS) -o $$@ $(1)
-$$(DEBUGDIR)/$(2): $(1)
+$$(DEBUGDIR)/$(2): $$(DEBUGDIR)/deps/$(3)
@$$(ECHO) $$(ECHOFLAGS) "==> $(1)"
@$$(CC) -c $$(DEBUGCFLAGS) -o $$@ $(1)
endef
$(eval $(foreach SOURCE,$(filter %.c,$(SOURCES)), \
- $(call do_compile,$(SOURCE),$(subst /,_,$(SOURCE:.c=.o)))))
+ $(call do_dep,$(SOURCE),$(subst /,_,$(SOURCE:.c=.d)),$(subst /,_,$(SOURCE:.c=.o)))))
+
+ifneq ($(findstring clean,$(MAKECMDGOALS)),clean)
+-include $(sort $(addprefix $(RELEASEDIR)/deps/,$(DEPFILES)))
+-include $(sort $(addprefix $(DEBUGDIR)/deps/,$(DEPFILES)))
+endif
+
+$(eval $(foreach SOURCE,$(filter %.c,$(SOURCES)), \
+ $(call do_compile,$(SOURCE),$(subst /,_,$(SOURCE:.c=.o)),$(subst /,_,$(SOURCE:.c=.d)))))