diff --git a/ChangeLog b/ChangeLog
index 85cc9df5ab8ee7907c2576860fc24bb150d92fcb..5a3509912c998ddc96008aae097e8d9aa40fdaf3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2009-04-09  Steve Ellcey  <sje@cup.hp.com>
+
+	* Makefil.def (languages): New entries.
+	* Makefile.tpl (check-gcc-*): New generic target.
+	* Makefile.in: Regenerate.
+
 2009-03-27  Eli Zaretskii  <eliz@gnu.org>
 
 	* djunpack.bat: Use ".." quoting in Sed command, for the sake of
diff --git a/Makefile.def b/Makefile.def
index a0a5266d21894b89cf2cbf0834063ff4a4e686e2..c6a9291358c27015fb494dd4d7831b8c8154e9bb 100644
--- a/Makefile.def
+++ b/Makefile.def
@@ -541,6 +541,19 @@ dependencies = { module=all-target-libgloss; on=all-target-newlib; };
 dependencies = { module=all-target-winsup; on=all-target-libiberty; };
 dependencies = { module=all-target-winsup; on=all-target-libtermcap; };
 
+languages = { language=c;	gcc-check-target=check-gcc; };
+languages = { language=c++;	gcc-check-target=check-c++;
+				lib-check-target=check-target-libstdc++-v3; };
+languages = { language=fortran;	gcc-check-target=check-fortran;
+				lib-check-target=check-target-libgfortran; };
+languages = { language=java;	gcc-check-target=check-java;
+				lib-check-target=check-target-libjava; };
+languages = { language=ada;	gcc-check-target=check-ada;
+				lib-check-target=check-target-libada; };
+languages = { language=objc;	gcc-check-target=check-objc;
+				lib-check-target=check-target-libobjc; };
+languages = { language=obj-c++;	gcc-check-target=check-obj-c++; };
+
 // Toplevel bootstrap
 bootstrap_stage = {
 	id=1 ;
diff --git a/Makefile.in b/Makefile.in
index 26d1d01b58430997ca80414c93cfab49ec1800a7..de33e1130a0b6e04513fb75f36ef0ea09b90fde1 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -52921,19 +52921,63 @@ cross: all-build all-gas all-ld
 @endif gcc-no-bootstrap
 
 @if gcc
-.PHONY: check-gcc-c++
+
+.PHONY: check-gcc-c check-c
+check-gcc-c:
+	r=`${PWD_COMMAND}`; export r; \
+	s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+	$(HOST_EXPORTS) \
+	(cd gcc && $(MAKE) $(GCC_FLAGS_TO_PASS) check-gcc);
+check-c: check-gcc-c
+
+.PHONY: check-gcc-c++ check-c++
 check-gcc-c++:
-	@if [ -f ./gcc/Makefile ] ; then \
-	  r=`${PWD_COMMAND}`; export r; \
-	  s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
-	  $(HOST_EXPORTS) \
-	  (cd gcc && $(MAKE) $(GCC_FLAGS_TO_PASS) check-c++); \
-	else \
-	  true; \
-	fi
+	r=`${PWD_COMMAND}`; export r; \
+	s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+	$(HOST_EXPORTS) \
+	(cd gcc && $(MAKE) $(GCC_FLAGS_TO_PASS) check-c++);
+check-c++: check-gcc-c++ check-target-libstdc++-v3
+
+.PHONY: check-gcc-fortran check-fortran
+check-gcc-fortran:
+	r=`${PWD_COMMAND}`; export r; \
+	s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+	$(HOST_EXPORTS) \
+	(cd gcc && $(MAKE) $(GCC_FLAGS_TO_PASS) check-fortran);
+check-fortran: check-gcc-fortran check-target-libgfortran
+
+.PHONY: check-gcc-java check-java
+check-gcc-java:
+	r=`${PWD_COMMAND}`; export r; \
+	s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+	$(HOST_EXPORTS) \
+	(cd gcc && $(MAKE) $(GCC_FLAGS_TO_PASS) check-java);
+check-java: check-gcc-java check-target-libjava
+
+.PHONY: check-gcc-ada check-ada
+check-gcc-ada:
+	r=`${PWD_COMMAND}`; export r; \
+	s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+	$(HOST_EXPORTS) \
+	(cd gcc && $(MAKE) $(GCC_FLAGS_TO_PASS) check-ada);
+check-ada: check-gcc-ada check-target-libada
+
+.PHONY: check-gcc-objc check-objc
+check-gcc-objc:
+	r=`${PWD_COMMAND}`; export r; \
+	s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+	$(HOST_EXPORTS) \
+	(cd gcc && $(MAKE) $(GCC_FLAGS_TO_PASS) check-objc);
+check-objc: check-gcc-objc check-target-libobjc
+
+.PHONY: check-gcc-obj-c++ check-obj-c++
+check-gcc-obj-c++:
+	r=`${PWD_COMMAND}`; export r; \
+	s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+	$(HOST_EXPORTS) \
+	(cd gcc && $(MAKE) $(GCC_FLAGS_TO_PASS) check-obj-c++);
+check-obj-c++: check-gcc-obj-c++
 
-.PHONY: check-c++
-check-c++: check-target-libstdc++-v3 check-gcc-c++
 
 # Install the gcc headers files, but not the fixed include files,
 # which Cygnus is not allowed to distribute.  This rule is very
diff --git a/Makefile.tpl b/Makefile.tpl
index acb349ff742f99107c4abeaf0847657616ed4587..1de3b0605cf60bf69c00d8c1f8ed01059c5305be 100644
--- a/Makefile.tpl
+++ b/Makefile.tpl
@@ -1216,19 +1216,15 @@ cross: all-build all-gas all-ld
 @endif gcc-no-bootstrap
 
 @if gcc
-.PHONY: check-gcc-c++
-check-gcc-c++:
-	@if [ -f ./gcc/Makefile ] ; then \
-	  r=`${PWD_COMMAND}`; export r; \
-	  s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
-	  $(HOST_EXPORTS) \
-	  (cd gcc && $(MAKE) $(GCC_FLAGS_TO_PASS) check-c++); \
-	else \
-	  true; \
-	fi
-
-.PHONY: check-c++
-check-c++: check-target-libstdc++-v3 check-gcc-c++
+[+ FOR languages +]
+.PHONY: check-gcc-[+language+] check-[+language+]
+check-gcc-[+language+]:
+	r=`${PWD_COMMAND}`; export r; \
+	s=`cd $(srcdir); ${PWD_COMMAND}`; export s; \
+	$(HOST_EXPORTS) \
+	(cd gcc && $(MAKE) $(GCC_FLAGS_TO_PASS) [+gcc-check-target+]);
+check-[+language+]: check-gcc-[+language+][+ IF lib-check-target +] [+ lib-check-target +][+ ENDIF lib-check-target +]
+[+ ENDFOR languages +]
 
 # Install the gcc headers files, but not the fixed include files,
 # which Cygnus is not allowed to distribute.  This rule is very