1#!/usr/bin/perl
2
3use strict;
4use Data::Dumper;
5use File::Find;
6use Cwd qw(realpath);
7
8my @args = @ARGV;
9
10my $makefiles =
11{
12    'makefile' => undef,
13    'Makefile' => undef,
14};
15
16my $find_opts =
17{
18    'wanted' => \&find_callback,
19};
20
21my $keywords =
22{
23    'root'   => '',
24    'cwd'    => '',
25    'cmd'    => '',
26    'exit'   => '',
27    'stdout' => [],
28    'stderr' => [],
29};
30
31my $keyword;
32my $max_keyword_len = 0;
33foreach $keyword (keys %$keywords)
34{ if($max_keyword_len < length($keyword)) { $max_keyword_len = length($keyword); } }
35my $delim = ':';
36$max_keyword_len += length($delim) + length(' ');
37
38my $last_keyword = '';
39
40sub print_line
41{
42    my ($keyword, $val) = @_;
43
44    if(!exists($$keywords{$keyword}))
45    {
46	print STDERR "error: keyword $keyword not in \$keywords set\n";
47	exit(1);
48    }
49
50    my $keyword_len = 0;
51
52    if($keyword ne $last_keyword)
53    {
54	print("$keyword"); print($delim);
55	$keyword_len = length($keyword) + length($delim);
56    }
57    if($max_keyword_len > $keyword_len)
58    {
59	my $num_spaces = $max_keyword_len - $keyword_len;
60	print(' ' x $num_spaces);
61    }
62    print("$val");
63    if(0)
64    {
65	$last_keyword = $keyword;
66    }
67}
68
69my $root = '.';
70$root = &realpath($root);
71print_line("root", "$root\n");
72
73find($find_opts, $root);
74
75sub find_callback
76{
77    if(exists($$makefiles{$_}))
78    {
79	my $makefile = $_;
80	my $reldir = $File::Find::dir;
81	$reldir =~ s|^$root/||;
82
83	&print_line("cwd", "\$root/$reldir\n");
84	my $cmd = [ "make" ];
85
86	my $arg; foreach $arg (@ARGV) { push @$cmd, $arg; } # better way to do this?
87	&print_line("cmd", "@$cmd\n");
88
89        open(SAVEOUT, ">&STDOUT") || die("$!");
90        open(SAVEERR, ">&STDERR") || die("$!");
91	open(STDOUT, ">/tmp/unit-tests-stdout") || die("$!");
92	open(STDERR, ">/tmp/unit-tests-stderr") || die("$!");
93
94	$ENV{UNIT_TEST_NAME} = $reldir;
95	my $exit = system(@$cmd);
96
97	close(STDOUT) || die("$!");
98	close(STDERR) || die("$!");
99        open(STDOUT, ">&SAVEOUT") || die("$!");
100        open(STDERR, ">&SAVEERR") || die("$!");
101
102	&print_line("exit", "$exit\n");
103
104	open(OUT, "</tmp/unit-tests-stdout") || die("$!");
105	while(<OUT>)
106	{
107	    &print_line("stdout", "$_");
108	}
109	close(OUT) || die("$!");
110	unlink("/tmp/unit-tests-stdout");
111
112	open(ERR, "</tmp/unit-tests-stderr") || die("$!");
113	while(<ERR>)
114	{
115	    &print_line("stderr", "$_");
116	}
117	close(ERR) || die("$!");
118    }
119	unlink("/tmp/unit-tests-stderr");
120}
121