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 ";
|
428
|
39
|
|
40 die $usage if @ARGV;
|
|
41
|
|
42 ($srcdir = $0) =~ s@[^/]+$@@;
|
|
43 $srcdir = "." if $srcdir eq "";
|
|
44 chdir $srcdir or die "$srcdir: $!";
|
|
45
|
|
46 opendir SRCDIR, "." or die "$srcdir: $!";
|
|
47 for (grep (/\.[ch]$/, readdir (SRCDIR))) { $exists{$_} = 1; }
|
|
48 closedir SRCDIR;
|
|
49
|
|
50 for (qw (config.h sheap-adjust.h paths.h Emacs.ad.h)) {
|
|
51 $generated_header{$_} = 1;
|
|
52 }
|
|
53
|
442
|
54 # Although this is not technically true, it ought to be true,
|
|
55 # and makes the generated Makefile smaller.
|
|
56 $uses{'lisp.h'}{'config.h'} = 1;
|
|
57
|
428
|
58 for my $file (keys %exists) {
|
|
59 open (FILE, $file) or die "$file: $!";
|
|
60 undef $/; $_ = <FILE>;
|
|
61 RemoveComments ($_);
|
|
62 s/[ \t]+//g;
|
|
63 # Find include dependencies
|
|
64 for (/^\#include([^\n]+)/gm) {
|
462
|
65 if (m@^\"([A-Za-z0-9._-]+\.[ch])\"@) {
|
428
|
66 $uses{$file}{$1} = 1 if exists $exists{$1};
|
442
|
67 } elsif (m@<([A-Za-z0-9._-]+\.h)>@) {
|
428
|
68 $uses{$file}{$1} = 1 if exists $generated_header{$1};
|
442
|
69 } elsif (m@\"../lwlib/([A-Za-z0-9._-]+\.h)\"@) {
|
428
|
70 $uses{$file}{"\$(LWLIB_SRCDIR)/lwlib.h"} = 1;
|
|
71 }
|
|
72 }
|
|
73 }
|
|
74
|
|
75 # Make transitive closure of %uses
|
|
76 while (1) {
|
|
77 my $changedP = 0;
|
|
78 for my $x (keys %uses) {
|
|
79 for my $y (keys %{$uses{$x}}) {
|
|
80 for my $z (keys %{$uses{$y}}) {
|
|
81 if (! exists $uses{$x}{$z}) {
|
|
82 $uses{$x}{$z} = 1;
|
|
83 $changedP = 1;
|
|
84 }
|
|
85 }
|
|
86 }
|
|
87 }
|
|
88 last if !$changedP;
|
|
89 }
|
|
90
|
|
91 # Print file header
|
|
92 print
|
442
|
93 "## This file is automatically generated by \`$myName'. Do not modify.
|
428
|
94
|
442
|
95 #if defined(USE_UNION_TYPE)
|
428
|
96 LISP_UNION_H=lisp-union.h
|
|
97 #else
|
|
98 LISP_UNION_H=lisp-disunion.h
|
|
99 #endif
|
|
100 ";
|
|
101
|
452
|
102 my @LISP_H = ('lisp.h', sort keys %{$uses{'lisp.h'}});
|
1303
|
103 print "
|
|
104 #if defined(QUICK_BUILD)
|
|
105 CONFIG_H=
|
|
106 LISP_H=
|
|
107 #else
|
|
108 CONFIG_H=config.h
|
|
109 LISP_H=@{[grep (!/lisp-(dis)?union\.h/, @LISP_H)]} \$(LISP_UNION_H)
|
|
110 #endif
|
|
111
|
|
112 ";
|
428
|
113
|
|
114 sub PrintDeps {
|
|
115 my $file = shift;
|
|
116 my $ofile = $file; $ofile =~ s/c$/o/; print "$ofile: ";
|
|
117 if (exists $uses{$file}{'lisp.h'}) {
|
4411
|
118 delete $uses{$file}{@LISP_H};
|
428
|
119 $uses{$file}{'$(LISP_H)'} = 1;
|
|
120 }
|
1303
|
121 # Note: If both config.h and lisp.h are dependencies, config.h got deleted
|
|
122 # by the last clause.
|
|
123 if (exists $uses{$file}{'config.h'}) {
|
|
124 delete $uses{$file}{'config.h'};
|
|
125 $uses{$file}{'$(CONFIG_H)'} = 1;
|
|
126 }
|
1333
|
127 # Huge hack. With QUICK_BUILD, general.c has no dependence on
|
|
128 # general-slots.h but really should.
|
|
129 $uses{$file}{'general-slots.h'} = 1 if $file eq "general.c";
|
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 }
|