428
|
1 : #-*- Perl -*-
|
1303
|
2
|
|
3 ### make-src-depend --- update the Makefile dependency information for XEmacs
|
|
4
|
428
|
5 # Copyright (C) 1998 Free Software Foundation, Inc.
|
|
6
|
1303
|
7 ## Author: Martin Buchholz <martin@xemacs.org>
|
|
8 ## Maintainer: XEmacs Development Team
|
|
9
|
|
10 ## This file is part of XEmacs.
|
|
11
|
|
12 ## XEmacs is free software; you can redistribute it and/or modify it
|
|
13 ## under the terms of the GNU General Public License as published by
|
|
14 ## the Free Software Foundation; either version 2, or (at your option)
|
|
15 ## any later version.
|
428
|
16
|
1303
|
17 ## XEmacs is distributed in the hope that it will be useful, but
|
|
18 ## WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
19 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
20 ## General Public License for more details.
|
|
21
|
|
22 ## You should have received a copy of the GNU General Public License
|
|
23 ## along with XEmacs; see the file COPYING. If not, write to the Free
|
|
24 ## Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
25 ## 02111-1307, USA.
|
|
26
|
428
|
27 eval 'exec perl -w -S $0 ${1+"$@"}'
|
|
28 if 0;
|
|
29
|
|
30 use strict;
|
|
31 my ($myName, $srcdir, %exists, %uses, %generated_header);
|
|
32
|
|
33 ($myName = $0) =~ s@.*/@@; my $usage ="
|
|
34 Usage: $myName
|
|
35
|
|
36 Generates Makefile dependencies for the XEmacs src directory.
|
1303
|
37 The dependencies are written to stdout.
|
|
38
|
|
39 If --quick-build, don't include config.h and lisp.h in the dependencies,
|
|
40 for faster rebuilding.
|
|
41 ";
|
428
|
42
|
|
43 die $usage if @ARGV;
|
|
44
|
|
45 ($srcdir = $0) =~ s@[^/]+$@@;
|
|
46 $srcdir = "." if $srcdir eq "";
|
|
47 chdir $srcdir or die "$srcdir: $!";
|
|
48
|
|
49 opendir SRCDIR, "." or die "$srcdir: $!";
|
|
50 for (grep (/\.[ch]$/, readdir (SRCDIR))) { $exists{$_} = 1; }
|
|
51 closedir SRCDIR;
|
|
52
|
|
53 for (qw (config.h sheap-adjust.h paths.h Emacs.ad.h)) {
|
|
54 $generated_header{$_} = 1;
|
|
55 }
|
|
56
|
442
|
57 # Although this is not technically true, it ought to be true,
|
|
58 # and makes the generated Makefile smaller.
|
|
59 $uses{'lisp.h'}{'config.h'} = 1;
|
|
60
|
428
|
61 for my $file (keys %exists) {
|
|
62 open (FILE, $file) or die "$file: $!";
|
|
63 undef $/; $_ = <FILE>;
|
|
64 RemoveComments ($_);
|
|
65 s/[ \t]+//g;
|
|
66 # Find include dependencies
|
|
67 for (/^\#include([^\n]+)/gm) {
|
462
|
68 if (m@^\"([A-Za-z0-9._-]+\.[ch])\"@) {
|
428
|
69 $uses{$file}{$1} = 1 if exists $exists{$1};
|
442
|
70 } elsif (m@<([A-Za-z0-9._-]+\.h)>@) {
|
428
|
71 $uses{$file}{$1} = 1 if exists $generated_header{$1};
|
442
|
72 } elsif (m@\"../lwlib/([A-Za-z0-9._-]+\.h)\"@) {
|
428
|
73 $uses{$file}{"\$(LWLIB_SRCDIR)/lwlib.h"} = 1;
|
|
74 }
|
|
75 }
|
|
76 }
|
|
77
|
|
78 # Make transitive closure of %uses
|
|
79 while (1) {
|
|
80 my $changedP = 0;
|
|
81 for my $x (keys %uses) {
|
|
82 for my $y (keys %{$uses{$x}}) {
|
|
83 for my $z (keys %{$uses{$y}}) {
|
|
84 if (! exists $uses{$x}{$z}) {
|
|
85 $uses{$x}{$z} = 1;
|
|
86 $changedP = 1;
|
|
87 }
|
|
88 }
|
|
89 }
|
|
90 }
|
|
91 last if !$changedP;
|
|
92 }
|
|
93
|
|
94 # Print file header
|
|
95 print
|
442
|
96 "## This file is automatically generated by \`$myName'. Do not modify.
|
428
|
97
|
442
|
98 #if defined(USE_UNION_TYPE)
|
428
|
99 LISP_UNION_H=lisp-union.h
|
|
100 #else
|
|
101 LISP_UNION_H=lisp-disunion.h
|
|
102 #endif
|
|
103 ";
|
|
104
|
452
|
105 my @LISP_H = ('lisp.h', sort keys %{$uses{'lisp.h'}});
|
1303
|
106 print "
|
|
107 #if defined(QUICK_BUILD)
|
|
108 CONFIG_H=
|
|
109 LISP_H=
|
|
110 #else
|
|
111 CONFIG_H=config.h
|
|
112 LISP_H=@{[grep (!/lisp-(dis)?union\.h/, @LISP_H)]} \$(LISP_UNION_H)
|
|
113 #endif
|
|
114
|
|
115 ";
|
428
|
116
|
|
117 sub PrintDeps {
|
|
118 my $file = shift;
|
|
119 my $ofile = $file; $ofile =~ s/c$/o/; print "$ofile: ";
|
|
120 if (exists $uses{$file}{'lisp.h'}) {
|
|
121 delete @{%{$uses{$file}}}{@LISP_H};
|
|
122 $uses{$file}{'$(LISP_H)'} = 1;
|
|
123 }
|
1303
|
124 # Note: If both config.h and lisp.h are dependencies, config.h got deleted
|
|
125 # by the last clause.
|
|
126 if (exists $uses{$file}{'config.h'}) {
|
|
127 delete $uses{$file}{'config.h'};
|
|
128 $uses{$file}{'$(CONFIG_H)'} = 1;
|
|
129 }
|
428
|
130 print "@{[sort keys %{$uses{$file}}]}\n";
|
|
131 }
|
|
132
|
|
133 sub PrintPatternDeps {
|
|
134 my ($pattern, $CPP_SYMBOL) = @_;
|
442
|
135 print "#if defined($CPP_SYMBOL)\n";
|
428
|
136 for my $file (sort grep (/$pattern/ && /\.c$/, keys %uses)) {
|
|
137 PrintDeps($file);
|
|
138 delete $uses{$file};
|
|
139 }
|
|
140 print "#endif\n";
|
|
141 }
|
|
142
|
442
|
143 PrintPatternDeps ('-msw\\.', "HAVE_MS_WINDOWS");
|
1303
|
144 PrintPatternDeps ('-xlike', "HAVE_XLIKE");
|
|
145 # X-specific files: *-x.c *-x-impl.h xgccache.c balloon_help.c x*.h Emacs*.[ch]
|
|
146 PrintPatternDeps ('-x\\.|xgccache|balloon_help|^Emacs', "HAVE_X_WINDOWS");
|
442
|
147 PrintPatternDeps ('-tty\\.', "HAVE_TTY");
|
1303
|
148 # GTK-specific files: *-gtk.[ch] *-gtk-*.[ch] gtk-*.[ch] emacs-marshals.c emacs-widget-accessors.c glade.c ui-byhand.c
|
|
149 PrintPatternDeps ('gtk|emacs-marshals|emacs-widget-accessors|glade|ui-byhand', "HAVE_GTK");
|
442
|
150 PrintPatternDeps ('^database', "HAVE_DATABASE");
|
|
151 PrintPatternDeps ('^mule', "MULE");
|
428
|
152 PrintPatternDeps ('^(?:External|extw-)', "EXTERNAL_WIDGET");
|
|
153
|
|
154 for my $file (sort grep (/\.c$/, keys %uses)) { PrintDeps($file); }
|
|
155
|
442
|
156 # Surprisingly robust regexp to remove comments from arbitrary C code
|
428
|
157 sub RemoveComments {
|
|
158 $_[0] =~
|
|
159 s{ (
|
|
160 [^\"\'/]+ |
|
|
161 (?:\"[^\"\\]*(?:\\.[^\"\\]*)*\" [^\"\'/]*)+ |
|
|
162 (?:\'[^\'\\]*(?:\\.[^\'\\]*)*\' [^\"\'/]*)+
|
|
163 )
|
|
164 | / (?:
|
|
165 \*[^*]*\*+(?:[^/*][^*]*\*+)*/
|
|
166 |
|
|
167 /[^\n]*
|
|
168 )
|
|
169 }{defined $1 ? $1 : ""}gsxeo;
|
|
170 }
|