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