gtest: remove recursive make, add python driver + Xcode error hook-up.

This change does the following:
* Removes the gtest/Makefile recursive-make-based calling strategy
  for gtest execution.
* Adds the gtest/do-gtest.py call script.
  - This handles finding and calling the Makefiles that really
    run tests.
  - This script also transforms the test output into something
    that Xcode can place a failure marker on when a test fails.
* Modifies the Xcode external build command target for gtest.
  It now calls the gtest/do-gtest.py script.

There is still room for improvement on Xcode integration of
do-gtest.py.  Essentially the next several lines of error reporting
from the gtest output should be coalesced into a single line so that
Xcode can tell more about the error directly in the editor.  Right now
it just puts a red mark and says "failure" but doesn't give any
details.

llvm-svn: 218470
This commit is contained in:
Todd Fiala 2014-09-25 22:12:33 +00:00
parent 129c44c753
commit f3a3fc5120
4 changed files with 84 additions and 14 deletions

View File

@ -1,5 +0,0 @@
LEVEL := ./make
SUBDIRS := unittest
include $(LEVEL)/Makefile.rules

82
lldb/gtest/do-gtest.py Executable file
View File

@ -0,0 +1,82 @@
#!/usr/bin/env python
from __future__ import print_function
import os
import re
import select
import subprocess
import sys
def find_makefile_dirs():
makefile_dirs = []
for root, dirs, files in os.walk("."):
for file in files:
if file == "Makefile":
makefile_dirs.append(root)
return makefile_dirs
_TESTDIR_RELATIVE_REGEX = re.compile(r"^([^/:]+:\d+:)")
def filter_run_line(sub_expr, line):
return _TESTDIR_RELATIVE_REGEX.sub(sub_expr, line)
def call_make(makefile_dir, extra_args=None):
command = ["make", "-C", makefile_dir]
if extra_args:
command.extend(extra_args)
# Replace the matched no-directory filename with one where the makefile directory is prepended.
sub_expr = makefile_dir + r"/\1";
proc = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
while True:
reads = [proc.stdout.fileno(), proc.stderr.fileno()]
select_result = select.select(reads, [], [])
for fd in select_result[0]:
if fd == proc.stdout.fileno():
line = proc.stdout.readline()
print(filter_run_line(sub_expr, line.rstrip()))
elif fd == proc.stderr.fileno():
line = proc.stderr.readline()
print(filter_run_line(sub_expr, line.rstrip()), file=sys.stderr)
proc_retval = proc.poll()
if proc_retval != None:
# Process stopped. Drain output before finishing up.
# Drain stdout.
while True:
line = proc.stdout.readline()
if line:
print(filter_run_line(sub_expr, line.rstrip()))
else:
break
# Drain stderr.
while True:
line = proc.stderr.readline()
if line:
print(filter_run_line(sub_expr, line.rstrip()), file=sys.stderr)
else:
break
return proc_retval
global_retval = 0
extra_args = None
if len(sys.argv) > 1:
if sys.argv[1] == 'clean':
extra_args = ['clean']
for makefile_dir in find_makefile_dirs():
print("found makefile dir: {}".format(makefile_dir))
retval = call_make(makefile_dir, extra_args)
if retval != 0:
global_retval = retval
sys.exit(global_retval)

View File

@ -67,11 +67,11 @@
/* Begin PBXLegacyTarget section */
23CDD8F319D4790700461DDC /* gtest */ = {
isa = PBXLegacyTarget;
buildArgumentsString = "$(ACTION)";
buildArgumentsString = "do-gtest.py $(ACTION)";
buildConfigurationList = 23CDD8F619D4790700461DDC /* Build configuration list for PBXLegacyTarget "gtest" */;
buildPhases = (
);
buildToolPath = /usr/bin/make;
buildToolPath = /usr/bin/python;
buildWorkingDirectory = .;
dependencies = (
);

View File

@ -1,7 +0,0 @@
LEVEL := ../make
SUBDIRS := Plugins/Process/Linux
$(info in unittest Makefile)
include $(LEVEL)/Makefile.rules