diff --git a/ChangeLog b/ChangeLog
index b9893ef784696f5d881d99b409442e191d56f7f8..9282eee74e280339e717c4787f8deb7922eee8c4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2005-11-29  Ben Elliston  <bje@au.ibm.com>
+
+	* Makefile.tpl (clean-target-libgcc): Invoke clean-target-libgcc
+	from the gcc build directory.
+	* Makefile.in: Regenerate.
+
 2005-11-29  Ben Elliston  <bje@au.ibm.com>
 
 	* Makefile.def: Add new libdecnumber host_module.  Make all-gcc
diff --git a/Makefile.in b/Makefile.in
index a3f470c57cfedabe9aad11764625be3aa7ce57e3..e84c5d23a7178e900cce69177961acb008edfc2e 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -2081,14 +2081,10 @@ maintainer-clean: local-maintainer-clean do-maintainer-clean local-clean
 maintainer-clean: local-distclean
 realclean: maintainer-clean
 
-# Extra dependency for clean-target, owing to the mixed nature of gcc
+# Extra dependency for clean-target, owing to the mixed nature of gcc.
 clean-target: clean-target-libgcc
 clean-target-libgcc:
-	test ! -d gcc/libgcc || \
-	(cd gcc/libgcc && find . -type d -print) | \
-	while read d; do rm -f gcc/$$d/libgcc.a || : ; done
-	-rm -rf gcc/libgcc
-	-rm -f gcc/stmp-dirs
+	test ! -d gcc || (cd gcc && $(MAKE) $@)
 
 # Check target.
 
diff --git a/Makefile.tpl b/Makefile.tpl
index c99ba5b5494dd0bc8df44e97f93776c6076ef060..4f38d6c5de44c3dde9f64244c6cd30b6cd54aabc 100644
--- a/Makefile.tpl
+++ b/Makefile.tpl
@@ -839,14 +839,10 @@ maintainer-clean: local-maintainer-clean do-maintainer-clean local-clean
 maintainer-clean: local-distclean
 realclean: maintainer-clean
 
-# Extra dependency for clean-target, owing to the mixed nature of gcc
+# Extra dependency for clean-target, owing to the mixed nature of gcc.
 clean-target: clean-target-libgcc
 clean-target-libgcc:
-	test ! -d gcc/libgcc || \
-	(cd gcc/libgcc && find . -type d -print) | \
-	while read d; do rm -f gcc/$$d/libgcc.a || : ; done
-	-rm -rf gcc/libgcc
-	-rm -f gcc/stmp-dirs
+	test ! -d gcc || (cd gcc && $(MAKE) $@)
 
 # Check target.
 
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 3d3a8d1974d3f65c3addb241573c095cf31bdf41..8aac20f508b82222a7926a4da0ac5c148481b3b6 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2005-11-29  Ben Elliston  <bje@au.ibm.com>
+
+	* Makefile.in (clean-target): Depend on clean-target-libgcc.
+	(clean-target-libgcc): Import rule from the top-level Makefile.in.
+
 2005-11-29  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
 
 	PR middle-end/20109
diff --git a/gcc/Makefile.in b/gcc/Makefile.in
index 19e0d93dcae4179ce8fe0b845077cc4f6e29acaf..de573ca839c144f69fab944b4928ebcb0b353489 100644
--- a/gcc/Makefile.in
+++ b/gcc/Makefile.in
@@ -3423,6 +3423,18 @@ fsf-funding.pod: funding.texi
 	-$(TEXI2POD) $< > $@
 
 #
+# clean-target removes all files made by compilation.
+# This can be added to over time.
+
+clean-target: clean-target-libgcc
+
+clean-target-libgcc:
+	test ! -d libgcc || \
+	(cd libgcc && find . -type d -print) | \
+	while read d; do rm -f $$d/libgcc.a || : ; done
+	test ! -d libgcc || rm -r libgcc
+	test ! -f stmp-dirs || rm stmp-dirs
+
 # Deletion of files made during compilation.
 # There are four levels of this:
 #   `mostlyclean', `clean', `distclean' and `maintainer-clean'.