This patch adds colourised output to GNU Make 3.82.
The patch at http://git.goodpoint.de/?p=make.git;a=patch;h=c901be5018830bbc5d9b2cac553fd4174189659b
no longer applies.
Note: I am not the author, I just fixed it so that it applies again.
Copyright is held by FSF and the original author of the patch.

diff -ur make-3.82.orig/job.c make-3.82/job.c
--- make-3.82.orig/job.c	2010-07-24 10:27:50.000000000 +0200
+++ make-3.82/job.c	2013-02-04 21:51:30.093987651 +0100
@@ -1144,7 +1144,7 @@
      appear.  */
 
   message (0, (just_print_flag || (!(flags & COMMANDS_SILENT) && !silent_flag))
-	   ? "%s" : (char *) 0, p);
+	   ? "\033[1;35m%s\033[0m" : (char *) 0, p);
 
   /* Tell update_goal_chain that a command has been started on behalf of
      this target.  It is important that this happens here and not in
Only in make-3.82: job.c.orig
Only in make-3.82: job.c.rej
diff -ur make-3.82.orig/main.c make-3.82/main.c
--- make-3.82.orig/main.c	2010-07-19 09:10:53.000000000 +0200
+++ make-3.82/main.c	2013-02-04 21:50:21.571064350 +0100
@@ -3231,6 +3231,7 @@
 
   /* Use entire sentences to give the translators a fighting chance.  */
 
+  printf ("\033[0;36m");
   if (makelevel == 0)
     if (starting_directory == 0)
       if (entering)
@@ -3259,6 +3260,7 @@
       else
         printf (_("%s[%u]: Leaving directory `%s'\n"),
                 program, makelevel, starting_directory);
+  printf ("\033[0m");
 
   /* Flush stdout to be sure this comes before any stderr output.  */
   fflush (stdout);
Only in make-3.82: main.c.orig
diff -ur make-3.82.orig/misc.c make-3.82/misc.c
--- make-3.82.orig/misc.c	2010-07-19 09:10:54.000000000 +0200
+++ make-3.82/misc.c	2013-02-04 21:50:21.571064350 +0100
@@ -236,16 +236,18 @@
   if (fmt != 0)
     {
       if (prefix)
-	{
-	  if (makelevel == 0)
-	    printf ("%s: ", program);
-	  else
-	    printf ("%s[%u]: ", program, makelevel);
-	}
+        {
+          if (makelevel == 0)
+            printf ("\033[36m%s: ", program);
+          else
+            printf ("\033[36m%s[%u]: ", program, makelevel);
+        }
+      else
+        printf ("\033[36m");
       VA_START (args, fmt);
       VA_PRINTF (stdout, fmt, args);
       VA_END (args);
-      putchar ('\n');
+      printf ("\n\033[0m");
     }
 
   fflush (stdout);
Only in make-3.82: misc.c.orig
diff -ur make-3.82.orig/remake.c make-3.82/remake.c
--- make-3.82.orig/remake.c	2010-07-13 03:20:42.000000000 +0200
+++ make-3.82/remake.c	2013-02-04 21:50:21.571064350 +0100
@@ -69,6 +69,38 @@
 static FILE_TIMESTAMP name_mtime (const char *name);
 static const char *library_search (const char *lib, FILE_TIMESTAMP *mtime_ptr);
 
+/*
+ * Take string <text> and wrap it by <begin> and <end>
+ * The result is malloc'd  and has to be free'd.
+ */
+static char * colorize(const char * begin, const char * text, const char * end) {
+	const char * const jobs[] = {begin, text, end};
+	const size_t job_count = sizeof(jobs) / sizeof(char *);
+	size_t job_lens[job_count];
+	size_t out_len = 1;
+	int i = 0;
+
+	/* Count */
+	for (; i < job_count; i++) {
+		job_lens[i] = strlen(jobs[i]);
+		out_len += job_lens[i];
+	}
+
+	/* Allocate */
+	char * const out = malloc(out_len);
+	assert(out);
+
+	/* Concat */
+	char * walker = out;
+	for (i = 0; i < job_count; i++) {
+		strcpy(walker, jobs[i]);
+		walker += job_lens[i];
+	}
+	walker[0] = '\0';
+
+	return out;
+}
+
 
 /* Remake all the goals in the `struct dep' chain GOALS.  Return -1 if nothing
    was done, 0 if all goals were updated successfully, or 1 if a goal failed.
@@ -230,11 +262,14 @@
 		  && file->update_status == 0 && !g->changed
 		  /* Never give a message under -s or -q.  */
 		  && !silent_flag && !question_flag)
-		message (1, ((file->phony || file->cmds == 0)
-			     ? _("Nothing to be done for `%s'.")
-			     : _("`%s' is up to date.")),
-			 file->name);
-
+			{
+				const char * const text = ((file->phony || file->cmds == 0)
+							? _("Nothing to be done for `%s'.")
+							: _("`%s' is up to date."));
+				char * const colorized = colorize("\033[36m", text, "\033[0m");
+				message (1, colorized, file->name);
+				free (colorized);
+			}
 	      /* This goal is finished.  Remove it from the chain.  */
 	      if (lastgoal == 0)
 		goals = g->next;
