make_makefiles: Generate the tests list in programs/winetest/Makefile.in.
[wine] / tools / make_makefiles
1 #!/usr/bin/perl -w
2 #
3 # Build the auto-generated parts of the Wine makefiles.
4 #
5 # Copyright 2006 Alexandre Julliard
6 #
7 # This library is free software; you can redistribute it and/or
8 # modify it under the terms of the GNU Lesser General Public
9 # License as published by the Free Software Foundation; either
10 # version 2.1 of the License, or (at your option) any later version.
11 #
12 # This library is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15 # Lesser General Public License for more details.
16 #
17 # You should have received a copy of the GNU Lesser General Public
18 # License along with this library; if not, write to the Free Software
19 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
20 #
21
22 # update a file if changed
23 sub update_file($)
24 {
25     my $file = shift;
26     my $ret = system "cmp $file $file.new >/dev/null";
27     if (!$ret)
28     {
29         unlink "$file.new";
30         print "$file is unchanged\n";
31     }
32     else
33     {
34         rename "$file.new", "$file";
35         print "$file updated\n";
36     }
37     return $ret;
38 }
39
40 # replace some lines in a file between two markers
41 sub replace_in_file($$$@)
42 {
43     my $file = shift;
44     my $start = shift;
45     my $end = shift;
46
47     open OLD_FILE, "$file" or die "cannot open $file";
48     open NEW_FILE, ">$file.new" or die "cannot create $file.new";
49
50     while (<OLD_FILE>)
51     {
52         last if /$start/;
53         print NEW_FILE $_;
54     }
55
56     print NEW_FILE @_;
57
58     if (defined($end))
59     {
60         my $skip=1;
61         while (<OLD_FILE>)
62         {
63             print NEW_FILE $_ unless $skip;
64             $skip = 0 if /$end/;
65         }
66     }
67
68     close OLD_FILE;
69     close NEW_FILE;
70     return update_file($file);
71 }
72
73 my (@makefiles, @makerules);
74
75 if (-d ".git")
76 {
77     @makefiles = map { s/\.in$//; $_; } split /\s/, `git ls-files -c Makefile.in \\*/Makefile.in`;
78     @makerules = map { s/\.in$//; $_; } split /\s/, `git ls-files -c Make\\*rules.in \\*/Make\\*rules.in`;
79 }
80 else
81 {
82     @makefiles = map { s/^\.\/(.*)\.in/$1/; $_; } split(/\s/,`find . -name Makefile.in -print`);
83     @makerules = map { s/^\.\/(.*)\.in/$1/; $_; } split(/\s/,`find . -name Make\\*.rules.in -print`);
84 }
85
86
87 ################################################################
88 # update the makefile list in configure.ac
89
90 replace_in_file( "configure.ac", '^AC_CONFIG_FILES\(', '\]\)$',
91                  "AC_CONFIG_FILES([\n",
92                  join ("\n", (sort @makerules), (sort @makefiles) ), "])\n" );
93
94
95 ################################################################
96 # update the tests list in programs/winetest/Makefile.in
97
98 my %modules = ( "kernel" => "kernel32", "gdi" => "gdi32", "user" => "user32" );
99 my %tests;
100 my @lines = ( "TESTBINS =" );
101
102 foreach my $file (sort grep /^dlls\/.*\/tests\/Makefile/, @makefiles)
103 {
104     if ($file =~ /^dlls\/(.*)\/tests\/Makefile/)
105     {
106         my $dir = $1;
107         my $mod = $modules{$dir} || $dir;
108         $tests{$mod} = $dir;
109         push @lines, " \\\n\t${mod}_test.exe\$(DLLEXT)";
110     }
111 }
112 push @lines, "\n\n";
113
114 foreach my $test (sort keys %tests)
115 {
116     my $dir = $tests{$test};
117     push @lines, "${test}_test.exe\$(DLLEXT): \$(DLLDIR)/$dir/tests/${test}_test.exe\$(DLLEXT)\n";
118     push @lines, "\tcp \$(DLLDIR)/$dir/tests/${test}_test.exe\$(DLLEXT) \$\@ && \$(STRIP) \$\@\n";
119 }
120 push @lines, "\n# Special rules\n";
121
122 replace_in_file( "programs/winetest/Makefile.in", '^TESTBINS\s*=', '^# Special rules', @lines );
123
124
125 ################################################################
126 # update dlls/Makefile.in
127
128 my @dll_makefiles = grep /^dlls\//, @makefiles;
129 system "dlls/make_dlls", @dll_makefiles;
130
131
132 ################################################################
133 # update programs/Makefile.in
134
135 my @prog_makefiles = grep /^programs\//, @makefiles;
136 system "programs/make_progs", @prog_makefiles;