diff --git a/src/backend/access/Makefile b/src/backend/access/Makefile
index 4753eac..df05f8e 100644
--- a/src/backend/access/Makefile
+++ b/src/backend/access/Makefile
@@ -9,19 +9,5 @@ top_builddir = ../../..
 include $(top_builddir)/src/Makefile.global
 
 SUBDIRS	    = common gist hash heap index nbtree transam gin
-SUBDIROBJS  = $(SUBDIRS:%=%/SUBSYS.o)
 
-all: SUBSYS.o
-
-SUBSYS.o: $(SUBDIROBJS)
-	$(LD) $(LDREL) $(LDOUT) $@ $^
-
-$(SUBDIROBJS): $(SUBDIRS:%=%-recursive) ;
-
-.PHONY: $(SUBDIRS:%=%-recursive)
-$(SUBDIRS:%=%-recursive):
-	$(MAKE) -C $(subst -recursive,,$@) SUBSYS.o
-
-clean:
-	for dir in $(SUBDIRS); do $(MAKE) -C $$dir $@ || exit; done
-	rm -f SUBSYS.o
+include $(top_srcdir)/src/backend/common.mk
diff --git a/src/backend/access/common/Makefile b/src/backend/access/common/Makefile
index 7adc66b..a334816 100644
--- a/src/backend/access/common/Makefile
+++ b/src/backend/access/common/Makefile
@@ -16,8 +16,4 @@ OBJS = heaptuple.o indextuple.o printtup.o reloptions.o scankey.o tupdesc.o
 
 all: SUBSYS.o
 
-SUBSYS.o: $(OBJS)
-	$(LD) $(LDREL) $(LDOUT) SUBSYS.o $(OBJS)
-
-clean: 
-	rm -f SUBSYS.o $(OBJS)
+include $(top_srcdir)/src/backend/common.mk
diff --git a/src/backend/access/gin/Makefile b/src/backend/access/gin/Makefile
index 5bab415..c5872d3 100644
--- a/src/backend/access/gin/Makefile
+++ b/src/backend/access/gin/Makefile
@@ -16,10 +16,4 @@ OBJS = ginutil.o gininsert.o ginxlog.o ginentrypage.o gindatapage.o \
 	ginbtree.o ginscan.o ginget.o ginvacuum.o ginarrayproc.o \
 	ginbulk.o
 
-all: SUBSYS.o
-
-SUBSYS.o: $(OBJS)
-	$(LD) $(LDREL) $(LDOUT) SUBSYS.o $(OBJS)
-
-clean: 
-	rm -f SUBSYS.o $(OBJS)
+include $(top_srcdir)/src/backend/common.mk
diff --git a/src/backend/access/gist/Makefile b/src/backend/access/gist/Makefile
index d1e3266..8d3a6d0 100644
--- a/src/backend/access/gist/Makefile
+++ b/src/backend/access/gist/Makefile
@@ -15,10 +15,4 @@ include $(top_builddir)/src/Makefile.global
 OBJS = gist.o gistutil.o gistxlog.o gistvacuum.o gistget.o gistscan.o \
        gistproc.o gistsplit.o
 
-all: SUBSYS.o
-
-SUBSYS.o: $(OBJS)
-	$(LD) $(LDREL) $(LDOUT) SUBSYS.o $(OBJS)
-
-clean: 
-	rm -f SUBSYS.o $(OBJS)
+include $(top_srcdir)/src/backend/common.mk
diff --git a/src/backend/access/hash/Makefile b/src/backend/access/hash/Makefile
index f653a83..df7563c 100644
--- a/src/backend/access/hash/Makefile
+++ b/src/backend/access/hash/Makefile
@@ -15,10 +15,4 @@ include $(top_builddir)/src/Makefile.global
 OBJS = hash.o hashfunc.o hashinsert.o hashovfl.o hashpage.o hashscan.o \
        hashsearch.o hashutil.o
 
-all: SUBSYS.o
-
-SUBSYS.o: $(OBJS)
-	$(LD) $(LDREL) $(LDOUT) SUBSYS.o $(OBJS)
-
-clean: 
-	rm -f SUBSYS.o $(OBJS)
+include $(top_srcdir)/src/backend/common.mk
diff --git a/src/backend/access/heap/Makefile b/src/backend/access/heap/Makefile
index abd3212..1674467 100644
--- a/src/backend/access/heap/Makefile
+++ b/src/backend/access/heap/Makefile
@@ -14,10 +14,4 @@ include $(top_builddir)/src/Makefile.global
 
 OBJS = heapam.o hio.o pruneheap.o rewriteheap.o syncscan.o tuptoaster.o
 
-all: SUBSYS.o
-
-SUBSYS.o: $(OBJS)
-	$(LD) $(LDREL) $(LDOUT) SUBSYS.o $(OBJS)
-
-clean: 
-	rm -f SUBSYS.o $(OBJS)
+include $(top_srcdir)/src/backend/common.mk
diff --git a/src/backend/access/index/Makefile b/src/backend/access/index/Makefile
index d849b26..5469970 100644
--- a/src/backend/access/index/Makefile
+++ b/src/backend/access/index/Makefile
@@ -14,10 +14,4 @@ include $(top_builddir)/src/Makefile.global
 
 OBJS = genam.o indexam.o
 
-all: SUBSYS.o
-
-SUBSYS.o: $(OBJS)
-	$(LD) $(LDREL) $(LDOUT) SUBSYS.o $(OBJS)
-
-clean: 
-	rm -f SUBSYS.o $(OBJS)
+include $(top_srcdir)/src/backend/common.mk
diff --git a/src/backend/access/nbtree/Makefile b/src/backend/access/nbtree/Makefile
index b833ef9..323a2f3 100644
--- a/src/backend/access/nbtree/Makefile
+++ b/src/backend/access/nbtree/Makefile
@@ -15,10 +15,4 @@ include $(top_builddir)/src/Makefile.global
 OBJS = nbtcompare.o nbtinsert.o nbtpage.o nbtree.o nbtsearch.o \
        nbtutils.o nbtsort.o nbtxlog.o
 
-all: SUBSYS.o
-
-SUBSYS.o: $(OBJS)
-	$(LD) $(LDREL) $(LDOUT) SUBSYS.o $(OBJS)
-
-clean: 
-	rm -f SUBSYS.o $(OBJS)
+include $(top_srcdir)/src/backend/common.mk
diff --git a/src/backend/access/transam/Makefile b/src/backend/access/transam/Makefile
index 9d7c23c..8532d28 100644
--- a/src/backend/access/transam/Makefile
+++ b/src/backend/access/transam/Makefile
@@ -14,13 +14,7 @@ include $(top_builddir)/src/Makefile.global
 
 OBJS = clog.o transam.o varsup.o xact.o xlog.o xlogutils.o rmgr.o slru.o subtrans.o multixact.o twophase.o twophase_rmgr.o
 
-all: SUBSYS.o
-
-SUBSYS.o: $(OBJS)
-	$(LD) $(LDREL) $(LDOUT) SUBSYS.o $(OBJS)
-
-clean: 
-	rm -f SUBSYS.o $(OBJS)
+include $(top_srcdir)/src/backend/common.mk
 
 # ensure that version checks in xlog.c get recompiled when catversion.h changes
 xlog.o: xlog.c $(top_srcdir)/src/include/catalog/catversion.h
diff --git a/src/backend/bootstrap/Makefile b/src/backend/bootstrap/Makefile
index bd55e3f..026e096 100644
--- a/src/backend/bootstrap/Makefile
+++ b/src/backend/bootstrap/Makefile
@@ -14,10 +14,7 @@ override CPPFLAGS := -I$(srcdir) $(CPPFLAGS)
 
 OBJS= bootparse.o bootstrap.o 
 
-all: SUBSYS.o
-
-SUBSYS.o: $(OBJS)
-	$(LD) $(LDREL) $(LDOUT) $@ $^
+include $(top_srcdir)/src/backend/common.mk
 
 
 # bootscanner is compiled as part of bootparse
@@ -50,6 +47,5 @@ bootstrap.o bootparse.o: $(srcdir)/bootstrap_tokens.h
 # bootparse.c, bootstrap_tokens.h, and bootscanner.c are in the distribution
 # tarball, so they are not cleaned here.
 clean:
-	rm -f SUBSYS.o $(OBJS)
 # And the garbage that might have been left behind by partial build:
 	@rm -f y.tab.h y.tab.c y.output lex.yy.c
diff --git a/src/backend/catalog/Makefile b/src/backend/catalog/Makefile
index cda6c4d..23201d1 100644
--- a/src/backend/catalog/Makefile
+++ b/src/backend/catalog/Makefile
@@ -17,10 +17,9 @@ OBJS = catalog.o dependency.o heap.o index.o indexing.o namespace.o aclchk.o \
 
 BKIFILES = postgres.bki postgres.description postgres.shdescription
 
-all: SUBSYS.o $(BKIFILES)
+include $(top_srcdir)/src/backend/common.mk
 
-SUBSYS.o: $(OBJS)
-	$(LD) $(LDREL) $(LDOUT) SUBSYS.o $(OBJS)
+all: $(BKIFILES)
 
 # Note: there are some undocumented dependencies on the ordering in which
 # the catalog header files are assembled into postgres.bki.  In particular,
@@ -67,4 +66,4 @@ uninstall-data:
 	rm -f $(addprefix '$(DESTDIR)$(datadir)'/, $(BKIFILES) system_views.sql information_schema.sql sql_features.txt)
 
 clean:
-	rm -f SUBSYS.o $(OBJS) $(BKIFILES)
+	rm -f $(BKIFILES)
diff --git a/src/backend/commands/Makefile b/src/backend/commands/Makefile
index 1b7ef08..7925e7b 100644
--- a/src/backend/commands/Makefile
+++ b/src/backend/commands/Makefile
@@ -21,10 +21,4 @@ OBJS = aggregatecmds.o alter.o analyze.o async.o cluster.o comment.o  \
 	tsearchcmds.o typecmds.o user.o vacuum.o vacuumlazy.o \
 	variable.o view.o
 
-all: SUBSYS.o
-
-SUBSYS.o: $(OBJS)
-	$(LD) $(LDREL) $(LDOUT) SUBSYS.o $(OBJS)
-
-clean: 
-	rm -f SUBSYS.o $(OBJS) 
+include $(top_srcdir)/src/backend/common.mk
diff --git a/src/backend/common.mk b/src/backend/common.mk
new file mode 100644
index 0000000..dfbc7d1
--- /dev/null
+++ b/src/backend/common.mk
@@ -0,0 +1,19 @@
+SUBDIROBJS = $(SUBDIRS:%=%/SUBSYS.o)
+
+all: SUBSYS.o
+
+SUBSYS.o: $(SUBDIROBJS) $(OBJS)
+	$(LD) $(LDREL) $(LDOUT) $@ $^
+
+$(SUBDIROBJS): $(SUBDIRS:%=%-recursive) ;
+
+.PHONY: $(SUBDIRS:%=%-recursive)
+$(SUBDIRS:%=%-recursive):
+	$(MAKE) -C $(subst -recursive,,$@) SUBSYS.o
+
+clean: clean-local
+clean-local:
+ifdef SUBDIRS
+	for dir in $(SUBDIRS); do $(MAKE) -C $$dir clean || exit; done
+endif
+	rm -f SUBSYS.o $(OBJS)
diff --git a/src/backend/executor/Makefile b/src/backend/executor/Makefile
index 0d939c2..9149265 100644
--- a/src/backend/executor/Makefile
+++ b/src/backend/executor/Makefile
@@ -23,10 +23,4 @@ OBJS = execAmi.o execCurrent.o execGrouping.o execJunk.o execMain.o \
        nodeValuesscan.o nodeLimit.o nodeGroup.o \
        nodeSubplan.o nodeSubqueryscan.o nodeTidscan.o tstoreReceiver.o spi.o
 
-all: SUBSYS.o
-
-SUBSYS.o: $(OBJS)
-	$(LD) $(LDREL) $(LDOUT) SUBSYS.o $(OBJS)
-
-clean: 
-	rm -f SUBSYS.o $(OBJS) 
+include $(top_srcdir)/src/backend/common.mk
diff --git a/src/backend/lib/Makefile b/src/backend/lib/Makefile
index 116adad..f362d50 100644
--- a/src/backend/lib/Makefile
+++ b/src/backend/lib/Makefile
@@ -14,10 +14,4 @@ include $(top_builddir)/src/Makefile.global
 
 OBJS = dllist.o stringinfo.o
 
-all: SUBSYS.o
-
-SUBSYS.o: $(OBJS)
-	$(LD) $(LDREL) $(LDOUT) SUBSYS.o $(OBJS)
-
-clean: 
-	rm -f SUBSYS.o $(OBJS) 
+include $(top_srcdir)/src/backend/common.mk
diff --git a/src/backend/libpq/Makefile b/src/backend/libpq/Makefile
index 2edac24..43f5bca 100644
--- a/src/backend/libpq/Makefile
+++ b/src/backend/libpq/Makefile
@@ -17,11 +17,4 @@ include $(top_builddir)/src/Makefile.global
 OBJS = be-fsstubs.o be-secure.o auth.o crypt.o hba.o ip.o md5.o pqcomm.o \
        pqformat.o pqsignal.o
 
-
-all: SUBSYS.o
-
-SUBSYS.o: $(OBJS)
-	$(LD) $(LDREL) $(LDOUT) SUBSYS.o $(OBJS)
-
-clean: 
-	rm -f SUBSYS.o $(OBJS) 
+include $(top_srcdir)/src/backend/common.mk
diff --git a/src/backend/main/Makefile b/src/backend/main/Makefile
index 3698729..e31446d 100644
--- a/src/backend/main/Makefile
+++ b/src/backend/main/Makefile
@@ -14,10 +14,4 @@ include $(top_builddir)/src/Makefile.global
 
 OBJS = main.o
 
-all: SUBSYS.o
-
-SUBSYS.o: $(OBJS)
-	$(LD) $(LDREL) $(LDOUT) SUBSYS.o $(OBJS)
-
-clean: 
-	rm -f SUBSYS.o $(OBJS) 
+include $(top_srcdir)/src/backend/common.mk
diff --git a/src/backend/nodes/Makefile b/src/backend/nodes/Makefile
index 9cdf2b2..d317125 100644
--- a/src/backend/nodes/Makefile
+++ b/src/backend/nodes/Makefile
@@ -16,10 +16,4 @@ OBJS = nodeFuncs.o nodes.o list.o bitmapset.o tidbitmap.o \
        copyfuncs.o equalfuncs.o makefuncs.o \
        outfuncs.o readfuncs.o print.o read.o params.o value.o
 
-all: SUBSYS.o
-
-SUBSYS.o: $(OBJS)
-	$(LD) $(LDREL) $(LDOUT) SUBSYS.o $(OBJS)
-
-clean: 
-	rm -f SUBSYS.o $(OBJS) 
+include $(top_srcdir)/src/backend/common.mk
diff --git a/src/backend/optimizer/Makefile b/src/backend/optimizer/Makefile
index a675c55..046297e 100644
--- a/src/backend/optimizer/Makefile
+++ b/src/backend/optimizer/Makefile
@@ -9,19 +9,5 @@ top_builddir = ../../..
 include $(top_builddir)/src/Makefile.global
 
 SUBDIRS     = geqo path plan prep util
-SUBDIROBJS  = $(SUBDIRS:%=%/SUBSYS.o)
 
-all: SUBSYS.o
-
-SUBSYS.o: $(SUBDIROBJS)
-	$(LD) $(LDREL) $(LDOUT) $@ $^
-
-$(SUBDIROBJS): $(SUBDIRS:%=%-recursive) ;
-
-.PHONY: $(SUBDIRS:%=%-recursive)
-$(SUBDIRS:%=%-recursive):
-	$(MAKE) -C $(subst -recursive,,$@) SUBSYS.o
-
-clean:
-	for dir in $(SUBDIRS); do $(MAKE) -C $$dir $@ || exit; done
-	rm -f SUBSYS.o
+include $(top_srcdir)/src/backend/common.mk
diff --git a/src/backend/optimizer/geqo/Makefile b/src/backend/optimizer/geqo/Makefile
index ebd4ef5..5f1e1b0 100644
--- a/src/backend/optimizer/geqo/Makefile
+++ b/src/backend/optimizer/geqo/Makefile
@@ -18,10 +18,4 @@ OBJS =	geqo_copy.o geqo_eval.o geqo_main.o geqo_misc.o \
 	geqo_selection.o \
 	geqo_erx.o geqo_pmx.o geqo_cx.o geqo_px.o geqo_ox1.o geqo_ox2.o
 
-all: SUBSYS.o
-
-SUBSYS.o: $(OBJS)
-	$(LD) $(LDREL) $(LDOUT) SUBSYS.o $(OBJS)
-
-clean: 
-	rm -f SUBSYS.o $(OBJS)
+include $(top_srcdir)/src/backend/common.mk
diff --git a/src/backend/optimizer/path/Makefile b/src/backend/optimizer/path/Makefile
index 52c2617..591574d 100644
--- a/src/backend/optimizer/path/Makefile
+++ b/src/backend/optimizer/path/Makefile
@@ -15,10 +15,4 @@ include $(top_builddir)/src/Makefile.global
 OBJS = allpaths.o clausesel.o costsize.o equivclass.o indxpath.o \
        joinpath.o joinrels.o orindxpath.o pathkeys.o tidpath.o
 
-all: SUBSYS.o
-
-SUBSYS.o: $(OBJS)
-	$(LD) $(LDREL) $(LDOUT) SUBSYS.o $(OBJS)
-
-clean: 
-	rm -f SUBSYS.o $(OBJS)
+include $(top_srcdir)/src/backend/common.mk
diff --git a/src/backend/optimizer/plan/Makefile b/src/backend/optimizer/plan/Makefile
index dab548b..2750117 100644
--- a/src/backend/optimizer/plan/Makefile
+++ b/src/backend/optimizer/plan/Makefile
@@ -15,10 +15,4 @@ include $(top_builddir)/src/Makefile.global
 OBJS = createplan.o initsplan.o planagg.o planmain.o planner.o \
 	setrefs.o subselect.o
 
-all: SUBSYS.o
-
-SUBSYS.o: $(OBJS)
-	$(LD) $(LDREL) $(LDOUT) SUBSYS.o $(OBJS)
-
-clean: 
-	rm -f SUBSYS.o $(OBJS)
+include $(top_srcdir)/src/backend/common.mk
diff --git a/src/backend/optimizer/prep/Makefile b/src/backend/optimizer/prep/Makefile
index f4f2902..f99a085 100644
--- a/src/backend/optimizer/prep/Makefile
+++ b/src/backend/optimizer/prep/Makefile
@@ -14,10 +14,4 @@ include $(top_builddir)/src/Makefile.global
 
 OBJS = prepjointree.o prepqual.o preptlist.o prepunion.o
 
-all: SUBSYS.o
-
-SUBSYS.o: $(OBJS)
-	$(LD) $(LDREL) $(LDOUT) SUBSYS.o $(OBJS)
-
-clean: 
-	rm -f SUBSYS.o $(OBJS)
+include $(top_srcdir)/src/backend/common.mk
diff --git a/src/backend/optimizer/util/Makefile b/src/backend/optimizer/util/Makefile
index ae2985a..5b10a32 100644
--- a/src/backend/optimizer/util/Makefile
+++ b/src/backend/optimizer/util/Makefile
@@ -15,10 +15,4 @@ include $(top_builddir)/src/Makefile.global
 OBJS = clauses.o joininfo.o pathnode.o plancat.o predtest.o \
        relnode.o restrictinfo.o tlist.o var.o
 
-all: SUBSYS.o
-
-SUBSYS.o: $(OBJS)
-	$(LD) $(LDREL) $(LDOUT) SUBSYS.o $(OBJS)
-
-clean: 
-	rm -f SUBSYS.o $(OBJS)
+include $(top_srcdir)/src/backend/common.mk
diff --git a/src/backend/parser/Makefile b/src/backend/parser/Makefile
index 0e75021..7ceb9ba 100644
--- a/src/backend/parser/Makefile
+++ b/src/backend/parser/Makefile
@@ -18,11 +18,7 @@ OBJS= analyze.o gram.o keywords.o parser.o parse_agg.o parse_clause.o \
 
 FLEXFLAGS = -CF
 
-
-all: SUBSYS.o
-
-SUBSYS.o: $(OBJS)
-	$(LD) $(LDREL) $(LDOUT) $@ $^
+include $(top_srcdir)/src/backend/common.mk
 
 
 # scan is compiled as part of gram
@@ -63,6 +59,5 @@ gram.o keywords.o parser.o: $(srcdir)/parse.h
 # gram.c, parse.h, and scan.c are in the distribution tarball, so they
 # are not cleaned here.
 clean: 
-	rm -f SUBSYS.o $(OBJS)
 # And the garbage that might have been left behind by partial build:
 	@rm -f y.tab.h y.tab.c y.output lex.yy.c
diff --git a/src/backend/port/Makefile b/src/backend/port/Makefile
index 9869698..8bdeb9d 100644
--- a/src/backend/port/Makefile
+++ b/src/backend/port/Makefile
@@ -32,10 +32,7 @@ ifeq ($(PORTNAME), win32)
 OBJS+=win32/SUBSYS.o
 endif
 
-all: SUBSYS.o
-
-SUBSYS.o: $(OBJS)
-	$(LD) $(LDREL) $(LDOUT) $@ $^
+include $(top_srcdir)/src/backend/common.mk
 
 darwin/SUBSYS.o: darwin.dir
 
@@ -62,6 +59,6 @@ ipc_test: ipc_test.o pg_sema.o pg_shmem.o
 	$(CC) $(CFLAGS) $(LDFLAGS) $(export_dynamic) $^ $(LIBS) -o $@
 
 distclean clean:
-	rm -f SUBSYS.o $(OBJS) ipc_test ipc_test.o tas_cpp.s
+	rm -f ipc_test ipc_test.o tas_cpp.s
 	$(MAKE) -C darwin clean
 	$(MAKE) -C win32 clean
diff --git a/src/backend/postmaster/Makefile b/src/backend/postmaster/Makefile
index c5b0fdf..3456e9c 100644
--- a/src/backend/postmaster/Makefile
+++ b/src/backend/postmaster/Makefile
@@ -15,10 +15,4 @@ include $(top_builddir)/src/Makefile.global
 OBJS = autovacuum.o bgwriter.o fork_process.o pgarch.o pgstat.o postmaster.o \
 	syslogger.o walwriter.o
 
-all: SUBSYS.o
-
-SUBSYS.o: $(OBJS)
-	$(LD) $(LDREL) $(LDOUT) SUBSYS.o $(OBJS)
-
-clean: 
-	rm -f SUBSYS.o $(OBJS) 
+include $(top_srcdir)/src/backend/common.mk
diff --git a/src/backend/regex/Makefile b/src/backend/regex/Makefile
index 579d64b..a7ce57e 100644
--- a/src/backend/regex/Makefile
+++ b/src/backend/regex/Makefile
@@ -14,15 +14,9 @@ include $(top_builddir)/src/Makefile.global
 
 OBJS = regcomp.o regerror.o regexec.o regfree.o
 
-all: SUBSYS.o
-
-SUBSYS.o: $(OBJS)
-	$(LD) $(LDREL) $(LDOUT) SUBSYS.o $(OBJS)
+include $(top_srcdir)/src/backend/common.mk
 
 # mark inclusion dependencies between .c files explicitly
 regcomp.o: regcomp.c regc_lex.c regc_color.c regc_nfa.c regc_cvec.c regc_locale.c
 
 regexec.o: regexec.c rege_dfa.c
-
-clean: 
-	rm -f SUBSYS.o $(OBJS)
diff --git a/src/backend/rewrite/Makefile b/src/backend/rewrite/Makefile
index 9ae6e95..5bf84da 100644
--- a/src/backend/rewrite/Makefile
+++ b/src/backend/rewrite/Makefile
@@ -15,10 +15,4 @@ include $(top_builddir)/src/Makefile.global
 OBJS = rewriteRemove.o rewriteDefine.o \
        rewriteHandler.o rewriteManip.o rewriteSupport.o
 
-all: SUBSYS.o
-
-SUBSYS.o: $(OBJS)
-	$(LD) $(LDREL) $(LDOUT) SUBSYS.o $(OBJS)
-
-clean: 
-	rm -f SUBSYS.o $(OBJS) 
+include $(top_srcdir)/src/backend/common.mk
diff --git a/src/backend/storage/Makefile b/src/backend/storage/Makefile
index 5d07afd..01ead15 100644
--- a/src/backend/storage/Makefile
+++ b/src/backend/storage/Makefile
@@ -9,19 +9,5 @@ top_builddir = ../../..
 include $(top_builddir)/src/Makefile.global
 
 SUBDIRS     = buffer file freespace ipc large_object lmgr page smgr
-SUBDIROBJS  = $(SUBDIRS:%=%/SUBSYS.o)
 
-all: SUBSYS.o
-
-SUBSYS.o: $(SUBDIROBJS)
-	$(LD) $(LDREL) $(LDOUT) $@ $^
-
-$(SUBDIROBJS): $(SUBDIRS:%=%-recursive) ;
-
-.PHONY: $(SUBDIRS:%=%-recursive)
-$(SUBDIRS:%=%-recursive):
-	$(MAKE) -C $(subst -recursive,,$@) SUBSYS.o
-
-clean:
-	for dir in $(SUBDIRS); do $(MAKE) -C $$dir $@ || exit; done
-	rm -f SUBSYS.o
+include $(top_srcdir)/src/backend/common.mk
diff --git a/src/backend/storage/buffer/Makefile b/src/backend/storage/buffer/Makefile
index 0fbe175..6b0132c 100644
--- a/src/backend/storage/buffer/Makefile
+++ b/src/backend/storage/buffer/Makefile
@@ -14,10 +14,4 @@ include $(top_builddir)/src/Makefile.global
 
 OBJS = buf_table.o buf_init.o bufmgr.o freelist.o localbuf.o
 
-all: SUBSYS.o
-
-SUBSYS.o: $(OBJS)
-	$(LD) $(LDREL) $(LDOUT) SUBSYS.o $(OBJS)
-
-clean: 
-	rm -f SUBSYS.o $(OBJS)
+include $(top_srcdir)/src/backend/common.mk
diff --git a/src/backend/storage/file/Makefile b/src/backend/storage/file/Makefile
index e171dd0..928fbb6 100644
--- a/src/backend/storage/file/Makefile
+++ b/src/backend/storage/file/Makefile
@@ -14,10 +14,4 @@ include $(top_builddir)/src/Makefile.global
 
 OBJS = fd.o buffile.o
 
-all: SUBSYS.o
-
-SUBSYS.o: $(OBJS)
-	$(LD) $(LDREL) $(LDOUT) SUBSYS.o $(OBJS)
-
-clean: 
-	rm -f SUBSYS.o $(OBJS)
+include $(top_srcdir)/src/backend/common.mk
diff --git a/src/backend/storage/freespace/Makefile b/src/backend/storage/freespace/Makefile
index 715bdd2..6d6dcde 100644
--- a/src/backend/storage/freespace/Makefile
+++ b/src/backend/storage/freespace/Makefile
@@ -14,10 +14,4 @@ include $(top_builddir)/src/Makefile.global
 
 OBJS = freespace.o
 
-all: SUBSYS.o
-
-SUBSYS.o: $(OBJS)
-	$(LD) $(LDREL) $(LDOUT) SUBSYS.o $(OBJS)
-
-clean: 
-	rm -f SUBSYS.o $(OBJS)
+include $(top_srcdir)/src/backend/common.mk
diff --git a/src/backend/storage/ipc/Makefile b/src/backend/storage/ipc/Makefile
index 621135d..5b3cd46 100644
--- a/src/backend/storage/ipc/Makefile
+++ b/src/backend/storage/ipc/Makefile
@@ -18,10 +18,4 @@ endif
 OBJS = ipc.o ipci.o pmsignal.o procarray.o shmem.o shmqueue.o \
 	sinval.o sinvaladt.o
 
-all: SUBSYS.o
-
-SUBSYS.o: $(OBJS)
-	$(LD) $(LDREL) $(LDOUT) SUBSYS.o $(OBJS)
-
-clean: 
-	rm -f SUBSYS.o $(OBJS)
+include $(top_srcdir)/src/backend/common.mk
diff --git a/src/backend/storage/large_object/Makefile b/src/backend/storage/large_object/Makefile
index ec2e7ed..f5ed7a6 100644
--- a/src/backend/storage/large_object/Makefile
+++ b/src/backend/storage/large_object/Makefile
@@ -14,10 +14,4 @@ include $(top_builddir)/src/Makefile.global
 
 OBJS = inv_api.o
 
-all: SUBSYS.o
-
-SUBSYS.o: $(OBJS)
-	$(LD) $(LDREL) $(LDOUT) SUBSYS.o $(OBJS)
-
-clean: 
-	rm -f SUBSYS.o $(OBJS)
+include $(top_srcdir)/src/backend/common.mk
diff --git a/src/backend/storage/lmgr/Makefile b/src/backend/storage/lmgr/Makefile
index aaf7e8e..a3dbfa4 100644
--- a/src/backend/storage/lmgr/Makefile
+++ b/src/backend/storage/lmgr/Makefile
@@ -14,10 +14,7 @@ include $(top_builddir)/src/Makefile.global
 
 OBJS = lmgr.o lock.o proc.o deadlock.o lwlock.o spin.o s_lock.o
 
-all: SUBSYS.o
-
-SUBSYS.o: $(OBJS)
-	$(LD) $(LDREL) $(LDOUT) SUBSYS.o $(OBJS)
+include $(top_srcdir)/src/backend/common.mk
 
 ifdef TAS
 TASPATH = $(top_builddir)/src/backend/port/tas.o
@@ -31,4 +28,4 @@ check: s_lock_test
 	./s_lock_test
 
 clean distclean maintainer-clean: 
-	rm -f SUBSYS.o $(OBJS) s_lock_test
+	rm -f s_lock_test
diff --git a/src/backend/storage/page/Makefile b/src/backend/storage/page/Makefile
index 3ee4673..3857634 100644
--- a/src/backend/storage/page/Makefile
+++ b/src/backend/storage/page/Makefile
@@ -14,10 +14,4 @@ include $(top_builddir)/src/Makefile.global
 
 OBJS =  bufpage.o itemptr.o
 
-all: SUBSYS.o
-
-SUBSYS.o: $(OBJS)
-	$(LD) $(LDREL) $(LDOUT) SUBSYS.o $(OBJS)
-
-clean: 
-	rm -f SUBSYS.o $(OBJS)
+include $(top_srcdir)/src/backend/common.mk
diff --git a/src/backend/storage/smgr/Makefile b/src/backend/storage/smgr/Makefile
index 6cabbec..2a7502a 100644
--- a/src/backend/storage/smgr/Makefile
+++ b/src/backend/storage/smgr/Makefile
@@ -14,10 +14,4 @@ include $(top_builddir)/src/Makefile.global
 
 OBJS = md.o smgr.o smgrtype.o
 
-all: SUBSYS.o
-
-SUBSYS.o: $(OBJS)
-	$(LD) $(LDREL) $(LDOUT) SUBSYS.o $(OBJS)
-
-clean: 
-	rm -f SUBSYS.o $(OBJS)
+include $(top_srcdir)/src/backend/common.mk
diff --git a/src/backend/tcop/Makefile b/src/backend/tcop/Makefile
index 9ed4ac2..18c9057 100644
--- a/src/backend/tcop/Makefile
+++ b/src/backend/tcop/Makefile
@@ -18,10 +18,4 @@ ifneq (,$(filter $(PORTNAME),cygwin win32))
 override CPPFLAGS += -DWIN32_STACK_RLIMIT=$(WIN32_STACK_RLIMIT)
 endif
 
-all: SUBSYS.o
-
-SUBSYS.o: $(OBJS)
-	$(LD) $(LDREL) $(LDOUT) SUBSYS.o $(OBJS)
-
-clean: 
-	rm -f SUBSYS.o $(OBJS) 
+include $(top_srcdir)/src/backend/common.mk
diff --git a/src/backend/tsearch/Makefile b/src/backend/tsearch/Makefile
index 8bf5f8e..6d942b0 100644
--- a/src/backend/tsearch/Makefile
+++ b/src/backend/tsearch/Makefile
@@ -21,13 +21,7 @@ OBJS = ts_locale.o ts_parse.o wparser.o wparser_def.o dict.o \
 	dict_ispell.o regis.o spell.o \
 	to_tsany.o ts_utils.o
 
-all: SUBSYS.o 
-
-SUBSYS.o: $(OBJS)
-	$(LD) $(LDREL) $(LDOUT) SUBSYS.o $^
-
-depend dep:
-	$(CC) -MM $(CFLAGS) *.c >depend
+include $(top_srcdir)/src/backend/common.mk
 
 .PHONY: install-data
 install-data: $(DICTFILES) installdirs
@@ -43,10 +37,3 @@ uninstall-data:
 	for i in $(DICTFILES); \
 		do rm -rf '$(DESTDIR)$(datadir)/$(DICTDIR)/'$$i ; \
 	done
-
-clean distclean maintainer-clean: 
-	rm -f SUBSYS.o $(OBJS)
-
-ifeq (depend,$(wildcard depend))
-include depend
-endif
diff --git a/src/backend/utils/Makefile b/src/backend/utils/Makefile
index c5fe8e1..b3ba7c1 100644
--- a/src/backend/utils/Makefile
+++ b/src/backend/utils/Makefile
@@ -8,25 +8,17 @@ subdir = src/backend/utils
 top_builddir = ../../..
 include $(top_builddir)/src/Makefile.global
 
+OBJS        = fmgrtab.o
 SUBDIRS     = adt cache error fmgr hash init mb misc mmgr resowner sort time
-SUBDIROBJS  = $(SUBDIRS:%=%/SUBSYS.o)
 
+include $(top_srcdir)/src/backend/common.mk
 
-all: SUBSYS.o fmgroids.h
+all: fmgroids.h
 
-SUBSYS.o: fmgrtab.o $(SUBDIROBJS)
-	$(LD) $(LDREL) $(LDOUT) $@ $^
-
-$(SUBDIROBJS): $(SUBDIRS:%=%-recursive) ;
-
-.PHONY: $(SUBDIRS:%=%-recursive)
 $(SUBDIRS:%=%-recursive): fmgroids.h
-	$(MAKE) -C $(subst -recursive,,$@) SUBSYS.o
 
 fmgroids.h fmgrtab.c: Gen_fmgrtab.sh $(top_srcdir)/src/include/catalog/pg_proc.h
 	AWK='$(AWK)' $(SHELL) $< $(top_srcdir)/src/include/catalog/pg_proc.h
 
-
 clean:
-	for dir in $(SUBDIRS); do $(MAKE) -C $$dir $@ || exit; done
-	rm -f SUBSYS.o fmgrtab.o fmgroids.h fmgrtab.c
+	rm -f fmgroids.h fmgrtab.c
diff --git a/src/backend/utils/adt/Makefile b/src/backend/utils/adt/Makefile
index 9e1917f..5fa9ebd 100644
--- a/src/backend/utils/adt/Makefile
+++ b/src/backend/utils/adt/Makefile
@@ -33,10 +33,4 @@ OBJS = acl.o arrayfuncs.o array_userfuncs.o arrayutils.o bool.o \
 
 like.o: like.c like_match.c
 
-all: SUBSYS.o
-
-SUBSYS.o: $(OBJS)
-	$(LD) $(LDREL) $(LDOUT) SUBSYS.o $(OBJS)
-
-clean: 
-	rm -f SUBSYS.o $(OBJS)
+include $(top_srcdir)/src/backend/common.mk
diff --git a/src/backend/utils/cache/Makefile b/src/backend/utils/cache/Makefile
index 4c3bd06..85d6164 100644
--- a/src/backend/utils/cache/Makefile
+++ b/src/backend/utils/cache/Makefile
@@ -15,10 +15,4 @@ include $(top_builddir)/src/Makefile.global
 OBJS = catcache.o inval.o plancache.o relcache.o \
 	syscache.o lsyscache.o typcache.o ts_cache.o
 
-all: SUBSYS.o
-
-SUBSYS.o: $(OBJS)
-	$(LD) $(LDREL) $(LDOUT) SUBSYS.o $(OBJS)
-
-clean: 
-	rm -f SUBSYS.o $(OBJS)
+include $(top_srcdir)/src/backend/common.mk
diff --git a/src/backend/utils/error/Makefile b/src/backend/utils/error/Makefile
index 9455583..27e71a0 100644
--- a/src/backend/utils/error/Makefile
+++ b/src/backend/utils/error/Makefile
@@ -14,10 +14,4 @@ include $(top_builddir)/src/Makefile.global
 
 OBJS = assert.o elog.o
 
-all: SUBSYS.o
-
-SUBSYS.o: $(OBJS)
-	$(LD) $(LDREL) $(LDOUT) SUBSYS.o $(OBJS)
-
-clean: 
-	rm -f SUBSYS.o $(OBJS)
+include $(top_srcdir)/src/backend/common.mk
diff --git a/src/backend/utils/fmgr/Makefile b/src/backend/utils/fmgr/Makefile
index 64dff26..adfd931 100644
--- a/src/backend/utils/fmgr/Makefile
+++ b/src/backend/utils/fmgr/Makefile
@@ -16,11 +16,4 @@ OBJS = dfmgr.o fmgr.o funcapi.o
 
 override CPPFLAGS += -DDLSUFFIX=\"$(DLSUFFIX)\"
 
-
-all: SUBSYS.o
-
-SUBSYS.o: $(OBJS)
-	$(LD) $(LDREL) $(LDOUT) SUBSYS.o $(OBJS)
-
-clean: 
-	rm -f SUBSYS.o $(OBJS)
+include $(top_srcdir)/src/backend/common.mk
diff --git a/src/backend/utils/hash/Makefile b/src/backend/utils/hash/Makefile
index 310273a..a758f11 100644
--- a/src/backend/utils/hash/Makefile
+++ b/src/backend/utils/hash/Makefile
@@ -14,10 +14,4 @@ include $(top_builddir)/src/Makefile.global
 
 OBJS = dynahash.o hashfn.o pg_crc.o
 
-all: SUBSYS.o
-
-SUBSYS.o: $(OBJS)
-	$(LD) $(LDREL) $(LDOUT) SUBSYS.o $(OBJS)
-
-clean: 
-	rm -f SUBSYS.o $(OBJS)
+include $(top_srcdir)/src/backend/common.mk
diff --git a/src/backend/utils/init/Makefile b/src/backend/utils/init/Makefile
index f8e549f..fac22c5 100644
--- a/src/backend/utils/init/Makefile
+++ b/src/backend/utils/init/Makefile
@@ -14,10 +14,4 @@ include $(top_builddir)/src/Makefile.global
 
 OBJS = flatfiles.o globals.o miscinit.o postinit.o
 
-all: SUBSYS.o
-
-SUBSYS.o: $(OBJS)
-	$(LD) $(LDREL) $(LDOUT) SUBSYS.o $(OBJS)
-
-clean: 
-	rm -f SUBSYS.o $(OBJS)
+include $(top_srcdir)/src/backend/common.mk
diff --git a/src/backend/utils/mb/Makefile b/src/backend/utils/mb/Makefile
index 8644cea..7b01608 100644
--- a/src/backend/utils/mb/Makefile
+++ b/src/backend/utils/mb/Makefile
@@ -13,15 +13,8 @@ top_builddir = ../../../..
 include $(top_builddir)/src/Makefile.global
 
 OBJS = encnames.o conv.o mbutils.o wchar.o wstrcmp.o wstrncmp.o
-DIRS = conversion_procs
 
-all install installdirs: SUBSYS.o
-
-uninstall distprep:
+include $(top_srcdir)/src/backend/common.mk
 
 clean distclean maintainer-clean:
-	rm -f SUBSYS.o $(OBJS)
-	@for dir in $(DIRS); do $(MAKE) -C $$dir $@; done
-
-SUBSYS.o: $(OBJS)
-	$(LD) $(LDREL) $(LDOUT) $@ $^
+	$(MAKE) -C conversion_procs $@
diff --git a/src/backend/utils/misc/Makefile b/src/backend/utils/misc/Makefile
index 797893b..07feea7 100644
--- a/src/backend/utils/misc/Makefile
+++ b/src/backend/utils/misc/Makefile
@@ -22,11 +22,7 @@ ifdef krb_srvtab
 override CPPFLAGS += -DPG_KRB_SRVTAB='"$(krb_srvtab)"'
 endif
 
-
-all: SUBSYS.o
-
-SUBSYS.o: $(OBJS)
-	$(LD) $(LDREL) $(LDOUT) SUBSYS.o $(OBJS)
+include $(top_srcdir)/src/backend/common.mk
 
 # guc-file is compiled as part of guc
 guc.o: $(srcdir)/guc-file.c
@@ -41,5 +37,4 @@ endif
 # Note: guc-file.c is not deleted by 'make clean',
 # since we want to ship it in distribution tarballs.
 clean: 
-	rm -f SUBSYS.o $(OBJS)
 	@rm -f lex.yy.c
diff --git a/src/backend/utils/mmgr/Makefile b/src/backend/utils/mmgr/Makefile
index 085ea2b..92c71d7 100644
--- a/src/backend/utils/mmgr/Makefile
+++ b/src/backend/utils/mmgr/Makefile
@@ -14,10 +14,4 @@ include $(top_builddir)/src/Makefile.global
 
 OBJS = aset.o mcxt.o portalmem.o
 
-all: SUBSYS.o
-
-SUBSYS.o: $(OBJS)
-	$(LD) $(LDREL) $(LDOUT) SUBSYS.o $(OBJS)
-
-clean: 
-	rm -f SUBSYS.o $(OBJS)
+include $(top_srcdir)/src/backend/common.mk
diff --git a/src/backend/utils/resowner/Makefile b/src/backend/utils/resowner/Makefile
index f6d716d..cb72cff 100644
--- a/src/backend/utils/resowner/Makefile
+++ b/src/backend/utils/resowner/Makefile
@@ -14,10 +14,4 @@ include $(top_builddir)/src/Makefile.global
 
 OBJS = resowner.o
 
-all: SUBSYS.o
-
-SUBSYS.o: $(OBJS)
-	$(LD) $(LDREL) $(LDOUT) SUBSYS.o $(OBJS)
-
-clean: 
-	rm -f SUBSYS.o $(OBJS)
+include $(top_srcdir)/src/backend/common.mk
diff --git a/src/backend/utils/sort/Makefile b/src/backend/utils/sort/Makefile
index 2cb8085..5ebbda8 100644
--- a/src/backend/utils/sort/Makefile
+++ b/src/backend/utils/sort/Makefile
@@ -14,10 +14,4 @@ include $(top_builddir)/src/Makefile.global
 
 OBJS = logtape.o tuplesort.o tuplestore.o
 
-all: SUBSYS.o
-
-SUBSYS.o: $(OBJS)
-	$(LD) $(LDREL) $(LDOUT) SUBSYS.o $(OBJS)
-
-clean: 
-	rm -f SUBSYS.o $(OBJS)
+include $(top_srcdir)/src/backend/common.mk
diff --git a/src/backend/utils/time/Makefile b/src/backend/utils/time/Makefile
index 6b7a6e1..89890e9 100644
--- a/src/backend/utils/time/Makefile
+++ b/src/backend/utils/time/Makefile
@@ -14,10 +14,4 @@ include $(top_builddir)/src/Makefile.global
 
 OBJS = combocid.o tqual.o
 
-all: SUBSYS.o
-
-SUBSYS.o: $(OBJS)
-	$(LD) $(LDREL) $(LDOUT) SUBSYS.o $(OBJS)
-
-clean:
-	rm -f SUBSYS.o $(OBJS)
+include $(top_srcdir)/src/backend/common.mk
