Index: Makefile.am
===================================================================
RCS file: /sources/make/make/Makefile.am,v
retrieving revision 2.57
diff -u -r2.57 Makefile.am
--- Makefile.am	4 Jul 2007 19:35:16 -0000	2.57
+++ Makefile.am	30 Aug 2009 22:29:54 -0000
@@ -20,6 +20,9 @@
 AUTOMAKE_OPTIONS = 1.8 dist-bzip2 check-news
 ACLOCAL_AMFLAGS	=  -I config
 
+# Flag our build as being parallel-safe
+.AUTOPARALLEL:
+
 MAKE_HOST =	@MAKE_HOST@
 
 # Only process if target is MS-Windows
Index: file.c
===================================================================
RCS file: /sources/make/make/file.c,v
retrieving revision 1.93
diff -u -r1.93 file.c
--- file.c	13 Jun 2009 21:21:48 -0000	1.93
+++ file.c	30 Aug 2009 22:29:54 -0000
@@ -734,6 +734,14 @@
   if (f != 0 && f->is_target)
     not_parallel = 1;
 
+  f = lookup_file (".AUTOPARALLEL");
+  if (f != 0 && f->is_target && !job_slots_explicitly_set)
+    {
+      /* TODO: Replace this with some logic for detecting number of CPU
+       * cores, etc. */
+       job_slots = 8;
+    }
+
 #ifndef NO_MINUS_C_MINUS_O
   /* If .POSIX was defined, remove OUTPUT_OPTION to comply.  */
   /* This needs more work: what if the user sets this in the makefile?
Index: main.c
===================================================================
RCS file: /sources/make/make/main.c,v
retrieving revision 1.231
diff -u -r1.231 main.c
--- main.c	13 Jun 2009 21:21:48 -0000	1.231
+++ main.c	30 Aug 2009 22:29:54 -0000
@@ -221,8 +221,13 @@
 
 /* Number of job slots (commands that can be run at once).  */
 
-unsigned int job_slots = 1;
+unsigned int job_slots = 0;
 unsigned int default_job_slots = 1;
+/* Whether or not this invocation of make has been given a -j option.
+ * Used to determine if we should override job_slots on seeing a
+ * .AUTOPARALLEL flag.
+ */
+unsigned int job_slots_explicitly_set = 0;
 static unsigned int master_job_slots = 0;
 
 /* Value of job_slots that means no limit.  */
@@ -1273,6 +1278,15 @@
         die (0);
     }
 
+  if (job_slots == 0)
+    {
+      job_slots = 1;
+    }
+  else
+    {
+      job_slots_explicitly_set = 1;
+    }
+
 #ifndef VMS
   /* Set the "MAKE_COMMAND" variable to the name we were invoked with.
      (If it is a relative pathname with a slash, prepend our directory name
Index: make.h
===================================================================
RCS file: /sources/make/make/make.h,v
retrieving revision 1.133
diff -u -r1.133 make.h
--- make.h	7 Jun 2009 17:40:11 -0000	1.133
+++ make.h	30 Aug 2009 22:29:54 -0000
@@ -510,6 +510,7 @@
 extern char cmd_prefix;
 
 extern unsigned int job_slots;
+extern unsigned int job_slots_explicitly_set;
 extern int job_fds[2];
 extern int job_rfd;
 #ifndef NO_FLOAT
Index: doc/make.texi
===================================================================
RCS file: /sources/make/make/doc/make.texi,v
retrieving revision 1.58
diff -u -r1.58 make.texi
--- doc/make.texi	2 Aug 2009 16:05:42 -0000	1.58
+++ doc/make.texi	30 Aug 2009 22:29:55 -0000
@@ -2871,6 +2871,28 @@
 given.  Any recursively invoked @code{make} command will still run
 recipes in parallel (unless its makefile also contains this target).
 Any prerequisites on this target are ignored.
+
+@findex .AUTOPARALLEL
+@item .AUTOPARALLEL
+@cindex parallel execution, by default
+
+If @code{.AUTOPARALLEL} is mentioned as a target and the @samp{-j}
+option is not specified, then this invocation of @code{make} will
+by default run in parallel.  The number of jobs is not specified,
+but will likely use some heuristics based on the number of available
+CPU cores, system load, etc.  This option is useful if you want to ensure that
+any contributors to your project who may not be explicitly specifying
+parallel builds will automatically get one.
+
+This flag is also useful for meta-build systems which may want to
+know whether a project is parallel-safe.  The presence of this
+target implies that the maintainers actively ensure parallel
+builds work.
+
+Any specification of @samp{-j} overrides this option.
+
+Any prerequisites on this target are ignored.
+
 @end table
 
 Any defined implicit rule suffix also counts as a special target if it
