tools: Added make_makefiles tool that updates the list in configure.ac and runs make_...
[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 dlls/Makefile.in
97
98 my @dll_makefiles = grep /^dlls\//, @makefiles;
99 system "dlls/make_dlls", @dll_makefiles;
100
101
102 ################################################################
103 # update programs/Makefile.in
104
105 my @prog_makefiles = grep /^programs\//, @makefiles;
106 system "programs/make_progs", @prog_makefiles;