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