Index: src/tests/.expect/castError.txt
===================================================================
--- src/tests/.expect/castError.txt	(revision b3d70eba692f70343957b265f1ac7c17022df555)
+++ src/tests/.expect/castError.txt	(revision 4e9151ff076f6501d1de51d75d927d16988d1197)
@@ -39,3 +39,2 @@
 
 
-make: *** [castError] Error 1
Index: src/tests/.expect/completeTypeError.txt
===================================================================
--- src/tests/.expect/completeTypeError.txt	(revision b3d70eba692f70343957b265f1ac7c17022df555)
+++ src/tests/.expect/completeTypeError.txt	(revision 4e9151ff076f6501d1de51d75d927d16988d1197)
@@ -41,3 +41,2 @@
 
 
-make: *** [completeTypeError] Error 1
Index: src/tests/.expect/constant0-1DP.txt
===================================================================
--- src/tests/.expect/constant0-1DP.txt	(revision b3d70eba692f70343957b265f1ac7c17022df555)
+++ src/tests/.expect/constant0-1DP.txt	(revision 4e9151ff076f6501d1de51d75d927d16988d1197)
@@ -31,3 +31,2 @@
 constant0-1.c:50 error: duplicate object definition for x: const pointer to pointer to signed int
 constant0-1.c:50 error: duplicate object definition for 0: pointer to pointer to signed int
-make: *** [constant0-1DP] Error 1
Index: src/tests/.expect/constant0-1NDDP.txt
===================================================================
--- src/tests/.expect/constant0-1NDDP.txt	(revision b3d70eba692f70343957b265f1ac7c17022df555)
+++ src/tests/.expect/constant0-1NDDP.txt	(revision 4e9151ff076f6501d1de51d75d927d16988d1197)
@@ -15,3 +15,2 @@
 constant0-1.c:67 error: duplicate object definition for x: const pointer to signed int
 constant0-1.c:67 error: duplicate object definition for 0: const pointer to signed int
-make: *** [constant0-1NDDP] Error 1
Index: src/tests/.expect/declarationErrors.txt
===================================================================
--- src/tests/.expect/declarationErrors.txt	(revision b3d70eba692f70343957b265f1ac7c17022df555)
+++ src/tests/.expect/declarationErrors.txt	(revision 4e9151ff076f6501d1de51d75d927d16988d1197)
@@ -67,3 +67,2 @@
 
 
-make: *** [declarationErrors] Error 1
Index: src/tests/.expect/dtor-early-exit-ERR1.txt
===================================================================
--- src/tests/.expect/dtor-early-exit-ERR1.txt	(revision b3d70eba692f70343957b265f1ac7c17022df555)
+++ src/tests/.expect/dtor-early-exit-ERR1.txt	(revision 4e9151ff076f6501d1de51d75d927d16988d1197)
@@ -1,3 +1,1 @@
 dtor-early-exit.c:142 error: jump to label 'L1' crosses initialization of y Branch (Goto)
-
-make: *** [dtor-early-exit-ERR1] Error 1
Index: src/tests/.expect/dtor-early-exit-ERR2.txt
===================================================================
--- src/tests/.expect/dtor-early-exit-ERR2.txt	(revision b3d70eba692f70343957b265f1ac7c17022df555)
+++ src/tests/.expect/dtor-early-exit-ERR2.txt	(revision 4e9151ff076f6501d1de51d75d927d16988d1197)
@@ -1,3 +1,1 @@
 dtor-early-exit.c:142 error: jump to label 'L2' crosses initialization of y Branch (Goto)
-
-make: *** [dtor-early-exit-ERR2] Error 1
Index: src/tests/.expect/memberCtors-ERR1.txt
===================================================================
--- src/tests/.expect/memberCtors-ERR1.txt	(revision b3d70eba692f70343957b265f1ac7c17022df555)
+++ src/tests/.expect/memberCtors-ERR1.txt	(revision 4e9151ff076f6501d1de51d75d927d16988d1197)
@@ -1,2 +1,1 @@
 memberCtors.c:62 error: in void ?{}(B *b), field a2 used before being constructed
-make: *** [memberCtors-ERR1] Error 1
Index: src/tests/.expect/scopeErrors.txt
===================================================================
--- src/tests/.expect/scopeErrors.txt	(revision b3d70eba692f70343957b265f1ac7c17022df555)
+++ src/tests/.expect/scopeErrors.txt	(revision 4e9151ff076f6501d1de51d75d927d16988d1197)
@@ -7,4 +7,2 @@
   with body 
     CompoundStmt
-
-make: *** [scopeErrors] Error 1
Index: src/tests/.gitignore
===================================================================
--- src/tests/.gitignore	(revision b3d70eba692f70343957b265f1ac7c17022df555)
+++ src/tests/.gitignore	(revision 4e9151ff076f6501d1de51d75d927d16988d1197)
@@ -1,1 +1,2 @@
 .out/
+.err/
Index: src/tests/Makefile.am
===================================================================
--- src/tests/Makefile.am	(revision b3d70eba692f70343957b265f1ac7c17022df555)
+++ src/tests/Makefile.am	(revision 4e9151ff076f6501d1de51d75d927d16988d1197)
@@ -29,5 +29,5 @@
 # applies to both programs
 EXTRA_FLAGS =
-CFLAGS = -g -Wall -Wno-unused-function @CFA_FLAGS@ ${EXTRA_FLAGS}
+CFLAGS = 2> .err/${@}.log -g -Wall -Wno-unused-function @CFA_FLAGS@ ${EXTRA_FLAGS}
 CC = @CFA_BINDIR@/@CFA_NAME@
 
Index: src/tests/Makefile.in
===================================================================
--- src/tests/Makefile.in	(revision b3d70eba692f70343957b265f1ac7c17022df555)
+++ src/tests/Makefile.in	(revision 4e9151ff076f6501d1de51d75d927d16988d1197)
@@ -125,5 +125,5 @@
 CFA_NAME = @CFA_NAME@
 CFA_PREFIX = @CFA_PREFIX@
-CFLAGS = -g -Wall -Wno-unused-function @CFA_FLAGS@ ${EXTRA_FLAGS}
+CFLAGS = 2> .err/${@}.log -g -Wall -Wno-unused-function @CFA_FLAGS@ ${EXTRA_FLAGS}
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
Index: src/tests/test.py
===================================================================
--- src/tests/test.py	(revision b3d70eba692f70343957b265f1ac7c17022df555)
+++ src/tests/test.py	(revision 4e9151ff076f6501d1de51d75d927d16988d1197)
@@ -13,4 +13,5 @@
 import stat
 import sys
+import multiprocessing
 
 ################################################################################
@@ -115,4 +116,5 @@
 	# find the output file based on the test name and options flag
 	out_file = (".out/%s.log" % test.name) if not generate else (".expect/%s.txt" % test.path)
+	err_file = ".err/%s.log" % test.name
 
 	# remove any outputs from the previous tests to prevent side effects
@@ -137,9 +139,13 @@
 			sh("cat %s > %s" % (test.name, out_file), dry_run)
 
+	else :
+		# command failed save the log to less temporary file
+		sh("mv %s %s" % (err_file, out_file), dry_run)
+
 	retcode = 0
 	error = None
 
-	# fix output to prevent make depth to cause issues
-	fix_MakeLevel(out_file)
+	# # fix output to prevent make depth to cause issues
+	# fix_MakeLevel(out_file)
 
 	if generate :
@@ -152,5 +158,7 @@
 	else :
 		# diff the output of the files
-		diff_cmd = ("diff --old-group-format='\t\tmissing lines :\n"
+		diff_cmd = ("diff --ignore-all-space "
+					"--ignore-blank-lines "
+					"--old-group-format='\t\tmissing lines :\n"
 					"%%<' \\\n"
 					"--new-group-format='\t\tnew lines :\n"
@@ -212,5 +220,5 @@
 
 	#make sure the required folder are present
-	sh('mkdir -p .out .expect', dry_run)
+	sh('mkdir -p .out .expect .err', dry_run)
 
 	if generate :
@@ -309,9 +317,11 @@
 # check if the user already passed in a number of jobs for multi-threading
 make_flags = environ.get('MAKEFLAGS')
-make_jobs_fds = re.search("--jobserver-fds=\s*([0-9]+),([0-9]+)", make_flags) if make_flags else None
+make_jobs_fds = re.search("--jobserver-(auth|fds)=\s*([0-9]+),([0-9]+)", make_flags) if make_flags else None
 if make_jobs_fds :
-	tokens = os.read(int(make_jobs_fds.group(1)), 1024)
+	tokens = os.read(int(make_jobs_fds.group(2)), 1024)
 	options.jobs = len(tokens)
-	os.write(int(make_jobs_fds.group(2)), tokens)
+	os.write(int(make_jobs_fds.group(3)), tokens)
+else :
+	options.jobs = multiprocessing.cpu_count()
 
 # make sure we have a valid number of jobs that corresponds to user input
@@ -320,4 +330,6 @@
 	sys.exit(1)
 
+options.jobs = min( options.jobs, len(tests) )
+
 print('Running (%s) on %i cores' % ("debug" if options.debug else "no debug", options.jobs))
 make_cmd = "make" if make_flags else ("make -j%i" % options.jobs)
